<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

 <title>beatltetech.com</title>
 <link href="http://beatletech.com/atom.xml" rel="self"/>
 <link href="http://beatletech.com/"/>
 <updated>2026-02-16T21:07:44+01:00</updated>
 <id>http://beatletech.com/</id>
 <author>
   <name>Coen Stevens</name>
 </author>

 
 <entry>
   <title>BeatleTech is now stevens.dev</title>
   <link href="http://beatletech.com/2026/02/16/beatletech-is-now-stevens-dev"/>
   <updated>2026-02-16T00:00:00+01:00</updated>
   <id>http://beatletech.com/2026/02/16/beatletech-is-now-stevens-dev</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;https://beatletech.com/images/stevens-dev-screenshot.webp&quot; alt=&quot;stevens.dev&quot; width=&quot;90%&quot; title=&quot;stevens.dev&quot; style=&quot;margin-left:20px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;After 15 years, &lt;strong&gt;BeatleTech&lt;/strong&gt; has a new home: &lt;a href=&quot;https://stevens.dev&quot;&gt;&lt;strong&gt;stevens.dev&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What started as a simple blog in &lt;a href=&quot;/2010/12/19/beatletech-online&quot;&gt;December 2010&lt;/a&gt; has now grown into something that better reflects where I am today. The old Jekyll site served me well, but it was time for a fresh start with a modern stack and a cleaner identity.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;why-the-move&quot;&gt;Why the move?&lt;/h2&gt;

&lt;p&gt;I wanted a site that feels modern and fast. The old site was showing its age, and I had been itching to rebuild from scratch using a stack I actually enjoy working with day-to-day. I also like to use my actual (family) name instead of BeatleTech, which was more related to a nickname I received as a kid.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;the-new-stack&quot;&gt;The new stack&lt;/h2&gt;

&lt;p&gt;The new site is built with &lt;strong&gt;Next.js&lt;/strong&gt;, giving it a modern, responsive feel with fast page loads and smooth transitions. The dark design with the swirling generative background felt like the right aesthetic for a Fractional CTO &amp;amp; AI Engineer in 2026.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;hosted-entirely-in-europe&quot;&gt;Hosted entirely in Europe&lt;/h2&gt;

&lt;p&gt;One thing I care about is keeping things close to home. The entire setup runs in Europe:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Hosting&lt;/strong&gt;: Deployed to a &lt;strong&gt;Hetzner VM in Germany&lt;/strong&gt;: Reliable, fast, and no data leaving the continent&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Domain&lt;/strong&gt;: Registered at a &lt;strong&gt;Dutch registrar&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Email&lt;/strong&gt;: &lt;strong&gt;coen@stevens.dev&lt;/strong&gt; via &lt;strong&gt;ProtonMail&lt;/strong&gt; (Switzerland)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No US cloud dependencies for the personal site. It felt right to keep it all on this side of the Atlantic.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;built-on-a-sunday-afternoon&quot;&gt;Built on a Sunday afternoon&lt;/h2&gt;

&lt;p&gt;The best part? I built this together with my oldest son on a &lt;strong&gt;Sunday afternoon&lt;/strong&gt;, which turned into a Sunday evening, which turned into a Sunday late-night session. Crazy what you can now build in a single day when you work together with Claude Code (and yes, it is just a static landing page, but still).&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;what-happens-to-beatletech&quot;&gt;What happens to BeatleTech?&lt;/h2&gt;

&lt;p&gt;BeatleTech isn’t going away entirely. This site will stay online as an archive, and you can see the banner at the top pointing you to &lt;a href=&quot;https://stevens.dev&quot;&gt;stevens.dev&lt;/a&gt;. All the old blog posts and content remain here. But all new content and updates will live at the new address.&lt;/p&gt;

&lt;p&gt;If you want to get in touch, reach me at &lt;strong&gt;coen@stevens.dev&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;See you at &lt;a href=&quot;https://stevens.dev&quot;&gt;stevens.dev&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Fractional CTO vs. Technical Advisor vs. Interim CTO: What’s the Difference?</title>
   <link href="http://beatletech.com/2025/03/09/fractional-vs-advisor-vs-interim-cto"/>
   <updated>2025-03-09T00:00:00+01:00</updated>
   <id>http://beatletech.com/2025/03/09/fractional-vs-advisor-vs-interim-cto</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;https://s3.eu-west-1.amazonaws.com/eu-west-1.beatletech.com/images/animals-cto-min.png&quot; alt=&quot;CTO Animals&quot; width=&quot;90%&quot; title=&quot;CTO Animals&quot; style=&quot;margin-left:20px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Startups and scaleups often reach a point where they need &lt;strong&gt;technical leadership&lt;/strong&gt;, but hiring a full-time CTO may not be feasible or necessary. This is where &lt;strong&gt;Fractional CTOs, Technical Advisors, and Interim CTOs&lt;/strong&gt; come in. Each role serves a different purpose, and understanding their distinctions is key to choosing the right fit for your business.&lt;/p&gt;

&lt;p&gt;I offer &lt;strong&gt;all three services&lt;/strong&gt;, adapting my level of involvement based on what a company needs. Whether you require a &lt;strong&gt;fractional CTO with optional hands-on involvement&lt;/strong&gt;, a &lt;strong&gt;technical advisor for strategic guidance&lt;/strong&gt;, or an &lt;strong&gt;interim CTO to bridge leadership gaps&lt;/strong&gt;, I provide tailored solutions to ensure your startup or scale-up scales effectively.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;1-fractional-cto&quot;&gt;&lt;strong&gt;1. Fractional CTO&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Fractional CTO&lt;/strong&gt; is a &lt;strong&gt;part-time technology leader&lt;/strong&gt; who provides &lt;strong&gt;strategic and technical direction&lt;/strong&gt; without the cost of a full-time executive. Unlike traditional CTOs who focus solely on strategy, I offer &lt;strong&gt;hands-on execution when needed&lt;/strong&gt;—whether it’s &lt;strong&gt;reviewing architecture, mentoring engineers, or contributing to product development&lt;/strong&gt;.&lt;/p&gt;

&lt;h3 id=&quot;key-responsibilities&quot;&gt;&lt;strong&gt;Key Responsibilities:&lt;/strong&gt;&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Technology Strategy &amp;amp; Roadmap&lt;/strong&gt; – Aligning engineering efforts with business goals&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Hands-On Involvement (Optional)&lt;/strong&gt; – Jumping into architecture, debugging, or prototyping&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Scaling Engineering Teams&lt;/strong&gt; – Hiring, mentoring, and optimizing team structure&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Fundraising Support&lt;/strong&gt; – Assisting with technical due diligence and investor pitches&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;AI/ML &amp;amp; Product Development&lt;/strong&gt; – Bridging the gap between R&amp;amp;D and scalable AI solutions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;best-for&quot;&gt;&lt;strong&gt;Best For:&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;✅ &lt;strong&gt;Startups needing ongoing technical leadership but not a full-time CTO&lt;/strong&gt;&lt;br /&gt;
✅ &lt;strong&gt;Companies transitioning from MVP to a scalable architecture&lt;/strong&gt;&lt;br /&gt;
✅ &lt;strong&gt;AI and data-driven startups requiring strategic guidance AND occasional hands-on execution&lt;/strong&gt;&lt;br /&gt;
✅ &lt;strong&gt;Founders who need a fractional leader who can adapt to their needs&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3 id=&quot;pros--cons-of-hiring-a-fractional-cto&quot;&gt;&lt;strong&gt;Pros &amp;amp; Cons of Hiring a Fractional CTO:&lt;/strong&gt;&lt;br /&gt;&lt;/h3&gt;

&lt;p&gt;✅ &lt;strong&gt;Flexible engagement&lt;/strong&gt; – Available part-time, scaling as needed&lt;br /&gt;
✅ &lt;strong&gt;Cost-effective&lt;/strong&gt; – Senior leadership without full-time overhead&lt;br /&gt;
✅ &lt;strong&gt;Hands-on support (if required)&lt;/strong&gt; – Can step in for technical execution&lt;br /&gt;
❌ &lt;strong&gt;Not a full-time executive&lt;/strong&gt; – If your team needs daily oversight, an interim CTO may be better&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;2-technical-advisor&quot;&gt;&lt;strong&gt;2. Technical Advisor&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Technical Advisor&lt;/strong&gt; offers &lt;strong&gt;high-level strategic guidance&lt;/strong&gt; without being directly involved in execution. This role is ideal for &lt;strong&gt;founders, CEOs, and CTOs&lt;/strong&gt; who need expert insights but do not require ongoing operational leadership.&lt;/p&gt;

&lt;h3 id=&quot;key-responsibilities-1&quot;&gt;&lt;strong&gt;Key Responsibilities:&lt;/strong&gt;&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Advising on technical strategy, architecture, and product direction&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Providing feedback on technology roadmaps and scalability&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Supporting fundraising efforts by helping with technical due diligence&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Connecting founders with relevant industry experts&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Guiding hiring decisions for technical teams&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;best-for-1&quot;&gt;&lt;strong&gt;Best For:&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;✅ &lt;strong&gt;Startups that already have a CTO but need an external expert&lt;/strong&gt;&lt;br /&gt;
✅ &lt;strong&gt;Companies looking for occasional tech guidance without operational involvement&lt;/strong&gt;&lt;br /&gt;
✅ &lt;strong&gt;Founders needing help navigating AI, data, or cloud strategy&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3 id=&quot;pros--cons-of-hiring-a-technical-advisor&quot;&gt;&lt;strong&gt;Pros &amp;amp; Cons of Hiring a Technical Advisor:&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;✅ &lt;strong&gt;Low-cost, low-commitment&lt;/strong&gt; – A few hours per month can be highly valuable&lt;br /&gt;
✅ &lt;strong&gt;Brings deep expertise&lt;/strong&gt; without being involved in daily operations&lt;br /&gt;
✅ &lt;strong&gt;Improves investor confidence&lt;/strong&gt; through strategic insights&lt;br /&gt;
❌ &lt;strong&gt;Not involved in execution&lt;/strong&gt; – No direct team leadership or hands-on coding&lt;br /&gt;
❌ &lt;strong&gt;Limited engagement&lt;/strong&gt; – If you need hands-on support, a Fractional CTO may be a better fit&lt;br /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;3-interim-cto-full-time-short-term-leadership&quot;&gt;&lt;strong&gt;3. Interim CTO (Full-Time, Short-Term Leadership)&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;An &lt;strong&gt;Interim CTO&lt;/strong&gt; is a &lt;strong&gt;temporary full-time executive&lt;/strong&gt; brought in to lead a company during a transition—whether due to rapid growth, restructuring, or a departing CTO. Unlike a fractional CTO, an interim CTO is &lt;strong&gt;fully dedicated&lt;/strong&gt; to one company for a defined period (typically &lt;strong&gt;3-12 months&lt;/strong&gt;).&lt;/p&gt;

&lt;h3 id=&quot;key-responsibilities-2&quot;&gt;&lt;strong&gt;Key Responsibilities:&lt;/strong&gt;&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Full-time leadership of engineering and tech teams&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Stabilizing and scaling technical infrastructure&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Hiring and onboarding a permanent CTO&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Leading major technical transitions&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Driving high-stakes projects, fundraising, and product scaling&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;best-for-2&quot;&gt;&lt;strong&gt;Best For:&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;✅ &lt;strong&gt;Startups that suddenly lost their CTO and need leadership ASAP&lt;/strong&gt;&lt;br /&gt;
✅ &lt;strong&gt;Companies undergoing rapid scaling that need full-time executive focus&lt;/strong&gt;&lt;br /&gt;
✅ &lt;strong&gt;Businesses preparing for acquisition, funding rounds, or IPOs&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3 id=&quot;pros--cons-of-hiring-an-interim-cto&quot;&gt;&lt;strong&gt;Pros &amp;amp; Cons of Hiring an Interim CTO:&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;✅ &lt;strong&gt;Provides immediate leadership stability&lt;/strong&gt;&lt;br /&gt;
✅ &lt;strong&gt;Ensures continuity in technical execution and strategic direction&lt;/strong&gt;&lt;br /&gt;
✅ &lt;strong&gt;Can help recruit and onboard a permanent CTO&lt;/strong&gt;&lt;br /&gt;
❌ &lt;strong&gt;Expensive&lt;/strong&gt; – Full-time commitment means higher costs&lt;br /&gt;
❌ &lt;strong&gt;Not a long-term solution&lt;/strong&gt; – Eventually needs a permanent replacement&lt;br /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;which-one-is-right-for-your-startup&quot;&gt;&lt;strong&gt;Which One is Right for Your Startup?&lt;/strong&gt;&lt;/h2&gt;

&lt;table class=&quot;styled-table&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;&lt;strong&gt;Feature&lt;/strong&gt;&lt;/th&gt;
      &lt;th&gt;&lt;strong&gt;Fractional CTO&lt;/strong&gt;&lt;/th&gt;
      &lt;th&gt;&lt;strong&gt;Technical Advisor&lt;/strong&gt;&lt;/th&gt;
      &lt;th&gt;&lt;strong&gt;Interim CTO&lt;/strong&gt;&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Time Commitment&lt;/td&gt;
      &lt;td&gt;Part-time (2-3 days/week)&lt;/td&gt;
      &lt;td&gt;Occasional (few hours/month)&lt;/td&gt;
      &lt;td&gt;Full-time (3-18 months)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Level of Involvement&lt;/td&gt;
      &lt;td&gt;High (Strategy + Optional Hands-On)&lt;/td&gt;
      &lt;td&gt;Low (Advisory only)&lt;/td&gt;
      &lt;td&gt;Very High (Operational leadership)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Works with Teams?&lt;/td&gt;
      &lt;td&gt;✅ Yes&lt;/td&gt;
      &lt;td&gt;❌ No&lt;/td&gt;
      &lt;td&gt;✅ Yes&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Hands-on with Tech?&lt;/td&gt;
      &lt;td&gt;✅ Yes (When Needed)&lt;/td&gt;
      &lt;td&gt;❌ No&lt;/td&gt;
      &lt;td&gt;✅ Yes&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Helps with Fundraising?&lt;/td&gt;
      &lt;td&gt;✅ Yes&lt;/td&gt;
      &lt;td&gt;✅ Yes&lt;/td&gt;
      &lt;td&gt;✅ Yes&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Best for&lt;/td&gt;
      &lt;td&gt;Scaling startups needing strategy &amp;amp; execution support&lt;/td&gt;
      &lt;td&gt;Founders needing expert advice&lt;/td&gt;
      &lt;td&gt;Startups in transition&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;final-thoughts&quot;&gt;&lt;strong&gt;Final Thoughts&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;If your startup needs &lt;strong&gt;ongoing technical leadership with optional hands-on execution&lt;/strong&gt;, a &lt;strong&gt;Fractional CTO&lt;/strong&gt; is a great fit. If you only need &lt;strong&gt;occasional guidance&lt;/strong&gt;, a &lt;strong&gt;Technical Advisor&lt;/strong&gt; is a cost-effective choice. If you’re experiencing &lt;strong&gt;a major transition or leadership gap&lt;/strong&gt;, an &lt;strong&gt;Interim CTO&lt;/strong&gt; provides full-time technical stability.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;how-i-can-help&quot;&gt;&lt;strong&gt;How I Can Help&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;I specialize in &lt;strong&gt;Fractional CTO, Technical Advisory, and Interim CTO services&lt;/strong&gt;, providing startups with the right level of technical leadership based on their needs. Whether you need &lt;strong&gt;ongoing strategic guidance, hands-on technical execution, or a full-time CTO for a transition period&lt;/strong&gt;, I can help scale your engineering and AI capabilities efficiently.&lt;/p&gt;

&lt;p&gt;Let’s discuss how I can support your company’s growth with the right leadership approach. 🚀&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Morning Routine</title>
   <link href="http://beatletech.com/2024/01/25/morning-routine"/>
   <updated>2024-01-25T00:00:00+01:00</updated>
   <id>http://beatletech.com/2024/01/25/morning-routine</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;https://s3.eu-west-1.amazonaws.com/eu-west-1.beatletech.com/images/cold-shower.png&quot; alt=&quot;Cold shower&quot; width=&quot;80%&quot; title=&quot;Cold Shower&quot; style=&quot;margin-left:50px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If you have been like me, working until late in the evening or even pushing it into the night, and want to get back to a schedule that is more in line with the people around you or just for the sake of your health? Then I have the following morning routine for you, which worked out great for me. This routine really helps me to get very productive and energized during the entire day.&lt;/p&gt;

&lt;h3 id=&quot;waking-up-alarm-at-715-am&quot;&gt;Waking Up: Alarm at 7:15 AM&lt;/h3&gt;

&lt;p&gt;Every day, including the weekends, set your alarm at the same time. For me 7:15 AM is ideal, as it gives me time to do my cardio exercises and spend time with my kids before they go to school (at 8:15 AM)&lt;/p&gt;

&lt;p&gt;Knowing your alarm will always go off at 7:15 AM is a good trigger to go to bed on time. I also set an alarm in the evening at 11 PM to make sure I can get enough sleep (7-8 hours). In case you weren’t already aware, but getting enough sleep is crucial for our wellbeing. (Check out &lt;a href=&quot;https://www.goodreads.com/book/show/34466963-why-we-sleep&quot;&gt;Why we Sleep?&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;I know there are plenty of people that have to wake up even earlier everyday, and they don’t get enough praise. Not sure if I’m simply not a morning person, but I found it quite challenging to get up early, especially when I don’t really have to (e.g. on Sundays).&lt;/p&gt;

&lt;p&gt;When the alarm goes off, get out, don’t snooze, simply don’t think about it. Don’t try to listen to how you feel that day, just get out of bed.&lt;/p&gt;

&lt;h3 id=&quot;energizing-with-cardio-15-minutes-to-kickstart-your-day&quot;&gt;Energizing with Cardio: 15 Minutes to Kickstart Your Day&lt;/h3&gt;

&lt;p&gt;Immediately after waking up, engage in a 15-minute cardio workout. This could include jogging in place, jumping jacks, brisk walking, or any activity that increases your heart rate. The benefits of morning cardio are numerous:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Boosts Metabolism&lt;/strong&gt;: Jump-starts your metabolism, helping you burn more calories throughout the day.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Enhances Mood&lt;/strong&gt;: Releases endorphins, natural mood lifters, promoting a positive start to the day.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Increases Energy&lt;/strong&gt;: Improves blood circulation, providing more energy and alertness.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are also plenty of cardio workout videos on Youtube. Recently I used the following ones, but will add more to include some variation during the week:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://youtu.be/uTo2m16eJqI?si=vi2uCLADoJq3TX_r&quot;&gt;Intense 10 minute fat melting HIIT Cardio Workout [10 Second Breaks]&lt;/a&gt; plus a &lt;a href=&quot;https://youtu.be/mmq5zZfmIws?si=GuCSnZDohh_yJ74Q&quot;&gt;7 Minute Workout&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://youtu.be/6V72LjXJGEk?si=RNYPzWX14NgMR3IS&quot;&gt;15 Minute Fat Burning Cardio HIIT Workout&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I give myself one day rest from cardio on Saturdays, and on Sundays I go for a run outside.&lt;/p&gt;

&lt;h3 id=&quot;strength-training-kettlebell-swings&quot;&gt;Strength Training: Kettlebell Swings&lt;/h3&gt;

&lt;p&gt;Following your cardio session, transition into strength training with kettlebell swings. This exercise is a full-body workout, targeting several muscle groups:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Core Strength&lt;/strong&gt;: Kettlebell swings engage your core, enhancing stability and overall strength.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Improved Posture&lt;/strong&gt;: Strengthens back muscles, which is essential for good posture.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Flexibility and Balance&lt;/strong&gt;: Enhances both flexibility and balance, reducing the risk of injury.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For more background information on why Kettlebells work so well, checkout out &lt;a href=&quot;https://tim.blog/2011/01/08/kettlebell-swing/&quot;&gt;Tim Ferriss’s blog&lt;/a&gt; (author of &lt;a href=&quot;https://www.goodreads.com/book/show/7148931-the-4-hour-body&quot;&gt;The 4-hour Body&lt;/a&gt;)&lt;/p&gt;

&lt;h3 id=&quot;cooling-down-and-refreshing-with-a-cold-shower&quot;&gt;Cooling Down and Refreshing with a Cold Shower&lt;/h3&gt;

&lt;p&gt;After allowing your body to cool down for about 30 minutes, it’s time for a cold shower. The idea of cold showers might be daunting, but they offer significant benefits, as explained by neuroscientist Andrew Huberman. According to &lt;a href=&quot;https://www.hubermanlab.com/newsletter/the-science-and-use-of-cold-exposure-for-health-and-performance&quot;&gt;Huberman’s research&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Enhances Circulation&lt;/strong&gt;: Cold water causes blood to move to your organs, improving circulation.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Boosts Immunity&lt;/strong&gt;: Increases white blood cell count, strengthening the immune system.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Improves Mental Resilience&lt;/strong&gt;: Builds mental toughness and resilience, teaching your body to adapt to stressful situations.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Speeds Up Recovery&lt;/strong&gt;: Helps in reducing muscle soreness and speeds up the recovery process.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I know it is quite the hype and trend to take cold showers or ice baths, but the research seems to back it up. So try it out and stick with it. Who doesn’t want to have a prolonged dopamine increase?&lt;/p&gt;

&lt;h3 id=&quot;conclusion-embracing-a-holistic-approach&quot;&gt;Conclusion: Embracing a Holistic Approach&lt;/h3&gt;

&lt;p&gt;By incorporating a mix of cardio, strength training, and the invigorating practice of cold showers, as recommended by experts like Andrew Huberman, you’re not just starting your day; you’re elevating your entire lifestyle. This routine is more than just a series of tasks; it’s a commitment to your physical and mental well-being. Embrace this journey and watch as you transform into a healthier, more resilient version of yourself. Remember, consistency is key, and the best day to start is today!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Running your Startup on Kubernetes ($90 per month)</title>
   <link href="http://beatletech.com/2023/04/06/minimum-viable-kubernetes"/>
   <updated>2023-04-06T00:00:00+02:00</updated>
   <id>http://beatletech.com/2023/04/06/minimum-viable-kubernetes</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;https://s3.eu-west-1.amazonaws.com/eu-west-1.beatletech.com/images/tools_logos2.jpg&quot; alt=&quot;Minimum Viable Kubernetes&quot; width=&quot;80%&quot; title=&quot;Minimum Viable Kubernetes&quot; style=&quot;margin-left:50px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;When you made the decision to start a Startup and begin working on your MVP (Minimum Viable Product), you at some point need to deploy and run your software somewhere to get your product in the hands of actual users. With their feedback you can iterate your product to find that precious product-market fit and become the next unicorn (or at the very least start making money instead of losing it).&lt;/p&gt;

&lt;p&gt;While your MVP is often guaranteed to change drastically over time (even without pivots), a strong foundation will help you iterate faster and scale your product at a later stage without major rewrites. You primarily want to spend your time developing product features and squashing bugs, and not so much on devops and infrastructure (but still keep running costs to a minimum).&lt;/p&gt;

&lt;p&gt;In this blog post I like to present what I consider a great foundation with templates to bootstrap your project, which runs on Google Cloud and Kubernetes (K8s). I know there is an ongoing discussion and heated debates about Cloud vs Dedicated servers, and why you should or shouldn’t use Kubernetes for your business. Take for example &lt;a href=&quot;https://dev.37signals.com/bringing-our-apps-back-home/&quot;&gt;this&lt;/a&gt; recent post from 37signals, discussing their journey on and off the cloud, on and off Kubernetes. As always, it depends on your situation and your expertise, and I’m aware that I’m biased having used Google Cloud and Kubernetes a lot, but I hope that my experience and the &lt;a href=&quot;http://github.com/bedrockio/bedrock-cli&quot;&gt;tools&lt;/a&gt; and &lt;a href=&quot;https://github.com/beatlevic/bedrock&quot;&gt;resources&lt;/a&gt; that I’ll share here, will help you hit the ground running and create a successful company.&lt;/p&gt;

&lt;h4 id=&quot;contents&quot;&gt;Contents&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#minimum-viable-kubernetes-mvk&quot;&gt;Minimum Viable Kubernetes (MVK)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#google-kubernetes-engine-gke&quot;&gt;Google Kubernetes Engine (GKE)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#project-template-bedrockio&quot;&gt;Project Template (Bedrock.io)&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#namespaces&quot;&gt;Namespaces&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#gateway-and-httproutes&quot;&gt;Gateway and HTTPRoutes&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#environment-configuration&quot;&gt;Environment Configuration&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#deployment&quot;&gt;Deployment&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#bootstrap-your-project&quot;&gt;Bootstrap your Project&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#gke-workloads&quot;&gt;GKE Workloads&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#cloudflare-dns&quot;&gt;Cloudflare DNS&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#bedrock-dashboard&quot;&gt;Bedrock Dashboard&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#cost-breakdown&quot;&gt;Cost breakdown&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#resources&quot;&gt;Resources&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;minimum-viable-kubernetes-mvk&quot;&gt;Minimum Viable Kubernetes (MVK)&lt;/h3&gt;

&lt;p&gt;I’m assuming here that you have heard of k8s and that you know that it is an open-source orchestration tool for containerized applications, originally developed at Google. In case you need an introduction or a refresher, I would refer you to their excellent &lt;a href=&quot;https://kubernetes.io/docs/home/&quot;&gt;documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Like the minimum set of features you define for your MVP, I like to start defining the minimum set of features you should expect to get from your k8s cluster, in other words, your Minimum Viable Kubernetes (MVK):&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Flexibility&lt;/strong&gt;: Run any containerized (Docker) application or database. If your startup requires a high level of customization, then Kubernetes is great.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Scalability&lt;/strong&gt;: Scaling your application up and down based on CPU-usage. If your startup expects to grow rapidly, you can easily horizontally scale your load.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Load balancing&lt;/strong&gt;: Load-balance across pods and services&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Self-healing and Auto-recovery&lt;/strong&gt;: High availability is a nice bonus, but one of my main goals in life is to sleep at night, so we want self-healing and restart containers and nodes that fail.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Easy deployment&lt;/strong&gt;: K8s comes with a great command line interface (CLI) to manage deployments, but I’ll later introduce a great CLI wrapper (&lt;a href=&quot;#project-template-bedrockio&quot;&gt;Bedrock-CLI&lt;/a&gt;) that also helps in building (Docker) and provisioning (Terraform) your infrastructure and applications.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Future proofing&lt;/strong&gt;: Kubernetes has become the de facto standard for container orchestration.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Maintainable over time&lt;/strong&gt;: Yes, you can install and run Kubernetes everywhere, but k8s is quite complex with many running components (control plane nodes, compute nodes, scheduler, proxy networking, load balancers, kubelets, etc). Unless you have a dedicated team of devops people (which you don’t, and if you have, congrats on securing your Series A investment!), I would stay away from installing and managing k8s on dedicated servers and instead choose a Cloud managed solution. This supports auto-upgrading to newer versions and making sure you run with the latest security fixes. In the next section I’ll discuss why Google Cloud’s GKE is the best option.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Low cost&lt;/strong&gt;: We always like to keep costs at a minimum too (traded off against gained features). Running in the Cloud is often synonymous with spending big bucks, but I’ll show you that a production ready cluster can be had for $90 a month (or even $50 if you cheap out on compute resources).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Supporting multiple environments&lt;/strong&gt;: Last but not least, we like to support different environments (e.g, staging and production). Of course you can spin up a separate k8s cluster for each environment, but we already have &lt;strong&gt;low cost&lt;/strong&gt; as a minimum feature, so I’ll show you later how you can manage multiple environments with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Namespaces&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gateway&lt;/code&gt; load balancers in a single cluster.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So now that we have defined our MVK, where running in the Cloud is a must, let’s see why the Google Cloud managed solution (GKE) is the way to go.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;google-kubernetes-engine-gke&quot;&gt;Google Kubernetes Engine (GKE)&lt;/h3&gt;

&lt;p&gt;Google Cloud Platform (GCP) offers a managed k8s solution which is called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Google Kubernetes Engine&lt;/code&gt; (GKE). As noted earlier, Google is the birthplace of Kubernetes and they have over 15 years of experience running massive workloads. However, that doesn’t mean Google is the only Cloud provider with a managed solution. Amazon Web Services (AWS) and Microsoft Azure both introduced managed clusters, as well as Digital Ocean and a long tail of other providers, adding to the immense growth and popularity of Kubernetes in the industry, overtaking other container orchestration tools like &lt;a href=&quot;https://mesos.apache.org/&quot;&gt;Mesos&lt;/a&gt; and &lt;a href=&quot;https://docs.docker.com/engine/swarm/&quot;&gt;Docker Swarm&lt;/a&gt;, and being a cloud-agnostic alternative to their own vendor lock-in services like AWS ECS for example. A push in Hybrid-cloud and Multi-cloud environments further fueled the need for k8s, allowing you to run the same container everywhere.&lt;/p&gt;

&lt;p&gt;I don’t have much experience with Microsoft’s AKS (Azure Kubernetes Service) or any with Digital Ocean’s managed Kubernetes, but I have extensively used both EKS (AWS) and GKE (GCP). I know that choosing a Cloud provider often comes down to your personal preference and sticking to what you already know and have used before. When it comes to managed k8s however, I believe GKE is the clear winner for three main reasons:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Usability&lt;/strong&gt;: The AWS UI console for EKS is nowhere near as clean as GKE. Giving users access to your cluster is painful and logging out of the box is terrible. GKE also has better support and flawless version upgrades. All in all AWS EKS gives me the feeling that they try to push you to use ECS instead. Comparing EKS and ECS is a whole topic on its own, but some limitations of ECS are:
    &lt;ul&gt;
      &lt;li&gt;You can only mount EFS volumes, which are not to be used to run stateful applications like databases. While EKS actually has EBS support.&lt;/li&gt;
      &lt;li&gt;No configMaps.&lt;/li&gt;
      &lt;li&gt;No init containers&lt;/li&gt;
      &lt;li&gt;No post-start or pre-stop hooks&lt;/li&gt;
      &lt;li&gt;AWS vendor lock-in&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Competitive Advantage&lt;/strong&gt;: GKE has features that are not available on other platforms, such as GKE Autopilot, which is a fully managed Kubernetes experience that eliminates the need for cluster management tasks such as node maintenance and upgrades. GCP has a strong focus on containerization which is evident in its portfolio of container-related services, including Cloud Run, Cloud Build, and Anthos. GCP also offers a range of integrated tools for monitoring, logging, and managing Kubernetes clusters, making it easier to manage and maintain Kubernetes workloads.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Price&lt;/strong&gt;: While both GKE and EKS have a management fee of $0.10 per cluster per hour (~$72 per month), your first cluster in GKE is free of management charge. This is also the reason why we will create multiple environments in one GKE cluster, to avoid this fee (and additional node compute resources). GCP offers sustained use discounts, which can lead to significant cost savings for long-running workloads.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So for starters I would recommend GKE over EKS. GCP’s pricing and integrated tools make it a more attractive option. If you were somehow determined to run on AWS, then I would still recommend running k8s over ECS, and migrate to GKE later ;) Both cloud providers also come with the additional benefit of getting access to a massive suite of other managed cloud services you can easily integrate with, like BigQuery, PubSub, VertexAI, and &lt;a href=&quot;https://cloud.google.com/terms/services&quot;&gt;many&lt;/a&gt; more. And before you start spending your own money on these services, don’t forget to apply for &lt;a href=&quot;https://cloud.google.com/free&quot;&gt;free credits&lt;/a&gt; or in case you secured some funding, you might be eligible for the &lt;a href=&quot;https://cloud.google.com/startup&quot;&gt;startups cloud program&lt;/a&gt;, which can cover up to $100,000 USD in Google Cloud credits in your first year.&lt;/p&gt;

&lt;p&gt;One feature I like to highlight, which you get out of the box in the Cloud, but takes some effort  to setup yourself when running your own dedicated solution, are automated backups of your persistent (database) disks. You can provision your cluster (as we will see later) with a disk policy attached to your persistent volumes that runs (hourly) incremental snapshots. So from the get go you are safeguarded against data corruption, storage failures and coding/human mistakes like dropping the wrong collection (or for maximum damage the entire database).&lt;/p&gt;

&lt;p&gt;Before diving into the tools to setup your own GKE cluster, I briefly like to mention one other alternative platform that is often used to build MVPs and that is the Platform as a Service (PaaS): &lt;a href=&quot;https://www.heroku.com/platform&quot;&gt;Heroku&lt;/a&gt;. While it is super easy to get started with Heroku and get up and running quickly, you will also quickly ramp up the costs when you need more compute resources (and there no longer is a free tier). You can create your own estimates &lt;a href=&quot;https://www.heroku.com/pricing&quot;&gt;here&lt;/a&gt;, but I ended up with an estimate that is at least 5 times higher for the same resources in Google Cloud. Besides the cost argument, I believe it is worth your time to learn k8s and GKE (even if you are a complete beginner) and not completely abstract away your infrastructure and limiting your flexibility and scalability in the future.&lt;/p&gt;

&lt;p&gt;Next up, I’ll provide a project template to setup you own GKE cluster with Bedroock.io (Terraform + Node.js + MongoDB).&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;project-template-bedrockio&quot;&gt;Project Template (Bedrock.io)&lt;/h3&gt;

&lt;p&gt;For creating your MVP and running it on GKE I like to introduce &lt;a href=&quot;http://bedrock.io&quot;&gt;Bedrock.io&lt;/a&gt;, a platform template which was open-sourced over two years ago. Disclaimer, I’m one of the contributors, and it is the result of iterating over a decade on projects and platforms. This makes Bedrock a battle-tested collection of components, automation and patterns that allow you to rapidly build modern software solutions, tying together Node.js, MongoDB &amp;amp; React.&lt;/p&gt;

&lt;p&gt;I would say Bedrock is ideally suited for startups and a strong foundation to build on. On the bedrock.io website you can find a great post on how to &lt;a href=&quot;https://blog.bedrock.io/deploying-a-production-ready-kubernetes-node-react-platform-in-under-15-minutes/&quot;&gt;deploy a production ready Kubernetes Node+React platform in under 15 minutes&lt;/a&gt;. I will recapture some of those steps here, but also introduce some changes (that we are still planning to land in Bedrock). For your convenience I also included the Bedrock &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;From 0 to production&lt;/code&gt; video (by &lt;a href=&quot;https://github.com/dominiek&quot;&gt;Dominiek&lt;/a&gt;) below, which is slightly outdated (from 2 years ago) but still nicely captures all the steps involved:&lt;/p&gt;

&lt;iframe src=&quot;https://player.vimeo.com/video/443474352?h=0dc02d544a&quot; width=&quot;100%&quot; height=&quot;540&quot; frameborder=&quot;0&quot; allow=&quot;fullscreen; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;All you need to get started is getting the &lt;a href=&quot;http://github.com/bedrockio/bedrock-cli&quot;&gt;bedrock-cli&lt;/a&gt; and creating your own bedrock project as follows:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;curl &lt;span class=&quot;nt&quot;&gt;-s&lt;/span&gt; https://install.bedrock.io | bash
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;bedrock create
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Your bedrock project will be a Mono Repo that includes the following parts:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/beatlevic/bedrock/tree/master/deployment&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;deployment/&lt;/code&gt;&lt;/a&gt; - K8s (GKE) &amp;amp; Terraform deployment automation and playbooks.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;(https://github.com/beatlevic/bedrock/tree/master/services/api)&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;services/api&lt;/code&gt;&lt;/a&gt; - A Node.js API, enabled with authentication middleware, OpenAPI, Mongoose ORM and other best practices.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/beatlevic/bedrock/tree/master/services/web&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;services/web&lt;/code&gt;&lt;/a&gt; - A React Single Page App (SPA) that can interact with that API. Includes React Router, authentication screens, placeholder, API portal, dashboard and a repository of components and helper functions.&lt;/li&gt;
  &lt;li&gt;Documentation for all aspects of your new platform (Github markdown)&lt;/li&gt;
  &lt;li&gt;CI system. If besides Continuous Integration (CI) you also want to enable Continuous Deployment (CD), then you can extend the default Github actions with a &lt;a href=&quot;https://docs.github.com/en/actions/deployment/deploying-to-your-cloud-provider/deploying-to-google-kubernetes-engine#creating-the-workflow&quot;&gt;GKE deploy workflow&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Currently the Bedrock template is designed to setup a separate GCP project (and hence separate GKE cluster) for each environment (e.g, staging and production). This is great to isolate the environments from each other, but for our startup we like to start with only one cluster to keep the costs down (and avoid the cluster management fee, remember that your first GKE cluster is free of the $0.10 an hour charge). In the next sections I’ll walk you through the following changes you have to make in order to support multiple environments on one cluster:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Namespaces&lt;/strong&gt;: Production, Staging, Data and Infra namespaces with limits and resource quotas.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Gateway&lt;/strong&gt;: Using a Gateway with HTTP routes instead of Ingresses with VPC native loadbalancing.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Environment configuration&lt;/strong&gt;: Updating the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;config.json&lt;/code&gt; for each environment, including the GCR image prefix and cluster details.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We plan to add a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Startup&lt;/code&gt; starting template to Bedrock itself too (as an option during the CLI project creation), but until then, I created an example project (&lt;a href=&quot;http://github.com/beatlevic/bedrock&quot;&gt;repo&lt;/a&gt;) for you as a reference. You can checkout the project running the following, and replacing all mentions of project name &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;beatlevic&lt;/code&gt; across the repo with your the name of your own created GCP project:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git clone https://github.com/beatlevic/bedrock.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Or you &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bedrock create&lt;/code&gt; a new project and make the following changes yourself.&lt;/p&gt;

&lt;h4 id=&quot;namespaces&quot;&gt;Namespaces&lt;/h4&gt;

&lt;p&gt;Kubernetes namespaces are a way to logically partition a Kubernetes cluster into multiple virtual clusters. Each namespace provides a separate scope for the resources in the cluster, including pods, services, and other objects. Namespaces can be used for a variety of purposes, such as:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Resource isolation&lt;/strong&gt;: Namespaces can be used to isolate resources between different teams or projects. In our case we will use separate namespaces for each environment, but also for shared &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;data&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;infra&lt;/code&gt; namespaces.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Access control&lt;/strong&gt;: Namespaces can be used to control access to resources in the cluster. For example, you can use namespaces to restrict access to certain pods or services based on user or role.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Resource quotas&lt;/strong&gt;: Namespaces can be used to set resource quotas for the resources in the cluster. This can help prevent one team or project from monopolizing resources in the cluster.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Multitenancy&lt;/strong&gt;: Namespaces can be used to support multitenancy in the cluster. For example, you can create a separate namespace for each tenant or customer, which can be very important for a SaaS startup.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kubernetes includes a default namespace that is used if no other namespace is specified. You can create additional namespaces using the Kubernetes API or the command line interface. In the bedrock k8s template you will four &lt;a href=&quot;https://github.com/beatlevic/bedrock/tree/master/deployment/environments/production/namespaces&quot;&gt;templates&lt;/a&gt; that will be created when you bootstrap the cluster. Resources in K8s are defined in YAML files, like for example the following definition for the &lt;a href=&quot;https://github.com/beatlevic/bedrock/blob/master/deployment/environments/production/namespaces/production.yml&quot;&gt;production&lt;/a&gt; namespace:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;v1&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Namespace&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;production&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To make sure all the production resources are running in the production namespace, you need to specify the namespace for each resource in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;metadata.namespace&lt;/code&gt; field. For example the &lt;a href=&quot;https://github.com/beatlevic/bedrock/blob/master/deployment/environments/production/services/api-deployment.yml&quot;&gt;API&lt;/a&gt; deployment for production starts with the following:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;apps/v1&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Deployment&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;api&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;production&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# &amp;lt;= Added environment namespace&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;## ...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We can now also share a single Database (MongoDB) deployment between environments (each with their own database, i.e., bedrock_staging and bedrock_production) by running a Mongo deployment and Mongo service in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;data&lt;/code&gt; namespace. We can then access the Mongo service from other namespaces (staging and production) by appending &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.data&lt;/code&gt; as a suffix to the service name. So the &lt;a href=&quot;https://github.com/beatlevic/bedrock/blob/master/deployment/environments/production/services/api-deployment.yml#L31&quot;&gt;MONGO_URI&lt;/a&gt; in the api-deployment environment variables becomes: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mongodb://mongo.data:27017/bedrock_production&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Finally the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;infra&lt;/code&gt; namespace will contain infrastructure resources, i.e., &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gateway&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HTTPRoutes&lt;/code&gt;, for load balancing and making our services accessible to the public internet.&lt;/p&gt;

&lt;h4 id=&quot;gateway-and-httproutes&quot;&gt;Gateway and HTTPRoutes&lt;/h4&gt;

&lt;p&gt;Default Bedrock uses &lt;a href=&quot;https://cloud.google.com/kubernetes-engine/docs/concepts/ingress&quot;&gt;GKE Ingresses&lt;/a&gt; for routing HTTP(S) traffic to applications running in a cluster. We can create separate ingresses for each environment, but each Ingress comes with its own load balancer that we have to pay for ($20 a month). However running a single Ingress will not work, because by default an Ingress does not have cross-namespace support. Luckily we can nowadays use a Gateway instead, which evolves the Ingress resource and does have cross-namespace support (and other improvements that I won’t go into detail here).&lt;/p&gt;

&lt;p&gt;To use a Kubernetes Gateway, we first need to define the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gateway&lt;/code&gt; object in our Kubernetes configuration. You can then define an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HTTPRoute&lt;/code&gt; object to specify how incoming traffic should be routed to your services.&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;https://github.com/beatlevic/bedrock/blob/master/deployment/environments/production/gateways/gateway.yml&quot;&gt;Gateway resource&lt;/a&gt; is defined as follows (in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;infra&lt;/code&gt; namespace):&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;gateway.networking.k8s.io/v1beta1&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Gateway&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;external-http&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;infra&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# &amp;lt;= Gateway is deployed in infra namespace&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;gatewayClassName&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;gke-l7-gxlb&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# &amp;lt;= Global external HTTP(S) load balancer&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;listeners&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;protocol&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;HTTP&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;80&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;allowedRoutes&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;namespaces&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;All&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;addresses&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;NamedAddress&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;external-gateway&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# &amp;lt;= Name of GCP global external IP address, defined with Terraform&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then within each namespace you create HTTPRoutes that bind to the Gateway to route traffic from, and define which Services to route to, and rules that define what traffic the HTTPRoute matches. Take for example the following &lt;a href=&quot;https://github.com/beatlevic/bedrock/blob/master/deployment/environments/production/gateways/bedrock-api-route-staging.yml&quot;&gt;bedrock-api HTTPRoute&lt;/a&gt; that routes traffic from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bedrock-api.beatlevic.dev&lt;/code&gt; to the api service in the staging namespace:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;HTTPRoute&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;gateway.networking.k8s.io/v1beta1&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;bedrock-api&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;staging&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# &amp;lt;= HTTPRoute and api are deployed in the staging namespace&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;parentRefs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;external-http&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;infra&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# &amp;lt;= Gateway is deployed in the infra namespace&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;hostnames&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;bedrock-api.beatlevic.dev&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;rules&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;backendRefs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;api&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;80&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;environment-configuration&quot;&gt;Environment Configuration&lt;/h4&gt;

&lt;p&gt;One final (small) change we need to make is to the environment configuration of the staging environment. Each environment has its own &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;config.json&lt;/code&gt; file to specify the GCP project and GKE cluster name. We just need to use the same values here as we do in the config for production, with only one additional variable that is setting the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gcrPrefix&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;staging-&lt;/code&gt;. The reason for this is when we build and deploy a service using the bedrock cli (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bedrock cloud deploy production api&lt;/code&gt;), it by default pushes to the Google Container Registry (GCR) and defines the specific registry for the service as follows: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gcr.io/&amp;lt;PROJECT&amp;gt;/&amp;lt;REPO&amp;gt;-services-&amp;lt;SERVICE&amp;gt;&lt;/code&gt;, e.g., &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gcr.io/beatlevic/bedrock-services-api&lt;/code&gt; for the API service. We like to build separate images for production and staging, so the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gcrPrefix&lt;/code&gt; adds an additional prefix to the registry name, e.g., &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gcr.io/beatlevic/staging-bedrock-services-api&lt;/code&gt; for the API staging docker image.&lt;/p&gt;

&lt;p&gt;Staging &lt;a href=&quot;https://github.com/beatlevic/bedrock/blob/master/deployment/environments/staging/config.json&quot;&gt;config.json&lt;/a&gt;:&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;gcloud&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;envName&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;staging&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;project&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;beatlevic&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;gcrPrefix&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;staging-&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;dropDeploymentPostfix&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;computeZone&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;europe-west4-a&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;kubernetes&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;clusterName&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;cluster-1&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;app&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;deployment&quot;&gt;Deployment&lt;/h3&gt;

&lt;h4 id=&quot;bootstrap-your-project&quot;&gt;Bootstrap your Project&lt;/h4&gt;

&lt;p&gt;Bootstrapping your project only requires you to follow 3 steps:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Create your own GCP project. Or you can use an existing one. In our example we use project &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;beatlevic&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Clone and modify the &lt;a href=&quot;http://github.com/beatlevic/bedrock&quot;&gt;example repo&lt;/a&gt; to your liking, or start with creating a bedrock project on the command line with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bedrock create&lt;/code&gt;, and adding the namespace, gateway and environment configuration changes.&lt;/li&gt;
  &lt;li&gt;Provision and bootstrap your cluster, services and other resources with one single command:&lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;bedrock cloud bootstrap production &amp;lt;gcloud-project-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;gke-workloads&quot;&gt;GKE Workloads&lt;/h4&gt;

&lt;p&gt;When the bootstrap command runs successfully and you also deployed the staging services (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bedrock cloud deploy staging&lt;/code&gt;), you should be seeing the following workloads in the gcloud console (or run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kubectl get pods&lt;/code&gt;):&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://s3.eu-west-1.amazonaws.com/eu-west-1.beatletech.com/images/bedrock-workloads.png&quot; alt=&quot;Bedrock GKE workloads&quot; width=&quot;80%&quot; title=&quot;Bedrock GKE workloads&quot; style=&quot;margin-left:20px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can see three services (api, api-cli and web) for each environment and mongo (and mongo-backup for daily MongoDB dumps to bucket storage) in the data namespace.&lt;/p&gt;

&lt;h4 id=&quot;cloudflare-dns&quot;&gt;Cloudflare DNS&lt;/h4&gt;

&lt;p&gt;We prefer to use Cloudflare DNS to proxy traffic from your domain to the Gateway IP. You can get your Gateway global IP by checking:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;gcloud compute addresses list
NAME              ADDRESS/RANGE   TYPE      PURPOSE  NETWORK  REGION  SUBNET  STATUS
external-gateway  34.110.231.132  EXTERNAL                                    IN_USE
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then next, you enter the IP for each of the (sub) domains that you have, which need to be the same hostnames that use in your HTTPRoutes. So in my case, for the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;beatlevic.dev&lt;/code&gt; domain:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://s3.eu-west-1.amazonaws.com/eu-west-1.beatletech.com/images/cloudflare.png&quot; alt=&quot;Cloudflare DNS&quot; width=&quot;100%&quot; title=&quot;Cloudflare DNS&quot; style=&quot;margin-left:0px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can check if the api is running successfully by requesting or opening the api endpoint in your browser:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;curl http://bedrock-api.beatlevic.dev
&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&quot;environment&quot;&lt;/span&gt;: &lt;span class=&quot;s2&quot;&gt;&quot;staging&quot;&lt;/span&gt;,
  &lt;span class=&quot;s2&quot;&gt;&quot;version&quot;&lt;/span&gt;: &lt;span class=&quot;s2&quot;&gt;&quot;0.0.1&quot;&lt;/span&gt;,
  &lt;span class=&quot;s2&quot;&gt;&quot;openapiPath&quot;&lt;/span&gt;: &lt;span class=&quot;s2&quot;&gt;&quot;/openapi.json&quot;&lt;/span&gt;,
  &lt;span class=&quot;s2&quot;&gt;&quot;servedAt&quot;&lt;/span&gt;: &lt;span class=&quot;s2&quot;&gt;&quot;2023-03-20T09:49:51.520Z&quot;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;bedrock-dashboard&quot;&gt;Bedrock Dashboard&lt;/h4&gt;

&lt;p&gt;With everything running you can now check the web service (dashboard) by opening &lt;a href=&quot;https://bedrock.beatlevic.dev&quot;&gt;bedrock.beatlevic.dev&lt;/a&gt;. There you should be greeted with a login/signup form.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://s3.eu-west-1.amazonaws.com/eu-west-1.beatletech.com/images/bedrock-login.png&quot; alt=&quot;Bedrock login screen&quot; width=&quot;60%&quot; title=&quot;Bedrock Login&quot; style=&quot;margin-left:150px&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;You can login with the user/password combination as defined in the &lt;a href=&quot;https://github.com/beatlevic/bedrock/blob/master/deployment/environments/production/services/api-cli-deployment.yml#L33&quot;&gt;api-cli&lt;/a&gt; deployment (Note: I changed the credentials for my own deployment), which sets up fixtures (including users) on its first run.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://s3.eu-west-1.amazonaws.com/eu-west-1.beatletech.com/images/bedrock-logged-in.png&quot; alt=&quot;Bedrock products screen&quot; width=&quot;100%&quot; title=&quot;Bedrock Products&quot; style=&quot;margin-left:0px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The bedrock &lt;a href=&quot;https://blog.bedrock.io/deploying-a-production-ready-kubernetes-node-react-platform-in-under-15-minutes/&quot;&gt;blog post&lt;/a&gt; goes a bit deeper into how you can make UI and API changes, and how you run things locally. However, it doesn’t yet include the generator and scaffolding features (both for code and documentation) that we introduced over time, which is due for another blog post.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;cost-breakdown&quot;&gt;Cost breakdown&lt;/h3&gt;

&lt;p&gt;Finally I’ll conclude with the cost breakdown of running a single production ready GKE cluster for multiple environments. The production &lt;a href=&quot;https://github.com/beatlevic/bedrock/blob/master/deployment/environments/production/config.json&quot;&gt;config.json&lt;/a&gt; defines the cluster size and machine type that will be passed into the Terraform templates to provision your GKE cluster. I opted for machine type &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;n2d-standard-2&lt;/code&gt;, which provides 2 CPUs and 8 GB of RAM, and costs $54,- monthly in the europ-west region including a sustained usage discount. It’s not only the compute resource your have to pay for, but also the load balancers, traffic, reserved IPs and storage. GCP billing reports provide a great and detailed overview of your costs, so let’s have a look at the past 30 days:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://s3.eu-west-1.amazonaws.com/eu-west-1.beatletech.com/images/cost-breakdown.png&quot; alt=&quot;Daily cost breakdown for the past 30 days&quot; width=&quot;100%&quot; title=&quot;Daily cost breakdown for the past 30 days&quot; style=&quot;margin-left:0px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;As you can see the total is E82,64 which translates to approximately &lt;strong&gt;$90,- a month&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You could even bring this number down by using half the compute resources and selecting for example machine type &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;n1-standard-1&lt;/code&gt;, reducing the costs with $28,-, bring the total down to $62,-. If that initially works for you, then you can always increase the resources later (and the cluster will already add more nodes when you start requesting more resources), but I prefer to start with nodes that have a bit more memory as we are also running a (shared) MongoDb instance. Running in the European region is also slightly more expensive than in the US, so you can save a couple of percentages there.&lt;/p&gt;

&lt;p&gt;You might be tempted to run on spot instances, which are are even cheaper, but those are only for batch jobs and fault-tolerant workloads, and you want some guarantees that your production system is available. It can however be viable to expand with node pools running on spot instances if you require more batchable compute resources over time.&lt;/p&gt;

&lt;p&gt;But there you have it. Running your Startup MVP on Kubernetes for $90 per month, a solid foundation, ready to scale and take over the world!&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;resources&quot;&gt;Resources&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;Bedrock CLI: &lt;a href=&quot;http://github.com/bedrockio/bedrock-cli&quot;&gt;github.com/bedrockio/bedrock-cli&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Project template: &lt;a href=&quot;http://github.com/beatlevic/bedrock&quot;&gt;github.com/beatlevic/bedrock&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</content>
 </entry>
 
 <entry>
   <title>Goodbye breakfast: 6 months of Intermittent Fasting</title>
   <link href="http://beatletech.com/2020/11/24/goodbye-breakfast"/>
   <updated>2020-11-24T00:00:00+01:00</updated>
   <id>http://beatletech.com/2020/11/24/goodbye-breakfast</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;https://s3-eu-west-1.amazonaws.com/eu-west-1.beatletech.com/images/intermittent-fasting-mogwai-16-8-blue.png&quot; alt=&quot;Intermittent Fasting 16/8&quot; width=&quot;70%&quot; title=&quot;Intermittent Fasting 16/8&quot; style=&quot;margin-left:100px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;DISCLAIMER:&lt;/strong&gt; I’m not an MD, so please read this blog post only as an interesting starting point for your own research and always check with your own doctor or dietician if you want to try this at home. You are responsible for your own health.&lt;/em&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;For the past 6 months I have been doing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;intermittent fasting&lt;/code&gt; (IF) by eating daily only during an 8 hour window: between noon and 8pm. On top of that I had three water-only fasts where I didn’t eat anything for multiple days (4-5) in a row.&lt;/p&gt;

&lt;p&gt;That’s madness you might say! Why would you starve yourself? Breakfast is the most important meal of the day and you are skipping it!&lt;/p&gt;

&lt;p&gt;Well, I currently believe that it would be madness NOT to fast, and have both scientific and 6 months of anecdotal evidence to back that up. When I was just a few weeks into intermittent fasting, I was already so positively surprised by the initial results that I wanted to tell everybody about my “discovery”, especially because I believed I could also explain why and how it works after reading into the physiology and research behind it. I decided to first see if I could stick with it for a couple of months and then write about my experiences. So here I am, 6 months later, ready to tell you all about my journey and “why” intermittent fasting is so interesting.&lt;/p&gt;

&lt;h3 id=&quot;benefits&quot;&gt;Benefits&lt;/h3&gt;

&lt;p&gt;Before we dive in, what’s in it for you? What kind of benefits are we talking about? There are the following immediate known and lasting benefits that I experienced:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Weight loss&lt;/li&gt;
  &lt;li&gt;Higher levels of energy&lt;/li&gt;
  &lt;li&gt;Feeling stronger (due to increase in human growth hormone)&lt;/li&gt;
  &lt;li&gt;Better focus&lt;/li&gt;
  &lt;li&gt;Decrease in hay fever symptoms (to be fair, I could have been lucky with a mild season)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And there are (potential) long term benefits (&lt;a href=&quot;https://www.nejm.org/doi/full/10.1056/nejmra1905136&quot;&gt;1&lt;/a&gt;, &lt;a href=&quot;https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3106288/&quot;&gt;2&lt;/a&gt;, &lt;a href=&quot;https://www.healthline.com/nutrition/10-health-benefits-of-intermittent-fasting&quot;&gt;3&lt;/a&gt;):&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Cellular repair (Autopaghy)&lt;/li&gt;
  &lt;li&gt;Decreased &lt;a href=&quot;https://www.webmd.com/diabetes/insulin-resistance-syndrome&quot;&gt;insulin resistance&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Decreased incidence of diseases, including cancers, obesity, neurological disorders and cardiovascular disease.&lt;/li&gt;
  &lt;li&gt;Increased stress resistance&lt;/li&gt;
  &lt;li&gt;Increased longevity and quality of life&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fasting sounds like a miracle drug doesn’t it? You don’t even have to pay money for it! That’s also probably why you won’t see any fasting ads on your timeline or tv commercials (e.g., “Stop buying our cornflakes and just skip breakfast now!”). It is essentially free and available for you to try out.&lt;/p&gt;

&lt;p&gt;Without further ado, let’s explore intermittent fasting and why it works.&lt;/p&gt;

&lt;h3 id=&quot;intermittent-fasting&quot;&gt;Intermittent Fasting&lt;/h3&gt;

&lt;p&gt;People have been actively fasting, i.e., periods of consciously not eating, since ancient times (&lt;a href=&quot;https://thefastingmethod.com/fasting-a-history-part-i/&quot;&gt;4&lt;/a&gt;) and it has, unwillingly, been part of the eating pattern of our ancestors when food wasn’t always around (e.g. hunting on an empty stomach), although strictly speaking you would call it starvation if you don’t know when you will get your next meal. It just shows, that our bodies have been evolutionary adapted to handle feast and famine. It’s being exposed to stress, variability, volatility and randomness (up to a point and not continuously), that makes us stronger (i.e., &lt;a href=&quot;https://en.wikipedia.org/wiki/Antifragile&quot;&gt;antifragile&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Recently intermittent fasting has become a more popular form of fasting, which can be defined as &lt;strong&gt;an eating pattern in which you cycle between periods of eating and fasting&lt;/strong&gt;, where you stretch each fasting period long enough to force your body into switching from burning glucose (sugar) and glycogen (stored sugar) to fat burning. This is what is called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;metabolic flexibility&lt;/code&gt;, where your body makes use of whatever fuel is available. As a bonus, it seems that ketosis (i.e., the metabolic state running on fat for fuel) is the main driver for fat burning in the abdomen region, belly fat!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So how long do you have to NOT eat to switch to fat burning?&lt;/strong&gt; Apparently, energy intake restriction for 10 to 14 hours results in depletion of liver glycogen stores (&lt;a href=&quot;https://www.nejm.org/doi/full/10.1056/nejmra1905136&quot;&gt;1&lt;/a&gt;, &lt;a href=&quot;https://www.semanticscholar.org/paper/Fuel-metabolism-in-starvation.-Cahill/a8bb8327226d35259e68ecd8edcc17a3a1380f4a&quot;&gt;5&lt;/a&gt;) after which fat, fatty acids, are freed to form &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ketones&lt;/code&gt; that are used to fuel your body (as opposed to glucose). The more &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fat adapted&lt;/code&gt; you are, the quicker your body will switch to fat burning, something you get more adapted to as a result of prolonged intermittent fasting.&lt;/p&gt;

&lt;p&gt;Given the required minimum of 10 to 14 hours of fasting to start producing ketones, you have different patterns for intermittent fasting you could follow:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;16/8&lt;/strong&gt;: A daily window of 8 hours, often from noon to 8pm (so no breakfast), for eating and 16 hours of fasting (during the night and morning).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;5:2&lt;/strong&gt;: 5 days eating, 2 days fasting.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Alternate day&lt;/strong&gt;: Alternate days of eating and fasting&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;One Meal a Day (OMAD)&lt;/strong&gt;: Sticking to one meal a day, often dinner, and fast the rest of the day.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I chose &lt;strong&gt;16/8&lt;/strong&gt;, because it fits nicely with having kids that are not on a fasting schedule (nor should they ever be when they are young and still growing), having lunch and dinner together. I also like the consistency of following the same schedule every day, apart from sporadic multi-day periods of water-only fasts (more on that later).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aren’t you also burning up your muscles during fasting?&lt;/strong&gt; Nope. Your body is naturally preserving your muscles by increasing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;human growth hormone&lt;/code&gt; (HGH), which also helps building muscles after the fasting period as HGH levels remain high.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So all the benefits come from fat burning and the increase in human growth hormone?&lt;/strong&gt; Actually those account for only part of the benefits. The third and arguable the most interesting process during fasting is called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;autophagy&lt;/code&gt;, which literally translates to “self eating”, an apt description for the cellular repair and rejuvenation that will happen in your body.&lt;/p&gt;

&lt;h4 id=&quot;autophagy&quot;&gt;Autophagy&lt;/h4&gt;

&lt;p&gt;Your body continuously needs amino acids, the building blocks for new cells, and when you are not eating you are not taking in new amino acids (proteins). The body already recycles your old and damaged cells to harvest these building blocks, but during fasting has to work harder to get enough of this material. It does this by increasing your immune system in order to “scavenge” in all the nooks and crannies of your body for cells to break down. Cells that otherwise would be “good enough yet mediocre” are now also recycled.&lt;/p&gt;

&lt;p&gt;This is the only process known to rejuvenate neural pathways when you are getting older, and you will be safeguarding and protecting yourself against neurological and auto-immune disorders (&lt;a href=&quot;https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3106288/&quot;&gt;2&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;The importance of autophagy has also been clearly demonstrated by Japanese cell biologist Yoshinori Ohsumi, who won, in 2016, the Nobel Prize in Medicine for his research on this very topic, showing how autophagy helps slow down the aging process (&lt;a href=&quot;https://www.nobelprize.org/prizes/medicine/2016/press-release/&quot;&gt;6&lt;/a&gt;).&lt;/p&gt;

&lt;h4 id=&quot;key-concepts&quot;&gt;Key concepts&lt;/h4&gt;

&lt;p&gt;Now that we covered what intermittent fasting is, how it works and benefits you, by going over some of the key concepts: the metabolic switch to fat burning, the increase in human growth hormone and autophagy. I like to move on to sharing my experience of putting intermittent fasting into practice.&lt;/p&gt;

&lt;h3 id=&quot;my-6-month-journey&quot;&gt;My 6 Month Journey&lt;/h3&gt;

&lt;p&gt;During the first Coronavirus lockdown in April (in the Netherlands), I spent most of my time homeschooling my three kids and working for &lt;a href=&quot;https://rekall.ai&quot;&gt;rekall.ai&lt;/a&gt;, while neglecting sporting activities and not eating healthy consistently (e.g., more snacks). So when the kids were allowed to go back to school again in May, I stepped on the scale and found myself nearing 100 kg. This for me, being 1.98m tall (6’6”), meant I was being borderline overweight according to my &lt;a href=&quot;https://www.nhlbi.nih.gov/health/educational/lose_wt/BMI/bmicalc.htm&quot;&gt;BMI&lt;/a&gt; calculation (&amp;gt;25). I have never seen myself weigh more than 100 kg (220 lb) and didn’t want to see that happen, so it was time for action!&lt;/p&gt;

&lt;p&gt;I set a weight goal to lose 8 kg in 6 weeks and weigh no more than 90 kg (200 lb) on my birthday (June 26th). In order to get there I wanted to follow a low-carb Paleo diet (&lt;a href=&quot;https://www.mayoclinic.org/healthy-lifestyle/nutrition-and-healthy-eating/in-depth/paleo-diet/art-20111182&quot;&gt;Caveman diet&lt;/a&gt;), which I had followed 10 years prior with great &lt;a href=&quot;https://about.me/beatlevic&quot;&gt;results&lt;/a&gt;. Doing some online research and catching up on Youtube with low-carb and Keto diets, is when I stumbled upon intermittent fasting videos (&lt;a href=&quot;https://youtu.be/thZFIPOAGNQ&quot;&gt;7&lt;/a&gt;, &lt;a href=&quot;https://youtu.be/thgVz3837l0&quot;&gt;8&lt;/a&gt;, &lt;a href=&quot;https://youtu.be/LLVf3d0rqqY&quot;&gt;9&lt;/a&gt;). As you know by reading this far, the benefits of IF sounded amazing, so I decided, under the medical supervision of my wife, who is an actual MD, to go all in.&lt;/p&gt;

&lt;h4 id=&quot;weight-loss-results&quot;&gt;Weight loss results&lt;/h4&gt;

&lt;p&gt;In the following annotated graph you can view my weight over the course of the past 6 months. I’ll provide you with more context in the next sections.&lt;/p&gt;

&lt;script type=&quot;text/javascript&quot; src=&quot;https://www.gstatic.com/charts/loader.js&quot;&gt;&lt;/script&gt;

&lt;div class=&quot;notranslate&quot; id=&quot;chart_div&quot; style=&quot;margin-bottom: 30px; margin-left: -40px; margin-right: -35px&quot;&gt;&lt;/div&gt;

&lt;script type=&quot;text/javascript&quot;&gt;
  google.charts.load(&quot;current&quot;, { packages: [&quot;corechart&quot;, &quot;line&quot;] });
  google.charts.setOnLoadCallback(drawBasic);

  //https://developers.google.com/chart/interactive/docs/gallery/annotationchart
  function drawBasic() {
    var data = new google.visualization.DataTable();
    data.addColumn(&quot;date&quot;, &quot;Date&quot;);
    data.addColumn(&quot;number&quot;, &quot;Weight (kg)&quot;);
    data.addColumn({ type: &quot;string&quot;, role: &quot;annotation&quot; }); // annotation role col.
    data.addColumn({ type: &quot;string&quot;, role: &quot;annotationText&quot; }); // annotationText col.

    data.addRows([
      [new Date(2020, 4, 10), 98.5, undefined, undefined],
      [new Date(2020, 4, 13), 97.9, &quot;A&quot;, &quot;Start - Intermittent Fasting&quot;],
      [new Date(2020, 4, 17), 96.9, undefined, undefined],
      [new Date(2020, 4, 20), 95.9, undefined, undefined],
      [new Date(2020, 4, 24), 95.9, undefined, undefined],
      [new Date(2020, 4, 25), 94.6, undefined, undefined],
      [new Date(2020, 4, 27), 94.9, undefined, undefined],
      [new Date(2020, 4, 30), 94.5, &quot;B&quot;, &quot;Start - Water Fast&quot;],
      [new Date(2020, 4, 31), 94.0, undefined, undefined],
      [new Date(2020, 5, 1), 93.4, undefined, undefined],
      [new Date(2020, 5, 2), 92.9, undefined, undefined],
      [new Date(2020, 5, 3), 91.4, &quot;C&quot;, &quot;End - Water Fast (5 days)&quot;], // 5 days fasting
      [new Date(2020, 5, 6), 91.9, undefined, undefined],
      [new Date(2020, 5, 8), 92.2, undefined, undefined],
      [new Date(2020, 5, 10), 91.4, undefined, undefined],
      [new Date(2020, 5, 12), 90.4, undefined, undefined],
      [new Date(2020, 5, 14), 89.8, undefined, undefined],
      [new Date(2020, 5, 15), 89.5, undefined, undefined],
      [new Date(2020, 5, 17), 89.2, undefined, undefined],
      [new Date(2020, 5, 20), 90.0, undefined, undefined],
      [new Date(2020, 5, 21), 90.0, &quot;D&quot;, &quot;Start - 2nd Water Fast&quot;],
      [new Date(2020, 5, 22), 89.3, undefined, undefined],
      [new Date(2020, 5, 24), 88.3, undefined, undefined],
      [new Date(2020, 5, 25), 87.6, &quot;E&quot;, &quot;End - 2nd Water Fast (4 days)&quot;],
      [new Date(2020, 5, 26), 87.7, &quot;F&quot;, &quot;Birthday (Goal: &lt; 88KG)&quot;],
      [new Date(2020, 6, 1), 88.1, undefined, undefined],
      [new Date(2020, 6, 5), 88.0, &quot;G&quot;, &quot;Start - Camping trip&quot;],
      [new Date(2020, 6, 20), 91.2, &quot;H&quot;, &quot;End - Camping trip (2 weeks)&quot;],
      [new Date(2020, 6, 21), 90.3, undefined, undefined],
      [new Date(2020, 6, 28), 89.8, undefined, undefined],
      [new Date(2020, 6, 30), 89.2, undefined, undefined],
      [new Date(2020, 7, 3), 90.1, undefined, undefined],
      [new Date(2020, 7, 4), 89.8, undefined, undefined],
      [new Date(2020, 7, 6), 89.4, undefined, undefined],
      [new Date(2020, 7, 10), 91.4, &quot;I&quot;, &quot;End - Camping weekend (3 days)&quot;],
      [new Date(2020, 7, 11), 90.6, undefined, undefined],
      [new Date(2020, 7, 12), 89.7, undefined, undefined],
      [new Date(2020, 7, 13), 89.8, &quot;J&quot;, &quot;3 months Intermittent Fasting&quot;],
      [new Date(2020, 7, 14), 89.7, undefined, undefined],
      [new Date(2020, 7, 17), 88, undefined, undefined],
      [new Date(2020, 7, 20), 89, undefined, undefined],
      [new Date(2020, 7, 21), 88.9, undefined, undefined],
      [new Date(2020, 7, 24), 89.3, undefined, undefined],
      [new Date(2020, 7, 26), 89.8, undefined, undefined],
      [new Date(2020, 7, 27), 89.6, undefined, undefined],
      [new Date(2020, 7, 28), 88.2, undefined, undefined],
      [new Date(2020, 7, 29), 89.0, undefined, undefined],
      [new Date(2020, 7, 31), 88.6, undefined, undefined],
      [new Date(2020, 8, 2), 89.8, undefined, undefined],
      [new Date(2020, 8, 3), 88.9, undefined, undefined],
      [new Date(2020, 8, 7), 88.4, undefined, undefined],
      [new Date(2020, 8, 9), 89.1, undefined, undefined],
      [new Date(2020, 8, 14), 88.6, undefined, undefined],
      [new Date(2020, 8, 17), 90.0, undefined, undefined],
      [new Date(2020, 8, 20), 90.1, undefined, undefined],
      [new Date(2020, 8, 21), 90.2, undefined, undefined],
      [new Date(2020, 8, 23), 89.3, undefined, undefined],
      [new Date(2020, 8, 25), 89.9, undefined, undefined],
      [new Date(2020, 8, 28), 89.6, undefined, undefined],
      [new Date(2020, 8, 30), 89.2, undefined, undefined],
      [new Date(2020, 9, 1), 89.3, undefined, undefined],
      [new Date(2020, 9, 12), 90.3, undefined, undefined],
      [new Date(2020, 9, 16), 89.2, undefined, undefined],
      [new Date(2020, 9, 28), 90.3, undefined, undefined],
      [new Date(2020, 9, 30), 90.5, undefined, undefined],
      [new Date(2020, 10, 1), 90.8, undefined, undefined],
      [new Date(2020, 10, 2), 91.3, &quot;K&quot;, &quot;Start - 3rd Water Fast&quot;],
      [new Date(2020, 10, 3), 90.5, undefined, undefined],
      [new Date(2020, 10, 4), 89.9, undefined, undefined],
      [new Date(2020, 10, 5), 88.2, &quot;L&quot;, &quot;End - 3rd Water Fast (4 days)&quot;],
      [new Date(2020, 10, 6), 88.4, undefined, undefined],
      [new Date(2020, 10, 7), 90.1, undefined, undefined],
      [new Date(2020, 10, 8), 89.4, undefined, undefined],
      [new Date(2020, 10, 9), 89.5, undefined, undefined],
      [new Date(2020, 10, 10), 89.8, undefined, undefined],
      [new Date(2020, 10, 13), 89.2, undefined, undefined],
      [new Date(2020, 10, 22), 89.6, undefined, undefined],
    ]);

    var options = {
      max: 100,
      min: 85,
      // hAxis: {
      //   format: &apos;M/d&apos;,
      //   //title: &apos;Date&apos;
      // },
      vAxis: {
        title: &quot;Weight (kg)&quot;,
        maxValue: 100,
      },
      animation: {
        duration: 2000,
        easing: &quot;out&quot;,
        startup: true,
      },
      // trendlines: {
      //   0: {
      //     type: &apos;linear&apos;,
      //     // title: &apos;Trend&apos;,
      //     visibleInLegend: true,
      //     showR2: true,
      //   }
      // } // Draw a trendline for data series 0.
    };

    var chart = new google.visualization.LineChart(
      document.getElementById(&quot;chart_div&quot;)
    );

    chart.draw(data, options);
  }
&lt;/script&gt;

&lt;h4 id=&quot;first-2-weeks&quot;&gt;First 2 weeks&lt;/h4&gt;

&lt;p&gt;I started May 13th weighing &lt;strong&gt;97.9 kg&lt;/strong&gt; (A). To keep track of my eating window I set two alarms, one at 12.30pm labeled ‘lunch’ and the other at 8pm ‘no more eating’. For my exercise routine I started to play tennis on Monday mornings, and I tried to run 6-7 km twice a week.&lt;/p&gt;

&lt;p&gt;I switched to a low-carb diet (Paleo): eating more meat, salads, fruits (primarily berries), vegetables and nuts. No longer eating bread, pasta, rice and oatmeal.&lt;/p&gt;

&lt;p&gt;After one week I already lost 2 kg, and another 1 kg after the second week. I found it very easy to stick to the 8 hour eating window and I was not experiencing hunger sensations in the morning or late evenings. Probably because I was already used to skipping breakfast quite often, and because a low-carb diet also helps lowering your insulin spikes and cravings for more sugar. With lower insulin levels, as a result of lower overall blood sugar, you are also quicker in switching to fat burning!&lt;/p&gt;

&lt;h4 id=&quot;water-only-fasting&quot;&gt;Water-only Fasting&lt;/h4&gt;

&lt;p&gt;With this great start, I was feeling bullish about the changes and progression I had made, but I wanted to push fasting a bit harder. So I decided to try water-only fasting, i.e., eating nothing for a couple of days and only consuming water and some minerals (salt for electrolytes). In theory, your body should just switch to fat burning after 12 hours, increase your level of human growth hormone and increase your adrenaline and metabolism.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So what about water-only fasting in practise?&lt;/strong&gt; If you would have asked me a year ago, I would have guessed you would continuously feel very hungry and tired. Now I can tell you from experience that it is nothing like that, and that I continued to have plenty of energy throughout the 5 days that I fasted (B-C). Yes, you will feel a bit hungry around the times you would normally eat, but that feeling passes quickly. I believe being on IF together with a low-carb diet for two weeks helped me adjust quickly to fasting over a longer time period.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Tip&lt;/em&gt;: Drink lots and lots of water to stay hydrated. It also helps suppress hunger feelings, giving you a feeling of satiety. Next to water, you are also allowed to drink calorie free beverages like tea and coffee, as those won’t break your fast.&lt;/p&gt;

&lt;p&gt;I experienced it as quite a powerful and liberating feeling, that you can do without food for so long. Having said that, it is both a reminder how privileged and comfortable we are here in the West, as well as how being too comfortable can lead to diseases of affluence, with worldwide obesity having nearly tripled since 1975 up to 1.9 Billion overweight adults in &lt;a href=&quot;https://www.who.int/news-room/fact-sheets/detail/obesity-and-overweight&quot;&gt;2016&lt;/a&gt;. A little bit of fasting discomfort might go a long way in helping to reduce obesity.&lt;/p&gt;

&lt;p&gt;It was also quite a joyful experience to eat again after 5 days. I broke my fast by eating a strawberry (see image below) that tasted delightful. You really start to appreciate food more with increased flavour sensations.&lt;/p&gt;

&lt;p&gt;During the 5 day fast, I lost 3kg, of which I gained only 0.5kg back in the days after recovering from the fast. So at this point at 3 weeks in, I already lost a total of 6kg down to &lt;strong&gt;92 kg&lt;/strong&gt;.&lt;/p&gt;

&lt;h4 id=&quot;hiit-workout&quot;&gt;HIIT Workout&lt;/h4&gt;

&lt;p&gt;I continued reading more into intermittent fasting and found resources (e.g., &lt;a href=&quot;https://youtu.be/eQxJMtMvWLQ&quot;&gt;10&lt;/a&gt;) pointing out that it improves fat burning if you workout during your fasting window, and also that the best type of workout is High-intensity Interval Training (&lt;a href=&quot;https://en.wikipedia.org/wiki/High-intensity_interval_training&quot;&gt;HIIT&lt;/a&gt;). The reason why it works so well in combination with intermittent fasting, is that it also stimulates human growth hormone (HGH) secretion, which as we know by now, protects and grows your muscles. So I incorporated a 20 minute &lt;a href=&quot;https://youtu.be/cZnsLVArIt8&quot;&gt;brutal HIIT ladder workout&lt;/a&gt; once a week into my exercise schedule.&lt;/p&gt;

&lt;p&gt;If you don’t see yourself HIIT-ing, then know that walking is also a great exercise for fat burning that complements intermittent fasting.&lt;/p&gt;

&lt;h4 id=&quot;birthday-goal-after-6-weeks&quot;&gt;Birthday goal after 6 weeks&lt;/h4&gt;

&lt;p&gt;June 14th, almost two weeks before my self-imposed deadline, I already hit my &amp;lt;90 kg (200 lb) goal, weighing &lt;strong&gt;89.8 kg&lt;/strong&gt;. Instead of calling it a day, I decided to move the goalposts and set a new target weight of &amp;lt;88 kg. In order to actually hit that target, I embarked on my second water-only fast (D-E) in the final week before my birthday. And lo and behold, June 26th (F), 6 weeks after I started this new lifestyle at a weight of 97.9 kg, I now weighed &lt;strong&gt;87.7 kg&lt;/strong&gt; (193 lb). I lost over 10 kg (22 lb)!&lt;/p&gt;

&lt;p&gt;Not only did I lose a lot of weight, I was also feeling stronger and more focused in general, and gained higher levels of energy throughout the day, e.g., I was doing more chores around the house, writing more blog posts, had no more after lunch dips, no more being tired in the evening or going to bed early and it was easier to do more push-ups and plank exercises. I also experienced more calm and tranquility in my mind, making it easier to escape thought loops. All in all, quite a list of improvements!&lt;/p&gt;

&lt;h4 id=&quot;next-6-weeks&quot;&gt;Next 6 weeks&lt;/h4&gt;

&lt;p&gt;Would I be able to stay at my new weight, or yo-yo back up? And would I stick to intermittent fasting? I took it as an ongoing goal to stay under 90 kg and decided to be less restrictive with my eating window in the weekends and on holidays.&lt;/p&gt;

&lt;p&gt;In my weight graph you can see the results from a two week camping trip in July (G-H) and a camping weekend in August (I). Yes I would gain some weight over these periods, but I would every time return back under my 90 kg baseline. 3 months in, on August 13th, I weighed &lt;strong&gt;89.8 kg&lt;/strong&gt;.&lt;/p&gt;

&lt;h4 id=&quot;last-3-months&quot;&gt;Last 3 months&lt;/h4&gt;

&lt;p&gt;For the last 3 months you can see that my weight fluctuated with low variability between 89 and 90 kg. At the end (during the second Coronavirus lockdown) I was going a little bit over 90 kg (1 kg), so I did my third 4-day water-only fast (K-L) to finish my 6 month stretch strongly, and ended with &lt;strong&gt;89.2 kg&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;While intermittent fasting on its own can provide you with all the fasting benefits, my plan going forward is to keep doing water-only fasts every 3-4 months as it resets your body and forces you to pay attention to your diet again after the fast. A great reminder to stay on track.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://s3-eu-west-1.amazonaws.com/eu-west-1.beatletech.com/images/strawberry.jpg&quot; alt=&quot;End of first water fast&quot; width=&quot;60%&quot; title=&quot;End of first water fast&quot; style=&quot;margin-left:150px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This picture was taking right after breaking my first 5 days water-only fast, eating a delicious strawberry.&lt;/em&gt;&lt;/p&gt;

&lt;h3 id=&quot;wrap-up&quot;&gt;Wrap up&lt;/h3&gt;

&lt;p&gt;Of course, over the past 6 months, I not only changed my pattern of eating, but also changed my diet to a low-carb Paleo-diet and started exercising more. So which benefits can I directly address to fasting? Given I had prior experience with low-carb diets, I can say that while in both cases I experienced weight loss, I can clearly feel a positive difference in energy-levels and focus with intermittent fasting. Not to mention, all the potential long-term benefits I set myself up for with intermittent fasting.&lt;/p&gt;

&lt;p&gt;Fasting and all the related body physiology is such a vast topic, and it has been a challenge to condense it into this blog post without going into too much detail. Hopefully, the scientific evidence I pointed out together with my experience over the past 6 months of putting intermittent fasting into practise, gives you enough reasons to look into intermittent fasting yourself and try it out. It is low risk, but with lots of potential upside.&lt;/p&gt;

&lt;p&gt;To be honest, the only reasons why I think you should not fast, are if you have a medical condition and your doctor tells you not to, or if you don’t want to break out of our culture of eating all the time (hint: not a good reason). Changing a habit can be difficult, but just hang in there and give it a couple of weeks. And if you get tired of explaining yourself to others why you are skipping breakfast or have not been eating for several days, just forward them this blog post.&lt;/p&gt;

&lt;p&gt;I very much like to hear from you, about your experience with fasting or if this post gets you started (or not). If you have any suggestions or corrections, just let me know.&lt;/p&gt;

&lt;p&gt;Breakfast is dead, long live intermittent fasting!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.reddit.com/r/fasting/comments/k02mz5/blog_goodbye_breakfast_6_months_of_intermittent/&quot;&gt;Reddit Discussion&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;references&quot;&gt;References&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.nejm.org/doi/full/10.1056/nejmra1905136&quot;&gt;Effects of Intermittent Fasting on Health, Aging, and Disease&lt;/a&gt;, The New England Journal of medicine&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3106288/&quot;&gt;Short-term fasting induces profound neuronal autophagy&lt;/a&gt;, Autophagy Journal&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.healthline.com/nutrition/10-health-benefits-of-intermittent-fasting&quot;&gt;10 Evidence-Based Health Benefits of Intermittent Fasting&lt;/a&gt;, Healthline.com&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://thefastingmethod.com/fasting-a-history-part-i/&quot;&gt;Fasting – A History Part I&lt;/a&gt;, The Fasting Method&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.semanticscholar.org/paper/Fuel-metabolism-in-starvation.-Cahill/a8bb8327226d35259e68ecd8edcc17a3a1380f4a&quot;&gt;Fuel metabolism in starvation&lt;/a&gt;, Medicine, Biology - Annual review of nutrition&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.nobelprize.org/prizes/medicine/2016/press-release/&quot;&gt;2016 Nobel Prize in Physiology or Medicine&lt;/a&gt; for discoveries of mechanisms for autophagy&lt;/li&gt;
  &lt;li&gt;Video: &lt;a href=&quot;https://youtu.be/thZFIPOAGNQ&quot;&gt;Joe Rogan - Dr. Rhonda Patrick on the Carnivore Diet&lt;/a&gt;, Dr. Rhonda Patrick&lt;/li&gt;
  &lt;li&gt;Video: &lt;a href=&quot;https://youtu.be/thgVz3837l0&quot;&gt;Amazing New Study Reveals Miracle Benefits Of Fasting&lt;/a&gt;, Dr. Sten Ekberg&lt;/li&gt;
  &lt;li&gt;Video: &lt;a href=&quot;https://youtu.be/LLVf3d0rqqY&quot;&gt;How to do Intermittent Fasting: Complete Guide&lt;/a&gt;, Thomas DeLauer&lt;/li&gt;
  &lt;li&gt;Video: &lt;a href=&quot;https://youtu.be/eQxJMtMvWLQ&quot;&gt;5 Reasons You should ALWAYS Workout During a Fast [Burn more fat]&lt;/a&gt;, Thomas DeLauer&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Special thanks to my wife Femke Stevens for supporting my journey and &lt;a href=&quot;https://www.linkedin.com/in/markvoortman/&quot;&gt;Mark Voortman&lt;/a&gt; for proofreading!&lt;/em&gt;&lt;/p&gt;

&lt;hr /&gt;
</content>
 </entry>
 
 <entry>
   <title>Docker on macOS without noisy fans</title>
   <link href="http://beatletech.com/2020/10/26/docker-on-macos-without-noisy-fans"/>
   <updated>2020-10-26T00:00:00+01:00</updated>
   <id>http://beatletech.com/2020/10/26/docker-on-macos-without-noisy-fans</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;https://s3-eu-west-1.amazonaws.com/eu-west-1.beatletech.com/images/docker_logo.png&quot; alt=&quot;Docker&quot; width=&quot;30%&quot; title=&quot;Docker&quot; style=&quot;margin-left:250px&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;tldr&quot;&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Running Docker on macOS results in noisy CPU fans and low performance (build times)&lt;/li&gt;
  &lt;li&gt;Apple Silicon probably not the answer&lt;/li&gt;
  &lt;li&gt;The solution is using remote Linux Docker host (with &lt;a href=&quot;#1-install-docker-engine-on-remote-host&quot;&gt;setup&lt;/a&gt; instructions)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;noisy-cpu-fans&quot;&gt;Noisy CPU fans&lt;/h3&gt;

&lt;p&gt;As a developer I’m a big fan of Apple hardware and software ever since I got my first Macbook back in 2008. MacOS is a UNIX operating system running on X86 hardware (changing to ARM soon, but more on that later) that makes developing for Linux production servers a smooth experience utilizing the same UNIX tooling. While my development stack changed over the years and nowadays includes Docker, Kubernetes and &lt;a href=&quot;https://bedrock.io&quot;&gt;bedrock.io&lt;/a&gt;, macOS still continues to serve me well. It is providing these new CLI tools and templates on a stable OS with little to no issues, a nice UI with great HIDPI scaling (rocking a LG 5K monitor over &lt;a href=&quot;https://beatletech.com/setup&quot;&gt;here&lt;/a&gt;), and of course I’ve become so used to the interface that switching back to Windows or Linux Desktop would mess up my optimized workflows and habits.&lt;/p&gt;

&lt;p&gt;One thing, however, that could use improvements is Docker Desktop (&lt;a href=&quot;https://docs.docker.com/docker-for-mac/&quot;&gt;for mac&lt;/a&gt;), to increase Docker container performance, speed up docker build times and reduce CPU usage when running “idle”. The reason for being slow and performance hungry is succinctly explained in &lt;a href=&quot;https://stackoverflow.com/questions/55951014/docker-in-macos-is-very-slow&quot;&gt;this&lt;/a&gt; Stackoverflow answer:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Docker needs a plain Linux kernel to run. Unfortunately, Mac OS and Windows cannot provide this. Therefore, there is a client on Mac OS to run Docker. In addition to this, there is an abstraction layer between Mac OS kernel and applications (Docker containers) and the filesystems are not the same.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In other words, there is a lot of extra (hyper)virtualization and filesystem overhead going on. Of course a relative performance hit (compared to running on Linux directly) is something I could live with, but my main annoyance presents itself loudly when I’m building (and deploying) a lot of Docker images: it spins up my Macbook pro CPU fans to audible levels, something in stark contrast to the absolute silence at which my laptop runs almost everything else (I guess I’m spoiled).&lt;/p&gt;

&lt;p&gt;While you could argue that you should not build and push Docker images to staging or production from your local development machine and just incorporate it in your CI/CD pipeline, I prefer having this manual control, which is also nicely supported by the &lt;a href=&quot;https://bedrock.io&quot;&gt;bedrock.io&lt;/a&gt; build and deploy commands. This point probably warrants a whole dedicated blog post, but if you are like me, and also run a lot of docker build commands locally, then you will be interested in the solution I found to my &lt;strong&gt;main problem: the lack of macOS docker performance (long build times) and noisy CPU fans&lt;/strong&gt;.&lt;/p&gt;

&lt;h3 id=&quot;apple-silicon-is-not-the-solution&quot;&gt;Apple Silicon is not the solution&lt;/h3&gt;

&lt;p&gt;With myself being an Apple enthusiast, you can image why I’m excited about the upcoming transition from Intel CPUs to Apple Silicon, which is planned to make its debut in their Macbook Pro and iMac lineup later this year (&lt;a href=&quot;https://9to5mac.com/2020/10/09/apple-silicon-november-bloomberg/&quot;&gt;Rumors&lt;/a&gt; point to a November event). So at first I thought that the answer to the lackluster Docker performance on the Mac would simply be waiting for the new ARM hardware release and buying a new Macbook Pro. However, this might not hold true as Apple Silicon will be an ARM SoC, which is a different architecture than X86_64. And X86_64 is still my deployment target for the foreseeable future. In other words, I still need to build X86_64 images and this will require emulation and virtualization that &lt;a href=&quot;http://www.ml-illustrated.com/2020/06/25/ARM-Macs-virtualization-different-take.html&quot;&gt;some&lt;/a&gt; are expecting to have a 2x to 5x performance hit.&lt;/p&gt;

&lt;p&gt;It is also worth noting that Craig Federighi, Apple’s senior vice president of Software Engineering, said the following during an interview after the initial WWDC Apple Silicon announcement:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“Virtualization on the new Macs won’t support X86 at all” (&lt;a href=&quot;https://www.jeffgeerling.com/blog/2020/what-does-apple-silicon-mean-raspberry-pi-and-arm64&quot;&gt;source&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Craig even explicitly called out Docker containers being built for ARM, and being able to run them on ARM instances in AWS, but what about building your X86 images? I know you can build for multi-arch including ARM now with docker desktop (&lt;a href=&quot;https://www.docker.com/blog/multi-arch-images/&quot;&gt;post&lt;/a&gt;), but what will the performance hit be for Apple Silicon?&lt;/p&gt;

&lt;p&gt;All in all, upcoming Apple Silicon doesn’t seem like an immediate win for my specific problem with Docker performance. Also, I like to skip 1st gen hardware and wait on the sidelines a bit longer before I migrate my production workflows to new hardware running on ARM.&lt;/p&gt;

&lt;p&gt;Luckily I did find a solution that serves me right away and might also help with the transition to Apple Silicon in the future. &lt;strong&gt;Docker remote to the rescue!&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;remote-docker-host-solution&quot;&gt;Remote Docker host Solution&lt;/h3&gt;

&lt;p&gt;Instead of beefing up my local development machine now or with upcoming Apple ARM hardware, I looked into off-loading all the Docker activities onto a remote machine, and as it turns out, it is trivially easy to setup access to a remote docker host. I kinda knew about this, back when I was using Docker Swarm and connecting to different machines, but I somehow never thought about this as a setup for my “local” docker environment.&lt;/p&gt;

&lt;p&gt;Needless to say, but one does not setup remote access without a remote machine, so I’m assuming you have a remote Linux machine running somewhere. I personally use and recommend dedicated or cloud servers from &lt;a href=&quot;https://www.hetzner.com/&quot;&gt;Hetzner&lt;/a&gt;, that is if you are located in Europe. I’m using the &lt;a href=&quot;https://www.hetzner.com/dedicated-rootserver/ax51-nvme&quot;&gt;AX51-NVMe&lt;/a&gt; Dedicated Root Server (Ryzen 7 3700X CPU, 64GB RAM, 1TB NVMe SSD), which seems comically cheap at only 59 Euros a month. Anyway, let’s get rolling.&lt;/p&gt;

&lt;h4 id=&quot;1-install-docker-engine-on-remote-host&quot;&gt;1. Install Docker Engine on remote host&lt;/h4&gt;
&lt;p&gt;First, let’s install Docker on your remote Linux server (I’m using the &lt;a href=&quot;https://docs.docker.com/engine/install/ubuntu/&quot;&gt;Ubunty install instructions&lt;/a&gt;, but you can find instructions for other distros on that page as well):&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt; &lt;span class=&quot;c&quot;&gt;## Update the apt package index and install packages&lt;/span&gt;
 &lt;span class=&quot;c&quot;&gt;## to allow apt to use a repository over HTTPS:&lt;/span&gt;
 &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt-get update

 &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt-get &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
     apt-transport-https &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
     ca-certificates &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
     curl &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
     gnupg-agent &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
     software-properties-common

 &lt;span class=&quot;c&quot;&gt;## Add Docker’s official GPG key:&lt;/span&gt;
 &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;curl &lt;span class=&quot;nt&quot;&gt;-fsSL&lt;/span&gt; https://download.docker.com/linux/ubuntu/gpg | &lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt-key add -

 &lt;span class=&quot;c&quot;&gt;## Use the following command to set up the stable repository&lt;/span&gt;
 &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;add-apt-repository &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;s2&quot;&gt;&quot;deb [arch=amd64] https://download.docker.com/linux/ubuntu &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;lsb_release &lt;span class=&quot;nt&quot;&gt;-cs&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;
    stable&quot;&lt;/span&gt;

 &lt;span class=&quot;c&quot;&gt;## Install docker engine&lt;/span&gt;
 &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt-get update
 &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt-get &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;docker-ce docker-ce-cli containerd.io&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h4 id=&quot;2-create-docker-context&quot;&gt;2. Create Docker Context&lt;/h4&gt;

&lt;p&gt;Next up we need to access the remote Docker host and make it our default “local” engine. For this we leverage &lt;strong&gt;Docker Contexts&lt;/strong&gt; in the following way. First we create a context that will hold the connection path (e.g. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ssh://coen@whatever.com&lt;/code&gt;) to the remote docker host:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt; &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;docker context create remote &lt;span class=&quot;nt&quot;&gt;--docker&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;ssh://coen@whatever.com
 remote
 Successfully created context “remote”

 &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;docker context &lt;span class=&quot;nb&quot;&gt;ls
 &lt;/span&gt;NAME       TYPE    DESCRIPTION              DOCKER ENDPOINT    KUBERNETES ENDPOINT    ORCHESTRATOR
 default &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;  moby    Current DOCKER_HOST...   unix:///var/run/docker.sock               swarm
 remote     moby                             ssh://coen@whatever.com&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;And the final step is to make &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;remote&lt;/code&gt; your default context:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt; &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;docker context use remote
 remote
 Current context is now “remote”&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h4 id=&quot;3-using-your-remote-docker-host&quot;&gt;3. Using your remote Docker host&lt;/h4&gt;

&lt;p&gt;With the previous 2 steps you are ready to start enjoying a &lt;strong&gt;silent&lt;/strong&gt; local development machine when you are building docker images with an increased speed in build time! Any time you now run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker build&lt;/code&gt;, all the relevant (and changed) files that are required for the build are copied from your local computer to the remote Docker host in the background, and the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker build&lt;/code&gt; starts the build of the image on the remote host. The resulting image is also located on the remote host, which you can list with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker images&lt;/code&gt;, as all docker commands use the default &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;remote&lt;/code&gt; context.&lt;/p&gt;

&lt;h3 id=&quot;benefits&quot;&gt;Benefits&lt;/h3&gt;

&lt;p&gt;To show you an example of Docker build speed improvements, let’s have a look at the following time measurements for building the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;web&lt;/code&gt; service component, a React SPA build with Webpack, of &lt;a href=&quot;https://github.com/bedrockio/bedrock-core/tree/master/services/web&quot;&gt;bedrock&lt;/a&gt; on a clean build:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;  +---------+-------------------+--------------------+------------+---------------+
  | Context | Yarn &lt;span class=&quot;nb&quot;&gt;install time&lt;/span&gt; | Webpack build &lt;span class=&quot;nb&quot;&gt;time&lt;/span&gt; | Total &lt;span class=&quot;nb&quot;&gt;time&lt;/span&gt; | Relative &lt;span class=&quot;nb&quot;&gt;time&lt;/span&gt; |
  +---------+-------------------+--------------------+------------+---------------+
  | Local   | 75.82s            | 82.05s             | 157.87s    | 296% &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;~3x&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;    |
  +---------+-------------------+--------------------+------------+---------------+
  | Remote  | 18.19s            | 35.11s             |  53.30s    | 100% &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;1x&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;     |
  +---------+-------------------+--------------------+------------+---------------+&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Of course a 3x improvement doesn’t come as a surprise when you are basically comparing a Macbook Pro with 2 (virtual) CPUs allocated to Docker, versus an 8 core dedicated Linux machine (with hyperthreading and higher internet bandwidth) even though not everything runs multi-threaded. But it is a big improvement that you can quickly and easily get for yourself and reap the benefits, which quickly adds up over time. Not to mention the complete silence at which you gain the faster build times.&lt;/p&gt;

&lt;p&gt;As a bonus, you can now stop running Docker Desktop entirely, and no longer see a Docker process “idling” in the background that would otherwise still be using around 20% CPU all the time (doing nothing).&lt;/p&gt;

&lt;p&gt;Being able to build X86_64 images on a remote machine, incidentally also makes it more viable to migrate my development environment to Apple Silicon in the future, not depending on Apple ARM to build and run my X86_64 images.&lt;/p&gt;

&lt;p&gt;Finally, of course you can also &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker run&lt;/code&gt; containers on your remote host. For example running MongoDB:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt; &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;docker run &lt;span class=&quot;nt&quot;&gt;--name&lt;/span&gt; mongo &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; 27017:27017 &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; /root/data:/data/db mongo:4.2.8
 &lt;span class=&quot;c&quot;&gt;# Note: /root/data is located on your remote machine&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;In order to access and use the running MongoDB container locally, make sure to SSH tunnel to your remote machine and forward the relevant ports. For this you can update your SSH config file: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.ssh/config&lt;/code&gt;:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;Host coentunnel
  HostName whatever.com
  User coen
  ForwardAgent &lt;span class=&quot;nb&quot;&gt;yes
  &lt;/span&gt;ServerAliveInterval 60
  ServerAliveCountMax 10
  LocalForward 27017 localhost:27017 &lt;span class=&quot;c&quot;&gt;# Mongo&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;A big word of &lt;strong&gt;caution&lt;/strong&gt; here is to make sure you firewall your ports properly on your remote server, because Docker is known to &lt;a href=&quot;https://github.com/docker/for-linux/issues/690&quot;&gt;bypass ufw firewall rules&lt;/a&gt;!!!&lt;/p&gt;

&lt;h3 id=&quot;downsides&quot;&gt;Downsides&lt;/h3&gt;

&lt;p&gt;Using a remote Docker host works really well for me, but there are a couple of downsides to this approach:&lt;/p&gt;

&lt;p&gt;The first one would be “added complexity &amp;amp; dependency”, because now you have added an extra machine to your development environment that you need to keep up-to-date and secure. Especially if you also use it to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker run&lt;/code&gt; containers for local development.&lt;/p&gt;

&lt;p&gt;Secondly, if you use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker-compose&lt;/code&gt; for local development (often used to inject your live code changes), then you cannot map your local drive into the docker containers, as the mounted volumes will be pointing to folders on your remote machine. You can find more information about how to deploy on remote Docker hosts with docker-compose &lt;a href=&quot;https://www.docker.com/blog/how-to-deploy-on-remote-docker-hosts-with-docker-compose/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Last but not least, remote servers are not free, so there is an additional cost involved. However, as pointed out earlier, &lt;a href=&quot;https://hetzner.com&quot;&gt;Hetzner&lt;/a&gt; is a very cheap server provider you can use, or you can start with any other small cloud instance (e.g. AWS, Google, etc). I guess that a lot of developers actually already run a Linux box somewhere (often for testing) that they can use as their remote docker host too.&lt;/p&gt;

&lt;h3 id=&quot;wrap-up&quot;&gt;Wrap up&lt;/h3&gt;

&lt;p&gt;As an Apple enthusiast, I don’t see myself switching to a local Linux development computer anytime soon, but I was kind of annoyed with the lack of macOS Docker performance and noisy CPU fans when building images.&lt;/p&gt;

&lt;p&gt;Having a hard time believing that the upcoming switch to Apple Silicon will alleviate this issue (still hope for the best, but prepare for the worst), I was happy that I found a solution by introducing a remote Docker host, which was trivially easy to setup and use with Docker Contexts. Sometimes a small change can have a big impact.&lt;/p&gt;

&lt;p&gt;IMHO the benefits I described in this article more than make up for the downsides. Hopefully this may benefit you too. If you have any suggestions for improvements, then please let me know!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Jekyll and Algolia search integration</title>
   <link href="http://beatletech.com/2020/08/16/jekyll-and-algolia-search-integration"/>
   <updated>2020-08-16T00:00:00+02:00</updated>
   <id>http://beatletech.com/2020/08/16/jekyll-and-algolia-search-integration</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;https://beatletech.com/images/jekyll-and-algolia.png&quot; alt=&quot;Algolia&quot; width=&quot;98%&quot; title=&quot;Jekyll and Algolia&quot; style=&quot;margin-left:0px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Recently I decided to add search functionality to my &lt;a href=&quot;https://beatletech.com&quot;&gt;BeatleTech&lt;/a&gt; site (indeed, the one you are visiting right now). Not because I needed my readers to filter through the overwhelming number of articles I have written here (which I have not), but simply because I thought it would be a cool feature that would bring some nice interactivity to the site and to spark my ambition to write more blog posts going forward.&lt;/p&gt;

&lt;p&gt;In this article I will explain &lt;strong&gt;why&lt;/strong&gt; I picked &lt;a href=&quot;https://www.algolia.com/&quot;&gt;Algolia Search&lt;/a&gt; and &lt;strong&gt;how&lt;/strong&gt; it was integrated with this &lt;a href=&quot;https://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt; generated static site, including some interesting improvements.&lt;/p&gt;

&lt;h3 id=&quot;why-algolia-search&quot;&gt;Why Algolia Search?&lt;/h3&gt;

&lt;p&gt;While tinkering a bit with the design and layout of this site during a rainy day at a Dutch campsite, I was looking for an easy Jekyll plugin to bring search to my website. Although I have a lot of experience in working directly with &lt;a href=&quot;https://www.elastic.co/&quot;&gt;Elasticsearch&lt;/a&gt;, I didn’t want to go down a route of building and deploying everything from scratch. While certainly a nice exercise, this would definitely take too much time and maintenance down the line, which wouldn’t be worth it (yet) looking at the traffic statistics. So, like I said, looking for something easy and quick to get up and running within a day.&lt;/p&gt;

&lt;p&gt;After some Google search queries, I quickly stumbled upon some people recommending Algolia at the &lt;a href=&quot;https://talk.jekyllrb.com/t/how-to-add-a-search-bar/606/7&quot;&gt;Jekyll talk&lt;/a&gt; discussion board.&lt;/p&gt;

&lt;p&gt;Digging into Algolia, I found the following compelling reasons to integrate with Algolia Search:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Known brand&lt;/strong&gt;. It turns out I was already quite familiar (and satisfied) with Algolia Search as a consumer of &lt;a href=&quot;https://hn.algolia.com/&quot;&gt;Hacker News Search&lt;/a&gt; which is powered by Algolia.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Free tier&lt;/strong&gt;. They recently (July 1st) introduced more &lt;a href=&quot;https://blog.algolia.com/introducing-algolias-most-customer-friendly-pricing/&quot;&gt;customer-friendly pricing&lt;/a&gt; with a starting free tier as long as you would show the “Search by Algolia” next to your search results. Also with reasonable pricing when I need to scale up.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Great documentation&lt;/strong&gt;. Their &lt;a href=&quot;https://community.algolia.com/jekyll-algolia/getting-started.html&quot;&gt;Getting started&lt;/a&gt; is clear, complete and up-to-date.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Open source&lt;/strong&gt;. &lt;a href=&quot;https://github.com/algolia/jekyll-algolia&quot;&gt;Jekykll Algolia Plugin&lt;/a&gt; for indexing Jekyll posts&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;UI Template&lt;/strong&gt;. Template with UI component using &lt;a href=&quot;https://community.algolia.com/instantsearch.js/&quot;&gt;instantsearch.js&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Example project&lt;/strong&gt;. Github project &lt;a href=&quot;https://github.com/algolia/jekyll-algolia-example&quot;&gt;jekyll-algolia-example&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;how-to-integrate-algolia-and-jekyll&quot;&gt;How to integrate Algolia and Jekyll?&lt;/h3&gt;

&lt;p&gt;To integrate with Jeyll we first need to install and run the &lt;a href=&quot;https://github.com/algolia/jekyll-algolia&quot;&gt;jekyll-algolia-plugin&lt;/a&gt; to push the content of our Jekyll website to our Algolia index. Secondly we need to update our HTML with templating and &lt;a href=&quot;https://community.algolia.com/instantsearch.js/&quot;&gt;Instantsearch.js&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id=&quot;1-pushing-content-to-your-algolia-index&quot;&gt;1. Pushing content to your Algolia index&lt;/h4&gt;

&lt;p&gt;This is a simple three step process, as lined out in the README of the &lt;a href=&quot;https://github.com/algolia/jekyll-algolia&quot;&gt;jekyll-algolia-plugin&lt;/a&gt; repository. First add the jekyll-algolia gem to your Gemfile, after which you run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle install&lt;/code&gt; to fetch all the dependencies:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;  &lt;span class=&quot;c1&quot;&gt;# Gemfile&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;group&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:jekyll_plugins&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;gem&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;jekyll-algolia&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;~&amp;gt; 1.0&apos;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Next, add your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;application_id&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;index_name&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;search_only_api_key&lt;/code&gt; to the Jekyll &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_.config.yml&lt;/code&gt; file:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-yaml&quot; data-lang=&quot;yaml&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;  &lt;span class=&quot;c1&quot;&gt;# _.config.yaml&lt;/span&gt;

  &lt;span class=&quot;na&quot;&gt;algolia&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;application_id&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;your_application_id&apos;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;index_name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;your_indexname&apos;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;search_only_api_key&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;2b61f303d605176b556cb377d5ef3acd&apos;&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Finally, get your private Algolia admin key (which you can find in your Algolia dashboard) and run the following to execute the indexing:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;  &lt;span class=&quot;nv&quot;&gt;ALGOLIA_API_KEY&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;your_admin_api_key&apos;&lt;/span&gt; bundle &lt;span class=&quot;nb&quot;&gt;exec &lt;/span&gt;jekyll algolia&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h4 id=&quot;2-adding-instantsearchjs-to-the-front-end&quot;&gt;2. Adding instantsearch.js to the front-end&lt;/h4&gt;

&lt;p&gt;For the front-end part I followed the excellent Algolia community &lt;a href=&quot;https://community.algolia.com/jekyll-algolia/blog.html&quot;&gt;tutorial&lt;/a&gt;. Instead of repeating all the documented steps here, I’ll only highlight the relative changes I made.&lt;/p&gt;

&lt;p&gt;The integration consists of two parts:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;A &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;search-hits-wrapper&lt;/code&gt; div element where we load the search results. These results are located front and center under the navigation bar (pushing the rest of the content down).&lt;/li&gt;
  &lt;li&gt;The instantsearch.js dependency, template configuration and styling. All of which is located in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_includes/algolia.html&lt;/code&gt; file, which can be viewed in full in the &lt;a href=&quot;https://github.com/beatlevic/beatletech/blob/master/_includes/algolia.html&quot;&gt;source code&lt;/a&gt; of this site.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I made the following changes compared to the community tutorial:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Hide Search results by default (style=”display:none”) and don’t fire off an empty query that returns all articles.&lt;/strong&gt; The default empty query returns all articles and to mitigate this I added a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;searchFunction&lt;/code&gt; to the instantsearch options:&lt;/li&gt;
&lt;/ul&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot; data-lang=&quot;javascript&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;  &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;search&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;instantsearch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;appId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;K4MUG7LHCA&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;apiKey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;2b61f303d605176b556cb377d5ef3acd&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// public read-only key&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;indexName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;prod_beatletech&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;searchFunction&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;function &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;helper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;searchResults&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;search-hits-wrapper&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;if &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;helper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;query&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;searchResults&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;display&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;none&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;nx&quot;&gt;searchResults&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;display&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;helper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;query&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;block&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;none&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;nx&quot;&gt;helper&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Don’t fire off a query on every keystroke.&lt;/strong&gt; While the default of triggering a search query with every keystroke is great in terms of responsiveness, it will also help you burn quickly through your free 10k search requests. In order to trade off query responsiveness for less api requests, I added the following &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;queryHook&lt;/code&gt; with a 500ms delay:&lt;/li&gt;
&lt;/ul&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot; data-lang=&quot;javascript&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;  &lt;span class=&quot;nx&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;addWidget&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;instantsearch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;widgets&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;searchBox&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;container&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;#search-searchbar&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;placeholder&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;Search into posts...&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;poweredBy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;autofocus&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;showLoadingIndicator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;nf&quot;&gt;queryHook&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;refine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nf&quot;&gt;clearTimeout&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;timerId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;timerId&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;setTimeout&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;refine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;500&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Show “Search by Algolia” badge.&lt;/strong&gt; If you want to make use of the free plan, they ask you in exchange that you display a “Search by Algolia” logo next to your search results. You can use the Instantsearch searchBox options Boolean flag &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;poweredBy&lt;/code&gt; or if you want more flexibility, as I did, you can find different versions of their logo &lt;a href=&quot;https://www.algolia.com/press/?section=brand-guidelines&quot;&gt;here&lt;/a&gt; and add it to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;search-hits-wrapper&lt;/code&gt; div.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Turn off autofocus&lt;/strong&gt;. Add and set the searchBox option &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;autofocus&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;false&lt;/code&gt; if you don’t want the input search to autofocus. While I at first liked the autofocus, because the user can immediately type their search query, it turns out on mobile devices you automatically zoom in on the search input field. So I recommend turning it off.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;experience-so-far&quot;&gt;Experience so far&lt;/h3&gt;

&lt;p&gt;I really liked the whole integration process, which was really smooth and not much work. I mean, I even went as far as to write all about it here. 🙂&lt;/p&gt;

&lt;p&gt;One additional benefit of Algolia, which I haven’t listed yet, is gaining statistics on your site’s search queries with weekly email updates and an interactive dashboard. Helping you figure out what your readers and followers are looking for.&lt;/p&gt;

&lt;p&gt;I am using the slightly older v2 of instantsearch.js, so at some point I will want to update to the latest version, which will decrease to javascript library size. Running &lt;a href=&quot;https://developers.google.com/speed/pagespeed/insights/?hl=nl&quot;&gt;PageSpeed Insights&lt;/a&gt; is still get a very comfortable 96/100 score, so there is no immediate need, but less is more when it comes to JS dependencies.&lt;/p&gt;

&lt;p&gt;If my search query volume increases above the free 10k a month, then I’m happy to pay for this service. I do have one feature request for the Algolia team for the paid service, which is adding a monthly payment limit with alerting, to make sure you won’t get any surprise overcharge bill.&lt;/p&gt;

&lt;p&gt;Anyway, so far a big thumbs up for Algolia. 👍&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://news.ycombinator.com/item?id=24181472&quot;&gt;HN Discussion&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Chief Architect at Rekall.ai</title>
   <link href="http://beatletech.com/2019/09/02/chief-architect-at-rekall-ai"/>
   <updated>2019-09-02T00:00:00+02:00</updated>
   <id>http://beatletech.com/2019/09/02/chief-architect-at-rekall-ai</id>
   <content type="html">&lt;p&gt;For the past year I have been working as Tech Lead at &lt;a href=&quot;https://www.airfranceklm.com/en/group&quot;&gt;Air France - KLM&lt;/a&gt;, in the ODS (Operations Decision Support) department. My team was responsible for the on-premise Amsterdam Data Lake, developing ETL pipelines with Spark streaming jobs in Scala, including data modeling of the source system (events) and coordinating with the Data Science team.&lt;/p&gt;

&lt;p&gt;The on-premise Hadoop cluster was based on Hortonworks HDP, including Spark, HBase, Kafka and Hive. There was a lot of work involved in configuring and managing the on-premise cluster, and we would spend more time than we would like on infrastructure related issues. Based on my previous cloud experiences I started advocating for a push to Azure Cloud (as KLM already had Azure Active Directory and Office 365) for the Data Lake, and started working on the required Architecture design and proposal.&lt;/p&gt;

&lt;p&gt;Even though I really liked learning the enormous organization (with two distinct cultures) in order to navigate my way to get in contact with the right people to make Cloud happen, all the way up to CTO and VP levels. I came across another opportunity outside of KLM to work in an environment that was more startup like, more agile, and changing faster with more direct personal impact on the course of the company.&lt;/p&gt;

&lt;p&gt;This new opportunity, freelancing as Chief Architect at &lt;a href=&quot;https://rekall.ai&quot;&gt;Rekall.ai&lt;/a&gt; to work on data driven solutions powered by Blockchain and AI, is actually where I started today and I’m excited that I’m reunited with some of my former colleagues from &lt;a href=&quot;2015/02/09/bottlenose-series-b&quot;&gt;bottlenose.com&lt;/a&gt;! I’m looking forward to work with an elite team of highly experienced Developers, Designers and Biz Devs. It’s time to go full throttle!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://rekall.ai&quot;&gt;
&lt;img src=&quot;https://s3-eu-west-1.amazonaws.com/eu-west-1.beatletech.com/images/logo-rekall.png&quot; alt=&quot;Rekall.ai&quot; title=&quot;Chief Architect&quot; width=&quot;80px&quot; height=&quot;80px&quot; style=&quot;margin-left:0px&quot; /&gt;
&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>The post-Persgroep era</title>
   <link href="http://beatletech.com/2018/08/06/the-post-persgroep-era"/>
   <updated>2018-08-06T00:00:00+02:00</updated>
   <id>http://beatletech.com/2018/08/06/the-post-persgroep-era</id>
   <content type="html">&lt;p&gt;Last week I finished my job as Lead Data Engineer at the &lt;a href=&quot;https://persgroep.nl&quot;&gt;Persgroep&lt;/a&gt; in Amsterdam, where
I worked for the past year. I had a great time crafting ETL pipelines, writing Scala and Python for Spark (AWS
EMR), scheduling tasks (DAGs) with Airflow, and scaling with Redshift (Minus some boring, but important GDPR
work). But most of all I liked the (Kanban) team, which grew during my time from just 3 members to 15, and I
enjoyed coaching and helping out the new recruits, as well as providing technical support and architectural advise to other teams.&lt;/p&gt;

&lt;p&gt;So why leave my esteemed colleagues, when everything is fine and dandy? Can Christian van Thillo really do
without me? (Better known by insiders as Christiaan van de Thillo). Well, I have this tendency to shake things
up once in a while, and I felt the need to explore new startup opportunities. So here we are, I cleared my
schedule for the next half a year, and will be diving into Strong-AI, Genomics, Crypto and Healthcare to find
interesting (and doable) business angles. First I like to explore the latest research and follow a couple of
Coursera courses, while simultaneously hack on some neural nets for crypto value predictions. In other words,
playing around until I hit something concrete and tangible. I have a couple of friends that also have
available overtime to join in on the fun. I’m also keeping an ear to the ground for any other opportunities in
these domains.&lt;/p&gt;

&lt;p&gt;So what was the first thing I did last week with my free time? I updated my BeatleTech website, the site you
are actually reading right now! One of my TODOs was to run everything over https, now that Chrome by default
shows your website as not secure when it is served over http
(&lt;a href=&quot;https://www.theverge.com/2018/2/8/16991254/chrome-not-secure-marked-http-encryption-ssl&quot;&gt;news&lt;/a&gt;). This was
relatively easy to fix thanks to &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let’s Encrypt&lt;/a&gt; and
&lt;a href=&quot;https://certbot.eff.org/&quot;&gt;Certbot&lt;/a&gt;. As long as you know that Letsencrypt will verify your website over IPv6
if you added an AAAA DNS record, so make sure it points to the correct IPv6 address (mine wasn’t :/ so I
dropped the incorrect AAAA record).&lt;/p&gt;

&lt;p&gt;Secondly I was inspired by a Hacker News &lt;a href=&quot;https://news.ycombinator.com/item?id=17671490&quot;&gt;discussion&lt;/a&gt; on improving
your portfolio website, to include a section about my home office setup. I have spent many hours perfecting my
work setup, so it was only logical to also write about it. You can find it
&lt;a href=&quot;https://beatletech.com/Setup&quot;&gt;here&lt;/a&gt; and in the top menu.&lt;/p&gt;

&lt;p&gt;Finally after cleaning up my HTML, upgrading Jekyll, minimizing assets and moving them to S3
(&lt;a href=&quot;https://github.com/beatlevic/beatletech&quot;&gt;source&lt;/a&gt;), I’m concluding my stint on BeatleTech improvements with
this blog post. Next up, research and play time!&lt;/p&gt;

&lt;p&gt;Wish me luck.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Othot raises $1.7 Million</title>
   <link href="http://beatletech.com/2016/05/02/othot-raises-capital"/>
   <updated>2016-05-02T00:00:00+02:00</updated>
   <id>http://beatletech.com/2016/05/02/othot-raises-capital</id>
   <content type="html">&lt;p&gt;Great news for Othot as they just secured $1.7 Million in their first
round of outside financing. For more details and a shoutout for
Dr. Mark Voortman check out &lt;a href=&quot;http://markets.financialcontent.com/mng-ba.mercurynews/news/read?GUID=32015429&quot;&gt;MercuryNews&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>O Data Scientist, Where Art Thou?</title>
   <link href="http://beatletech.com/2015/09/10/o-data-scientist-where-art-thou"/>
   <updated>2015-09-10T00:00:00+02:00</updated>
   <id>http://beatletech.com/2015/09/10/o-data-scientist-where-art-thou</id>
   <content type="html">&lt;p&gt;&lt;strong&gt;&lt;em&gt;Note: This is a repost of my original blog post at
   &lt;a href=&quot;http://www.othot.com/o-data-scientist-where-art-thou/&quot;&gt;OThot&lt;/a&gt;, where I also work as Senior Data Scientist.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;By now you have probably heard about the &lt;strong&gt;“Big Data”&lt;/strong&gt; hype in one form [&lt;a href=&quot;http://www.wired.com/insights/2014/04/big-data-big-hype/&quot;&gt;1&lt;/a&gt;] or another [&lt;a href=&quot;http://www.forbes.com/sites/larrymyler/2015/07/29/big-data-is-a-big-problem-thats-getting-bigger/&quot;&gt;2&lt;/a&gt;], or read about how other companies are achieving success harnessing their data [&lt;a href=&quot;http://www.forbes.com/sites/howardbaldwin/2015/06/08/whos-ready-for-some-big-data-success-stories/&quot;&gt;3&lt;/a&gt;]. With all the attention for Big Data and the accompanied field of Data Science to make sense of the data, it would be no surprise if you want your company to benefit as well from one or more Data Scientists generating actionable insights from your ever-growing sea of data.&lt;/p&gt;

&lt;p&gt;When you are at this stage with your company and start to search for some great Data Scientists you will quickly find out that these people are in short supply. Now why is that? And why is it potentially dangerous if you simply want to bump or educate one of your company’s developers to a Data Scientist role if your search keeps turning up empty?&lt;/p&gt;

&lt;p&gt;The reason why Data Scientists are scarce is twofold. First off, the aforementioned Big Data hype with its growing need for Data Scientists (with the amount of data outgrowing the number of data analysts [&lt;a href=&quot;http://www.delphianalytics.net/wp-content/uploads/2013/04/GrowthOfDataVsDataAnalysts.png&quot;&gt;4&lt;/a&gt;]), is creating a high demand for Data Scientists. With many Data Science positions opening up, there is also the troublesome side effect of developers starting to market themselves as Data Scientists, while having zero to none of the required expertise.&lt;/p&gt;

&lt;p&gt;Secondly, and somewhat problematic, is the required skill set for a Data Scientist. Why problematic? Well, this is expressed clearly in the by now classic illustration of the Data Science skill set, the Data Science Venn Diagram [&lt;a href=&quot;http://drewconway.com/zia/2013/3/26/the-data-science-venn-diagram&quot;&gt;5&lt;/a&gt;]:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://s3-eu-west-1.amazonaws.com/eu-west-1.beatletech.com/images/Data_Science_VD.png&quot; alt=&quot;Data Science Venn Diagram&quot; style=&quot;margin-left:140px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The three main skills (indicated by the primary colors) are hacking skills, math and stats knowledge, and substantive expertise. What this implies is that you need to be a programmer and statistician, while also having a lot of experience in these fields and in the relevant problem domain and business context. Given that each of these skills on their own already poses a challenge when you want to find a great candidate, then searching for all of them combined in one person can send you on a wild goose chase.&lt;/p&gt;

&lt;p&gt;Earlier I mentioned the danger of turning developers (with hacking
skills) into Data Scientists, which if you look at the diagram, might
put you in the Danger Zone! Reason being that if you have hackers
without substantive Math and Statistics knowledge you &lt;em&gt;“[..] give people
the ability to create what appears to be a legitimate analysis without
any understanding of how they got there or what they have created”&lt;/em&gt; [&lt;a href=&quot;http://drewconway.com/zia/2013/3/26/the-data-science-venn-diagram&quot;&gt;5&lt;/a&gt;]. This could give rise to flat-out wrong business decisions based on wrong interpretations of the data.&lt;/p&gt;

&lt;p&gt;This is not meant to say that you cannot turn a developer into a Data Scientist, but rather that you have be aware that you also have to teach them the required math and statistics background. Or the other way around, you need to make sure that you are teaching your statisticians to gain better development skills. Nowadays there are many resources on the internet for learning Data Science [&lt;a href=&quot;https://www.dataquest.io/blog/how-to-actually-learn-data-science/&quot;&gt;6&lt;/a&gt;].  This will get you started, but it will take a lot of time and practice to gain enough experience for a desired level of proficiency.&lt;/p&gt;

&lt;p&gt;We believe there might be a better alternative to growing your own in-house Data Science team and that is to have OThot be of service. OThot can either take the Data Science challenge off your hands completely or complement your Data Scientists with substantial expertise in all required skills. So don’t hesitate to reach out if you want to know more about what &lt;a href=&quot;http://www.othot.com&quot;&gt;OThot&lt;/a&gt; has to offer!&lt;/p&gt;

&lt;h4 id=&quot;sources&quot;&gt;Sources&lt;/h4&gt;

&lt;p&gt;[1] &lt;a href=&quot;http://www.wired.com/insights/2014/04/big-data-big-hype/&quot;&gt;Big Data, Big Hype?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[2] &lt;a href=&quot;http://www.forbes.com/sites/larrymyler/2015/07/29/big-data-is-a-big-problem-thats-getting-bigger/&quot;&gt;Big Data Is A Big Problem That’s Getting Bigger&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[3] &lt;a href=&quot;http://www.forbes.com/sites/howardbaldwin/2015/06/08/whos-ready-for-some-big-data-success-stories/&quot;&gt;Who is ready for some big data success stories&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[4] &lt;a href=&quot;http://www.delphianalytics.net/wp-content/uploads/2013/04/GrowthOfDataVsDataAnalysts.png&quot;&gt;Growth of Data vs Growth of Data Analysts&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[5] &lt;a href=&quot;http://drewconway.com/zia/2013/3/26/the-data-science-venn-diagram&quot;&gt;The Data Science Venn Diagram&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[6] &lt;a href=&quot;https://www.dataquest.io/blog/how-to-actually-learn-data-science/&quot;&gt;How to actually learn data science&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>New Job at ThinkTopic</title>
   <link href="http://beatletech.com/2015/06/01/new-job-at-thinktopic"/>
   <updated>2015-06-01T00:00:00+02:00</updated>
   <id>http://beatletech.com/2015/06/01/new-job-at-thinktopic</id>
   <content type="html">&lt;p&gt;Two months ago a good friend of mine (&lt;a href=&quot;https://www.linkedin.com/in/rosejn&quot;&gt;Jeff Rose&lt;/a&gt;), who is a
former &lt;a href=&quot;http://deepmind.com/&quot;&gt;DeepMind&lt;/a&gt; engineer (acquired by Google), presented me with an
opportunity to come work at &lt;a href=&quot;http://thinktopic.com&quot;&gt;ThinkTopic&lt;/a&gt; to build intelligent tools for a big
publisher that involves image search, collaborative filtering, an intelligent catalog, and much more
by applying Deep Learning techniques for learning in Neural Networks. Additionally most development
work would be done in &lt;a href=&quot;http://clojure.org&quot;&gt;Clojure&lt;/a&gt; (a Lisp dialect on the JVM), which for me really
is the icing on the cake, being a longtime Clojure and functional programming fan.&lt;/p&gt;

&lt;p&gt;So after almost 4 years of working as Chief Architect and Data Scientist at
&lt;a href=&quot;http://bottlenose.com&quot;&gt;Bottlenose&lt;/a&gt;, I decided to take on this new challenge to start working for
ThinkTopic, of which today is my first day.&lt;/p&gt;

&lt;p&gt;I had a great time at Bottlenose working with a great group of people. It has been amazing to see
the company grow to where it is right now, and the potential of where it could go. Getting the
&lt;a href=&quot;http://beatletech.com/2015/02/09/bottlenose-series-b/&quot;&gt;KPMG investment&lt;/a&gt; has been a great milestone
and together with all the work over the years the idea of no longer being part of Bottlenose feels a
bit weird. Bottlenose has given me a lot in terms of experience, joy and friendships.&lt;/p&gt;

&lt;p&gt;Having said that, I’m keeping my desk at the Hackers and Founders building in Amsterdam, so I’m not
going cold turkey on my former colleagues (only switching rooms).&lt;/p&gt;

&lt;p&gt;I’m excited to go on this new ThinkTopic adventure, which for today means diving back into
Convolutional Neural Networks. May the fun and challenge begin.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://s3-eu-west-1.amazonaws.com/eu-west-1.beatletech.com/images/thinktopic-logo.png&quot; alt=&quot;ThinkTopic&quot; width=&quot;646&quot; height=&quot;195&quot; style=&quot;margin-left:60px&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Goodbye P-values, Hello Bayesian Statistics!</title>
   <link href="http://beatletech.com/2015/05/17/goodbye-pvalues-hello-bayesian-statistics"/>
   <updated>2015-05-17T00:00:00+02:00</updated>
   <id>http://beatletech.com/2015/05/17/goodbye-pvalues-hello-bayesian-statistics</id>
   <content type="html">&lt;p&gt;&lt;strong&gt;&lt;em&gt;Note: This is a repost of my original blog post at
   &lt;a href=&quot;http://www.othot.com/goodbye-p-values-hello-bayesian-statistics/&quot;&gt;Othot&lt;/a&gt;, where I also work as Senior Data Scientist.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In statistics there is the old and ongoing debate of Frequentism versus Bayesianism, which has been humorously depicted in the following popular XKCD cartoon [&lt;a href=&quot;http://www.xkcd.com/1132/&quot;&gt;1&lt;/a&gt;]:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://imgs.xkcd.com/comics/frequentists_vs_bayesians.png&quot; alt=&quot;Frequentism vs Bayesianism&quot; width=&quot;468&quot; heigth=&quot;709&quot; style=&quot;margin-left:150px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;In this cartoon we see the Frequentist statistician believing that the odds (p-value) of the
neutrino detector lying are below the (arbitrary) significance level of 0.05, saying that it is
unlikely that machine is lying, therefore concluding that the Sun must have exploded. The
Bayesianist on the other hand also takes his prior knowledge about the Sun into account and
determines that given the billions of years track record of the Sun not exploding vastly outweighs
the likelihood of the neutrino detector lying.&lt;/p&gt;

&lt;p&gt;The use of explicit priors with Bayesianism versus implicit priors with Frequentism (yes there are
priors, but they are fixed), is one difference most statisticians know about. However there are
actually more subtle differences that carry big consequences that can sometimes lead to
contradictive conclusions between the two approaches.&lt;/p&gt;

&lt;p&gt;The popular blogging site &lt;strong&gt;“Pythonic Perambulations”&lt;/strong&gt; has a great series of technical posts that give
a practical introduction to Frequentism and Bayesianism [&lt;a href=&quot;http://jakevdp.github.io/blog/2014/03/11/frequentism-and-bayesianism-a-practical-intro/&quot;&gt;2&lt;/a&gt;], which are highly recommended. In this
series Jake Vanderplas explains with great clarity the differences, which are summarized as follows:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Frequentists and Bayesians disagree about the definition of probability&lt;/li&gt;
  &lt;li&gt;Frequentism considers probabilities to be objective and related to frequencies of real or hypothetical events&lt;/li&gt;
  &lt;li&gt;Bayesianism considers probabilities to be subjective and measures degrees of knowledge or belief&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a result he explains: &lt;em&gt;“[..] frequentists consider model parameters to be fixed and data to be
random, while Bayesians consider model parameters to be random and data to be fixed.”&lt;/em&gt; [&lt;a href=&quot;http://jakevdp.github.io/blog/2014/06/12/frequentism-and-bayesianism-3-confidence-credibility/&quot;&gt;3&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;This actually has far stretching consequences for the use of Frequentism in Science, where you most
often have one dataset (i.e., fixed data) for which you want to make inferences, and you are not
interested in inferences for hypothetical other datasets. Using Frequentism in science answers the
wrong question, because you want answers for your specific dataset. Therefore the use of p-values
and confidence intervals in this context are useless.&lt;/p&gt;

&lt;p&gt;But you might ask, why then is the use of p-values the de facto standard in scientific research, if
it is fundamentally wrong? Good question. The problem is that confidence intervals are easy to
compute and often give similar results to the Bayesian approach. This doesn’t change the fact that
the approach is flat out invalid, and doesn’t support the conclusions made.&lt;/p&gt;

&lt;p&gt;Recently the science community started acknowledging this fact and we are now starting to see
journals, e.g., &lt;strong&gt;“Basic and Applied Social Psychology”&lt;/strong&gt; [&lt;a href=&quot;http://www.tandfonline.com/doi/abs/10.1080/01973533.2015.1012991&quot;&gt;4&lt;/a&gt;], where research using p-values is being
rejected. This has not gone unnoticed as both Nature, the international weekly journal of Science,
as well as Scientific American, wrote about it in depth and both proposed Bayesian statistics as a
good alternative. [&lt;a href=&quot;http://www.nature.com/news/statistics-p-values-are-just-the-tip-of-the-iceberg-1.17412&quot;&gt;5&lt;/a&gt;][&lt;a href=&quot;http://www.scientificamerican.com/article/scientists-perturbed-by-loss-of-stat-tools-to-sift-research-fudge-from-fact&quot;&gt;6&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;The Scientific American article adds the following about p-values, and confirms the aforementioned
hypothetical other datasets problem with Frequentism:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;“Unfortunately, p-values are also widely misunderstood, often believed to furnish more
information than they do. Many researchers have labored under the misbelief that the p-value gives
the probability that their study’s results are just pure random chance. But statisticians say the
p-value’s information is much more non-specific, and can interpreted only in the context of
hypothetical alternative scenarios: The p-value summarizes how often results at least as extreme as
those observed would show up if the study were repeated an infinite number of times when in fact
only pure random chance were at work. This means that the p-value is a statement about imaginary
data in hypothetical study replications, not a statement about actual conclusions in any given
study”&lt;/em&gt;
[&lt;a href=&quot;http://www.scientificamerican.com/article/scientists-perturbed-by-loss-of-stat-tools-to-sift-research-fudge-from-fact&quot;&gt;6&lt;/a&gt;]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Needless to say, but at &lt;a href=&quot;http://www.othot.com&quot;&gt;Othot&lt;/a&gt; we are big proponents of the Bayesian approach for statistical inferences. In a previous blog post by Mark Voortman [&lt;a href=&quot;http://www.othot.com/what-do-searching-for-a-plane-and-a-doctors-diagnosis-have-in-common&quot;&gt;7&lt;/a&gt;], we already started talking and explaining the Bayesian approach and you can safely bet to expect more of that.&lt;/p&gt;

&lt;h4 id=&quot;sources&quot;&gt;Sources&lt;/h4&gt;

&lt;p&gt;[1] XKCD: Frequentists vs. Bayesians &lt;a href=&quot;http://www.xkcd.com/1132/&quot;&gt;http://www.xkcd.com/1132/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[2] Frequentism and Bayesianism: A Practical Introduction
&lt;a href=&quot;http://jakevdp.github.io/blog/2014/03/11/frequentism-and-bayesianism-a-practical-intro/&quot;&gt;http://jakevdp.github.io/blog/2014/03/11/frequentism-and-bayesianism-a-practical-intro/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[3] Frequentism and Bayesianism III: Confidence, Credibility, and why Frequentism and Science do not Mix
&lt;a href=&quot;http://jakevdp.github.io/blog/2014/06/12/frequentism-and-bayesianism-3-confidence-credibility/&quot;&gt;http://jakevdp.github.io/blog/2014/06/12/frequentism-and-bayesianism-3-confidence-credibility/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[4] Journal of Basic and Applied Social Psychology &lt;a href=&quot;http://www.tandfonline.com/doi/abs/10.1080/01973533.2015.1012991&quot;&gt;http://www.tandfonline.com/doi/abs/10.1080/01973533.2015.1012991&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[5] Statistics: P values are just the tip of the iceberg &lt;a href=&quot;http://www.nature.com/news/statistics-p-values-are-just-the-tip-of-the-iceberg-1.17412&quot;&gt;http://www.nature.com/news/statistics-p-values-are-just-the-tip-of-the-iceberg-1.17412&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[6] Scientists Perturbed by Loss of Stat Tools to Sift Research Fudge from Fact &lt;a href=&quot;http://www.scientificamerican.com/article/scientists-perturbed-by-loss-of-stat-tools-to-sift-research-fudge-from-fact&quot;&gt;http://www.scientificamerican.com/article/scientists-perturbed-by-loss-of-stat-tools-to-sift-research-fudge-from-fact&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[7] What Do Searching For a Plane and a Doctor’s Diagnosis Have in Common? &lt;a href=&quot;http://www.othot.com/what-do-searching-for-a-plane-and-a-doctors-diagnosis-have-in-common&quot;&gt;http://www.othot.com/what-do-searching-for-a-plane-and-a-doctors-diagnosis-have-in-common&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>My recent Coursera journey</title>
   <link href="http://beatletech.com/2015/02/11/coursera-courses"/>
   <updated>2015-02-11T00:00:00+01:00</updated>
   <id>http://beatletech.com/2015/02/11/coursera-courses</id>
   <content type="html">&lt;p&gt;In the past couple of months I managed to complete 4 online courses on
&lt;a href=&quot;http://coursera.com&quot;&gt;Coursera&lt;/a&gt;, which is an education platform that partners with top universities
to offer free &lt;a href=&quot;http://en.wikipedia.org/wiki/Massive_open_online_course&quot;&gt;MOOCs&lt;/a&gt; (Massive open online
courses). In this post I like to present you my experiences with these courses and my plans for any
future courses.&lt;/p&gt;

&lt;p&gt;The reason for me to start following online courses has to do with what I already pointed out in my
previous blog post “&lt;a href=&quot;http://beatletech.com/2015/02/03/my-system-to-win-big&quot;&gt;My System to Win Big&lt;/a&gt;”. I want to
keep on improving myself and acquire more knowledge in domains of my interest. Part of it is
revisiting knowledge I’m “supposed” to know to gain an even better understanding, and the other part
is exploring new uncharted territories. I also wanted to follow courses where I would have to
practice and hone my programming skills.&lt;/p&gt;

&lt;p&gt;But why follow online courses with a rigid schedule and deadlines if you can simply study books or solve some tough problems on
&lt;a href=&quot;https://projecteuler.net/&quot;&gt;Project Euler&lt;/a&gt; at your own pace? Well, for me as it turns out, having a fixed
course schedule releases me of the burden of planning and serves as a nice stick to finish on time,
which made it easier to get into the habit of spending evening hours on education. This way I didn’t
have to spend my will-power every time to get started, and now that I have grown this study habit and
with it the discipline to follow through, I’m in a much better position to also study at my own pace.&lt;/p&gt;

&lt;p&gt;The courses for which I have received statements of accomplishment are in chronological order:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.coursera.org/course/ml&quot;&gt;Machine Learning&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.coursera.org/course/algo&quot;&gt;Algorithms: Design and Analysis, Part 1&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.coursera.org/course/bioinformatics&quot;&gt;Bioinformatics Algorithms, Part 1&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.coursera.org/course/learning&quot;&gt;Learning How to Learn&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the subsequent sections I will describe each course and my experiences in more detail.&lt;/p&gt;

&lt;h3 id=&quot;courses&quot;&gt;Courses&lt;/h3&gt;
&lt;h4 id=&quot;machine-learning&quot;&gt;Machine Learning&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Overview:&lt;/strong&gt; &lt;em&gt;Stanford University // June-September 2014 // 12 weeks of study // 6 hours per week // &lt;a href=&quot;https://www.coursera.org/course/ml&quot;&gt;Coursera link&lt;/a&gt;&lt;/em&gt;
&lt;strong&gt;Difficulty:&lt;/strong&gt; &lt;em&gt;Easy&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Half a year ago at &lt;a href=&quot;http://bottlenose.com&quot;&gt;Bottlenose&lt;/a&gt; I was shifting from primarily a Software
Architect role to more of a Data Scientist role, and therefore spending more time on Machine
Learning problems. So I thought it was valuable to refresh my knowledge in this particular
domain. Besides reading up on some study books I decided to enroll in the Stanford Machine Learning
course, which presented a nice overview with some basic programming exercises. Topics included (as
listed on the Coursera page):&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Supervised learning (parametric/non-parametric algorithms, support vector machines, kernels,
neural networks).&lt;/li&gt;
  &lt;li&gt;Unsupervised learning (clustering, dimensionality reduction, recommender systems, deep learning).&lt;/li&gt;
  &lt;li&gt;Best practices in Machine Learning (bias/variance theory, innovation process in machine learning and AI).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Given that I was already very familiar with these topics, combined with an excellent presentation by
instructor &lt;a href=&quot;https://www.coursera.org/instructor/andrewng&quot;&gt;Andrew Ng&lt;/a&gt;, it may not come as a surprise that I found the
course easy to follow and the programming exercises not hard to implement with only the (frequent)
annoyances of coding in Matlab.&lt;/p&gt;

&lt;p&gt;It felt good to revisit all the topics in the course, which presented me once again with the wide
variety of Machine Learning approaches and techniques. Perhaps in hindsight other specialized
courses on Machine Learning on a more graduate level would have been more worthwhile. However, I
don’t regret my time spent on this course as it never hurts to go back to the basics once in a
while.  Additionally, as this was my first online course, it was a great way to get started with
Coursera and familiarize myself with this new educational format. And after finding out that it
worked really well for me, I instantly signed up for a lot of other (more specialized) courses.&lt;/p&gt;

&lt;h4 id=&quot;algorithms-design-and-analysis-part-1&quot;&gt;Algorithms: Design and Analysis, Part 1&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Overview:&lt;/strong&gt; &lt;em&gt;Stanford University // October-December 2014 // 6 weeks of study // 7 hours per week
// &lt;a href=&quot;https://www.coursera.org/course/algo&quot;&gt;Coursera link&lt;/a&gt;&lt;/em&gt;
&lt;strong&gt;Difficulty:&lt;/strong&gt; &lt;em&gt;Medium&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;After finishing the Machine Learning exercises in Matlab I wanted my next Coursera course to require
a “real” and more interesting programming language, and at the time I was already reading up on two
other programming languages that I liked to put into practice: &lt;a href=&quot;http://julialang.org/&quot;&gt;Julia&lt;/a&gt; and &lt;a href=&quot;http://www.rust-lang.org/&quot;&gt;Rust&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I was already aware of the “Algorithms: Design and Analysis” class, which two of my friends already
completed and recommended, thereby making it interesting candidate as my next course. Having finished a similar
course (in Java) during my study at Delft University I thought this course would be a walk in the park and a
good playground for testing the waters with Julia and Rust. At the same time I was starting with the
“Bioinformatics Algorithms” class, which also focused on implementing algorithms, but in the domain of biology
(more on Bioinformatics later). Both courses I started with Julia.&lt;/p&gt;

&lt;p&gt;I can honestly say that I really like the Julia language, which was born out of its creators wish to
have a programming language that is:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;… open source, with a liberal license. We want the speed of C with the
  dynamism of Ruby. We want a language that’s homoiconic, with true macros like Lisp, but with
  obvious, familiar mathematical notation like Matlab. We want something as usable for general
  programming as Python, as easy for statistics as R, as natural for string processing as Perl, as
  powerful for linear algebra as Matlab, as good at gluing programs together as the shell. Something
  that is dirt simple to learn, yet keeps the most serious hackers happy. We want it interactive and
  we want it compiled.
  (Blog:  &lt;a href=&quot;http://julialang.org/blog/2012/02/why-we-created-julia/&quot;&gt;Why we created Julia&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The first week’s programming assignment, a counting algorithm piggy backing on merge-sort, I also
implemented in Rust after finishing the Julia version. The Rust implementation was a painful
delivery, which was mostly me fighting the compiler and having a hard time finding clues on the web
due to a lot of breaking changes in Rust’s development towards the 1.0 release version. Add to that
the resulting performance being slower than with my Julia implementation, and I quickly decided to
leave Rust alone or at least until the language would be more stable (1.0 alpha was released Jan
2015).&lt;/p&gt;

&lt;p&gt;While I was getting the hang of Julia, I also started exploring possibilities to introduce the
language at &lt;a href=&quot;http://bottlenose.com&quot;&gt;Bottlenose&lt;/a&gt;, but found the language too immature just yet (at
version 0.3), especially compared with Python and its vast amount of available (scientific)
packages. It would have been interesting to complete the entire course in Julia, but I deemed it
more valuable to switch to Python along the way and perhaps revisit Julia again in a couple of
years from now.&lt;/p&gt;

&lt;p&gt;Let me now turn to the actual course contents after this (quite long)
Julia-Rust-experience-intermezzo. When I mentioned that I believed this course to be an easy ride, I
was actually quite mistaken. The lectures had a lot of technical and mathematical depth, and the
quizzes were often very challenging. You simply cannot fly through this course without a good
understanding of the introduced concepts, which are luckily very well presented by course instructor
&lt;a href=&quot;https://www.coursera.org/instructor/~214&quot;&gt;Tim Roughgarden&lt;/a&gt;. All in all I can highly recommend this
course for both expert and aspiring computer scientists for learning (or revisiting) several
fundamental principles of algorithm design, and I’m looking forward in participating in Part 2 of
this course later this year.&lt;/p&gt;

&lt;h4 id=&quot;bioinformatics-algorithms-part-1&quot;&gt;Bioinformatics Algorithms, Part 1&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Overview:&lt;/strong&gt; &lt;em&gt;UC San Diego // October 2014 - Feb 2015 // 10 weeks of study // 10 hours per week //
&lt;a href=&quot;https://www.coursera.org/course/bioinformatics&quot;&gt;Coursera link&lt;/a&gt;&lt;/em&gt;
&lt;strong&gt;Difficulty:&lt;/strong&gt; &lt;em&gt;Medium/Hard&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I always had a general interest in biology with genetics in particular, and if you combine this with
my interest in algorithms and Data Science, you can see why I had a course in bioinformatics high on
my wish list. Along came “Bioinformatics Algorithms” on Coursera and I could no longer resist
signing up and was eager to get started. The syllabus consists of chapters of the interactive text
book
&lt;a href=&quot;http://bioinformaticsalgorithms.com/&quot;&gt;“Bioinformatics Algorithms: an Active Learning Approach”&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Where in the Genome Does DNA Replication Begin? (Algorithmic Warmup)&lt;/li&gt;
  &lt;li&gt;How Do We Sequence Antibiotics? (Brute Force Algorithms)&lt;/li&gt;
  &lt;li&gt;Which DNA Patterns Act As Cellular Clocks? (Randomized Algorithms)&lt;/li&gt;
  &lt;li&gt;How Do We Assemble Genomes? (Graph Algorithms)&lt;/li&gt;
  &lt;li&gt;How Do We Compare Biological Sequences? (Dynamic Programming Algorithms)&lt;/li&gt;
  &lt;li&gt;Are There Fragile Regions in the Human Genome? (Combinatorial Algorithms)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In a way this was the “Algorithms: Design and Analysis” course all over again applied to the
biological domain. The practical application of the algorithms really made this course stand out for
me, and made all algorithms more tangible. The interactive book accompanied by the online lectures
had great production value and introduced concepts and terminology very well.&lt;/p&gt;

&lt;p&gt;The programming assignments throughout the book were the real meat of the course, and it is where
you will spend most (90%) of your time. Where most exercises were not too hard, there was still a
big chunk of problems that were very challenging. Sometimes due to the automated solution checker
that would be a bit too strict in the solutions it would accept (and no feedback on why you were
wrong), but mostly it were just hard problems to solve. Once you worked your way through the chapter
and finished all the exercises, the corresponding quiz was easy to pass.&lt;/p&gt;

&lt;p&gt;To get a statement of accomplishment you needed to score 70%, which is definitely doable. I went the
extra mile and focused on scoring above 85% for an accomplishment with distinction, which meant no
hiding from the difficult parts. In the end I was very proud that I achieved my statement of
accomplishment with distinction.&lt;/p&gt;

&lt;p&gt;I’m looking forward to part 2 of the course, which will start this month.&lt;/p&gt;

&lt;h4 id=&quot;learning-how-to-learn&quot;&gt;Learning How to Learn&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Overview:&lt;/strong&gt; &lt;em&gt;UC San Diego // January 2015 // 4 weeks of study // 2 hours per week // &lt;a href=&quot;https://www.coursera.org/course/learning&quot;&gt;Coursera link&lt;/a&gt;&lt;/em&gt;
&lt;strong&gt;Difficulty:&lt;/strong&gt; &lt;em&gt;Very easy&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When you are spending your spare time following online courses and you notice there isn’t enough
time in the week to follow all the courses you would like, you have to make choices. And it is not
only the choices that are difficult, you also want the courses that you decide to follow to have a
lasting impact and not be quickly forgotten when you are moving on to another course. This brings us
to the topic of how you can learn to learn more effectively, which is what the course “Learning how
to learn” has to offer.&lt;/p&gt;

&lt;p&gt;While the course is very easy and lacks real depth, it is still beneficial to at least watch the
lectures and the interviews, as there might be some tips and tricks you can pick up that will
improve your learning capabilities and help you overcome procrastination when it hits you.&lt;/p&gt;

&lt;p&gt;My key takeaway points are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Recall: A great way to improve your understanding and ability to form strong memories is to pause
for a moment after you have read some text, look away, and forcing yourself to recall what you
just read. Formulating your thoughts really helps, so talking and explaining to others is another
big plus.&lt;/li&gt;
  &lt;li&gt;Focus on “process” not “product”.&lt;/li&gt;
  &lt;li&gt;Make to-do lists for next day.&lt;/li&gt;
  &lt;li&gt;Exercise really helps when you get stuck on some hard problem. Shifting you focus can make your
subconscious and diffuse mode of thinking work for you in the background.&lt;/li&gt;
  &lt;li&gt;Skim through an article or paper to get a sense of of the context to help structuring new knowledge.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;whats-next&quot;&gt;What’s next?&lt;/h3&gt;

&lt;p&gt;In 2015 I want at least take the following courses, of which the first two are continuations of
two courses I already completed:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.coursera.org/course/algo2&quot;&gt;Algorithms: Design and Analysis, Part 2&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.coursera.org/course/bioinformatics2&quot;&gt;Bioinformatics Algorithms, Part 2&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.coursera.org/course/pgm&quot;&gt;Probabilistic Graphical Models&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Additionally I’m looking forward to follow more courses specialized in the field of bioinformatics
(e.g. genetics, bio-medicine, evolution, neuroscience) and Data Science (mining datasets, pattern
discovery, advanced statistics)&lt;/p&gt;

&lt;p&gt;I also want to finish
&lt;a href=&quot;https://www.coursera.org/course/linearprogramming&quot;&gt;Linear and Integer Programming&lt;/a&gt; of which I
already completed 2 out of 7 weeks, but discontinued the course due to time constraints of other
overlapping courses.&lt;/p&gt;

&lt;h3 id=&quot;tips&quot;&gt;Tips&lt;/h3&gt;

&lt;p&gt;I want to conclude with two tips for when you are going to embark on your own Coursera journey:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Do no take too many courses at once. It might seem sometimes that you could easily squeeze in
another course, but they often take more time than you anticipate. Additionally if you end up
stalling in one or more courses, you might get demotivated and stop all-together.&lt;/li&gt;
  &lt;li&gt;Find yourself some friends who are already following online courses or talk them into joining
you. Having a study group of like-minded individuals will really help you stay on course and make
the ride less lonely and a lot more fun.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Good luck with our own online education!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Bottlenose scores $13.4 Million</title>
   <link href="http://beatletech.com/2015/02/09/bottlenose-series-b"/>
   <updated>2015-02-09T00:00:00+01:00</updated>
   <id>http://beatletech.com/2015/02/09/bottlenose-series-b</id>
   <content type="html">&lt;p&gt;One and a half years after securing our
&lt;a href=&quot;http://beatletech.com/2013/07/30/bottlenose-secures-four-million/&quot;&gt;$3.6 Million&lt;/a&gt;
series A investment round to bring ‘Trendfluence’ to the enterprise, we are now
proud at &lt;a href=&quot;http://bottlenose.com&quot;&gt;Bottlenose&lt;/a&gt; to have raised (and
continue to raise) our series B round with a staggering amount of $13.4
Million, bringing the total raised funds north of $17 Million.&lt;/p&gt;

&lt;p&gt;Back in December we already disclosed that KPMG International took a
&lt;a href=&quot;http://www.prnewswire.com/news-releases/kpmg-capital-takes-equity-stake-in-bottlenose-a-pioneer-in-real-time-trend-intelligence-300005792.html&quot;&gt;“substantial equity share”&lt;/a&gt; in Bottlenose, but did not yet reveal the
size of the investment nor names of other investors that were ready to
follow KPMG Capital’s lead. Today Techcrunch reported on our Series B
round, listing our additional investors and describing our growing
capabilities in enterprise (real-time) stream data analytics. The
series B round is still open and we plan to raise significant venture
debt on top of the $13.4 million.&lt;/p&gt;

&lt;p&gt;At Bottlenose we have exciting times ahead of us.&lt;/p&gt;

&lt;p&gt;You can read the full story on &lt;a href=&quot;http://techcrunch.com/2015/02/09/bottlenose-series-b/&quot;&gt;Techcrunch&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>My System to Win Big</title>
   <link href="http://beatletech.com/2015/02/03/my-system-to-win-big"/>
   <updated>2015-02-03T00:00:00+01:00</updated>
   <id>http://beatletech.com/2015/02/03/my-system-to-win-big</id>
   <content type="html">&lt;p&gt;Back in January 2014 I read a book by Scott Adams (of Dilbert fame) titled:
&lt;a href=&quot;https://www.goodreads.com/book/show/17859574-how-to-fail-at-almost-everything-and-still-win-big&quot;&gt;“How to Fail at Almost Everything and Still Win Big”&lt;/a&gt;.
The book was brought to my attention when I was reading up on some interesting research and ideas on
passion and discipline (&lt;a href=&quot;https://www.youtube.com/watch?v=qwOdU02SE0w&quot;&gt;Carl Newport&lt;/a&gt; comes to mind,
explaining why following your passion is bad career advice). Reading Adam’s book definitely struck a
chord with me and even motivated me to change my work flow and long-held believes on what to focus on
in life. Two things stood out for me:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Passion is bullshit. It is only after you have put in the work and are lucky enough in having
success that passion comes, not before.&lt;/li&gt;
  &lt;li&gt;Goals are for losers. Systems are for winners.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before reading the book I have often asked myself questions like: What is my greatest passion and am I working
every day on the things I’m most passionate about? What kind of startup or company would fit my passion? I
often had a hard time trying to find the perfect answer to these questions, which resulted in
inertia to get started and in some cases I was setting myself up for ever higher and greater goals.&lt;/p&gt;

&lt;p&gt;Reading about the system approach as an alternative to goal setting made a lot of sense to me. The
system approach can be summarized as follows:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Create habits and reserve your will-power for learning new habits.&lt;/li&gt;
  &lt;li&gt;Reduce daily decisions to routine.&lt;/li&gt;
  &lt;li&gt;Avoid setting (high) goals, instead have a system that will keep you going&lt;/li&gt;
  &lt;li&gt;Keeping up your personal energy, which is your primary metric&lt;/li&gt;
  &lt;li&gt;Simplicity is key&lt;/li&gt;
  &lt;li&gt;A system will keep you going, also in moments of failure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One of the key points here is the creation of (good) habits and the discipline to carry it out. A
recent blog post titled:
&lt;a href=&quot;http://www.wisdomination.com/screw-motivation-what-you-need-is-discipline/&quot;&gt;“Screw motivation, what you need is discipline”&lt;/a&gt;
argues for the same point. It basically boils down to growing habits and not let yourself be driven by your emotional state.
So stop waiting until you feel good (enough) to start a particular task and get into the habit of allocating
time to just do stuff to get things done. Focus on the process (your system) and not the product
(deliverables and goals).&lt;/p&gt;

&lt;p&gt;While in general you want to be the most productive you can be, for me having a family with the third kid
on his way (due any moment now), you have to get even more organized and disciplined to get things
done. The way in which I manage this is what I want to present to you
next by outlining my system along several dimensions that Scott describes in his book. I have been adhering to this system for a full year and besides some
minor changes and occasional missteps I’m still following through and it has definitely made a
hugely positive impact on my life and productivity.&lt;/p&gt;

&lt;p&gt;Now without further ado, My System to Win Big:&lt;/p&gt;

&lt;h4 id=&quot;exercise&quot;&gt;Exercise&lt;/h4&gt;
&lt;p&gt;One or more of the following activities I do daily for at least 30 to 60 minutes&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Running&lt;/li&gt;
  &lt;li&gt;Sprinting&lt;/li&gt;
  &lt;li&gt;Push-ups / Sit-ups / Plank / Triceps-dips / 7-minute workout cycles (Honestly this is the one I
want to become more of a routine several days a week.)&lt;/li&gt;
  &lt;li&gt;Walking&lt;/li&gt;
  &lt;li&gt;Cycling&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;sports&quot;&gt;Sports&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Football (Soccer)&lt;/li&gt;
  &lt;li&gt;Kickboxing&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;sleep&quot;&gt;Sleep&lt;/h4&gt;
&lt;p&gt;Needless to say you need a good amount of sleep.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Go to bed before 00:00 (Yes, this one is hard if you do remote work for US companies from Europe)&lt;/li&gt;
  &lt;li&gt;sleep 8 hours&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;flexible-schedule&quot;&gt;Flexible schedule&lt;/h4&gt;
&lt;p&gt;Being flexible here means being in charge of your own schedule. Making a fixed planning and schedule for
things you want to do is highly recommended for young parents, as long as you are the one who chooses
to make time for it.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Plan holidays/time-off&lt;/li&gt;
  &lt;li&gt;Plan fixed slots for daily exercise and sports&lt;/li&gt;
  &lt;li&gt;Plan stuff that makes you want to get out of bed for it&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;diet&quot;&gt;Diet&lt;/h4&gt;
&lt;p&gt;I’m a big proponent of the Paleo lifestyle, and try to avoid as much processed foods as possible and
keeping it real.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Only occasionally bread/rice/potatoes&lt;/li&gt;
  &lt;li&gt;No Candy/Cookies/Chips&lt;/li&gt;
  &lt;li&gt;No Sodas&lt;/li&gt;
  &lt;li&gt;No Coffee&lt;/li&gt;
  &lt;li&gt;Occasionally alcohol (celebrations)&lt;/li&gt;
  &lt;li&gt;Meal skipping is good&lt;/li&gt;
  &lt;li&gt;Fasting once in a while is great (irregular intervals)&lt;/li&gt;
  &lt;li&gt;Snacks: nuts and fruits&lt;/li&gt;
  &lt;li&gt;Eating more vegetables by improving seasoning&lt;/li&gt;
  &lt;li&gt;Starches like Oatmeal&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;steadily-improving--skills&quot;&gt;Steadily improving / Skills&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Programming (Python, Clojure, Julia, Euler, Math)&lt;/li&gt;
  &lt;li&gt;Book reading / knowledge gathering&lt;/li&gt;
  &lt;li&gt;Blogging (on side-projects / programming)&lt;/li&gt;
  &lt;li&gt;Practicing playing the Piano (still a noob here)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.coursera.com&quot;&gt;Coursera courses&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;imagine-an-incredible-future&quot;&gt;Imagine an incredible future&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;related: stay optimistic and opportunistic&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;help-others&quot;&gt;Help others&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Be there for my kids and wife&lt;/li&gt;
  &lt;li&gt;Offer free advice and guidance for start-ups and companies&lt;/li&gt;
  &lt;li&gt;Engage at meetups and help people out&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;show-gratitude&quot;&gt;Show gratitude&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Value what you already have&lt;/li&gt;
  &lt;li&gt;Enjoy the moment&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;have-a-healthy-dose-of-stoicism&quot;&gt;Have a healthy dose of Stoicism&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Avoid the pursuit of materialistic goals and don’t get attached to stuff&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;final-words&quot;&gt;Final words&lt;/h3&gt;

&lt;p&gt;My system helped me become more productive and happier overall, which
may not yet be the fame and fortune that Scott Adams achieved, but it is
still a big win to me, and I’m ready when any big opportunity arises
in the future to take it head on.&lt;/p&gt;

&lt;p&gt;Of course my system isn’t perfect. Of course my system is tailored to suit me and can be different for you.
Of course I’m still failing every so often, but at least I have my system to hold on to and to
remind me how I want things to go. Get your self into the habit of working on what matters to you
and with a little bit of luck and serendipity you can win big too!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Project brAIn</title>
   <link href="http://beatletech.com/2014/09/03/project-brain"/>
   <updated>2014-09-03T00:00:00+02:00</updated>
   <id>http://beatletech.com/2014/09/03/project-brain</id>
   <content type="html">&lt;p&gt;After years of talking and thinking about creating our own Artificial Intelligence (AI), &lt;a href=&quot;http://linkedin.com/in/markvoortman&quot;&gt;Mark Voortman&lt;/a&gt; and I finaly decided a couple of months ago to actually start working on it. So project brAIn was born. With brAIn we have the modest goal to build an AI that will change the world as we know it. Using Deep Learning techniques we are building towards some cool applications.&lt;/p&gt;

&lt;p&gt;We have launched a new website and wrote an &lt;a href=&quot;http://br-ai-n.com/2014/09/03/introducing-brain/&quot;&gt;introductory post&lt;/a&gt; with more details on our goals and progress. So check out &lt;a href=&quot;http://br-ai-n.com&quot;&gt;br-ai-n.com&lt;/a&gt; and stay tuned for future posts!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://s3-eu-west-1.amazonaws.com/eu-west-1.beatletech.com/images/screenshot-brAIn-v0.0.2.png&quot; alt=&quot;br-ai-n.com&quot; height=&quot;485&quot; width=&quot;800&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Dokzorg.nl live!</title>
   <link href="http://beatletech.com/2013/10/12/dokzorg-live"/>
   <updated>2013-10-12T00:00:00+02:00</updated>
   <id>http://beatletech.com/2013/10/12/dokzorg-live</id>
   <content type="html">&lt;p&gt;A couple of weeks ago I ordered two dedicated machines at Hetzner for myself to develop and run some side projects on a Node.js/MongoDb/Elasticsearch stack.
While these are work in progress, I also finished moving BeatleTech.com to my new server (previously hosted by TransIp) and decided to help out my spouse by
building a website for her freelancing GP (Huisarts) practices. The end result is here today, as &lt;a href=&quot;http://dokzorg.nl&quot; target=&quot;blank&quot;&gt;Dokzorg.nl&lt;/a&gt; is live as of now.&lt;/p&gt;

&lt;p&gt;She basically wanted a simple landing page with just enough info to get potential employers excited and be findable on the web, without explicitly creating
an online presence by blogging and tweeting. We currently like the end result and hope others like it too. See below for a screenshot of the landing page, and follow &lt;a href=&quot;http://dokzorg.nl&quot; target=&quot;blank&quot;&gt;this link&lt;/a&gt; to check it out.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://s3-eu-west-1.amazonaws.com/eu-west-1.beatletech.com/images/dokzorg.png&quot; alt=&quot;Dokzorg.nl&quot; height=&quot;400&quot; width=&quot;720&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And now after spending some time front-end developing this project,
I’m looking forward to dive back in the other back-end projects I have going for which I can happily ignore HTML and CSS..&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Bottlenose secures $3.6 Million</title>
   <link href="http://beatletech.com/2013/07/30/bottlenose-secures-four-million"/>
   <updated>2013-07-30T00:00:00+02:00</updated>
   <id>http://beatletech.com/2013/07/30/bottlenose-secures-four-million</id>
   <content type="html">&lt;p&gt;Bottlenose just secured a $3.6 Million series A round to bring
‘Trendfluence’ to the Enterprise. With Bottlenose enterprise, while
currently in private beta, we already work with several large brands and
agencies (Pepsi, FleishmanHillard, Razorfish, and DigitasLBi) that
leverage Bottlenose Enterprise for tracking live and emerging trends
and events, directing advertising and marketing initiatives, engaging
customer communities and gathering industry intelligence.&lt;/p&gt;

&lt;p&gt;For the actual press release please check out &lt;a href=&quot;&amp;quot;http://www.novaspivack.com/business/bottlenose-series-a-to-bring-trendfluence-to-the-enterprise&amp;quot;&quot;&gt;Nova
Spivack’s blog&lt;/a&gt;
(Bottlenose CEO), or the Techcrunch &lt;a href=&quot;&amp;quot;http://techcrunch.com/2013/07/30/social-media-dashboard-bottlenose-raises-3-6m/&amp;quot;&quot;&gt;article&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If we can keep current momentum at &lt;a href=&quot;&amp;quot;http://bottlenose.com&amp;quot;&quot;&gt;Bottlenose&lt;/a&gt;, then we have a bright
future ahead of us.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Amsterdam Node meetup group</title>
   <link href="http://beatletech.com/2012/04/16/amsterdam-nodejs-meetup"/>
   <updated>2012-04-16T00:00:00+02:00</updated>
   <id>http://beatletech.com/2012/04/16/amsterdam-nodejs-meetup</id>
   <content type="html">&lt;p&gt;We (me and &lt;a href=&quot;http://dominiek.com/&quot;&gt;Dominiek ter Heide&lt;/a&gt;) started a new &lt;a href=&quot;http://www.meetup.com/amsnode/&quot;&gt;meetup group&lt;/a&gt; in Amsterdam
for anyone interested in Node.js. We had our first meetup 2 weeks ago,
where Dominiek gave a great introduction to Node, the guys from
Rockstart startup &lt;a href=&quot;http://beta.wercker.com/&quot;&gt;Wercker&lt;/a&gt;
(Continuous deployment made easy) gave a nice overview of all the Node
modules they use, and I gave a talk on when to use
Node and my lessons learned while using Node in my previously Y
combinator funded startup &lt;a href=&quot;http://newcope.com&quot;&gt;Newcope&lt;/a&gt; and in
my current job as Chief architect at &lt;a href=&quot;http://bottlenose.com&quot;&gt;Bottlenose&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We plan to have the Node meetup bi-monthly on the last Thursday of the
month, so the next meetup will be May 31th at 7:00PM. We
have some interesting speakers lined up so I hope to see you all at our
next or future meetups. You can follow any announcement on &lt;a href=&quot;http://www.meetup.com/amsnode/&quot;&gt;meetup.com&lt;/a&gt; of follow &lt;a href=&quot;http://twitter.com/amsnode&quot;&gt;us&lt;/a&gt; on Twitter.&lt;/p&gt;

&lt;div style=&quot;width:800px;text-align:center&quot; id=&quot;__ss_12232685&quot;&gt; &lt;strong style=&quot;display:block;margin:12px 0 4px&quot;&gt;&lt;a href=&quot;http://www.slideshare.net/beatlevic/when-to-use-node-lessons-learned&quot; title=&quot;When to use Node? Lessons learned&quot; target=&quot;_blank&quot;&gt;When to use Node? Lessons learned&lt;/a&gt;&lt;/strong&gt; &lt;iframe src=&quot;https://www.slideshare.net/slideshow/embed_code/12232685&quot; width=&quot;425&quot; height=&quot;355&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt; &lt;div style=&quot;padding:5px 0 12px&quot;&gt; View more &lt;a href=&quot;http://www.slideshare.net/&quot; target=&quot;_blank&quot;&gt;presentations&lt;/a&gt; from &lt;a href=&quot;http://www.slideshare.net/beatlevic&quot; target=&quot;_blank&quot;&gt;beatlevic&lt;/a&gt; &lt;/div&gt; &lt;/div&gt;

&lt;p&gt;Node.js = #winning&lt;/p&gt;

&lt;p&gt;And for those of you who love Clojure or like to know more about it,
check out the &lt;a href=&quot;http://www.meetup.com/The-Amsterdam-Clojure-Meetup-Group/&quot;&gt;
Amsterdam Clojure meetup.&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 

</feed>
