<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Gil</title>
    <description>The latest articles on DEV Community by Gil (@gildotdev).</description>
    <link>https://dev.to/gildotdev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F105868%2Fc784d923-6af6-4492-85e0-5f5fc5ab8464.jpeg</url>
      <title>DEV Community: Gil</title>
      <link>https://dev.to/gildotdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gildotdev"/>
    <language>en</language>
    <item>
      <title>A tale of three architectures</title>
      <dc:creator>Gil</dc:creator>
      <pubDate>Wed, 21 Feb 2024 16:13:31 +0000</pubDate>
      <link>https://dev.to/gildotdev/-a-tale-of-three-architectures-3ego</link>
      <guid>https://dev.to/gildotdev/-a-tale-of-three-architectures-3ego</guid>
      <description>&lt;p&gt;&lt;a href="https://daverupert.com/2024/02/three-architectures/" rel="noopener noreferrer"&gt;https://daverupert.com/2024/02/three-architectures/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What a great write up on how your long running work projects can evolve. I have been on a somewhat similar journey with Codecraft Works over the past 7 years.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>softwaredevelopment</category>
      <category>softwareengineering</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Are you having problems deploying your Google Cloud Run container?</title>
      <dc:creator>Gil</dc:creator>
      <pubDate>Mon, 31 Oct 2022 17:54:26 +0000</pubDate>
      <link>https://dev.to/gildotdev/are-you-having-problems-deploying-your-google-cloud-run-container-42j1</link>
      <guid>https://dev.to/gildotdev/are-you-having-problems-deploying-your-google-cloud-run-container-42j1</guid>
      <description>&lt;p&gt;Does it run fine locally but it won’t start when deployed and revisioned? Are you using an M1 Mac? You likely need to add this target flag at the end of your &lt;code&gt;docker build&lt;/code&gt; command.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;--platform linux/amd64&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;docker build --platform linux/amd64
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://stackoverflow.com/a/68766137/332586" rel="noopener noreferrer"&gt;https://stackoverflow.com/a/68766137/332586&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>TIL: Angular has KeyValuePipe</title>
      <dc:creator>Gil</dc:creator>
      <pubDate>Tue, 26 Jul 2022 16:44:33 +0000</pubDate>
      <link>https://dev.to/gildotdev/til-angular-has-keyvaluepipe-2dk4</link>
      <guid>https://dev.to/gildotdev/til-angular-has-keyvaluepipe-2dk4</guid>
      <description>&lt;p&gt;TIL: Angular has a &lt;code&gt;keyvalue&lt;/code&gt; pipe and it has come in quite handy. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://stackoverflow.com/a/51491848" rel="noopener noreferrer"&gt;Stack Overflow Answer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://angular.io/api/common/KeyValuePipe" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.gilcreque.blog%2Fuploads%2F2022%2Fbaff41ff33.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.gilcreque.blog%2Fuploads%2F2022%2Fbaff41ff33.png" width="800" height="91" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>angular</category>
    </item>
    <item>
      <title>Patterns App - Regex Tool for the Mac</title>
      <dc:creator>Gil</dc:creator>
      <pubDate>Fri, 17 Jul 2020 15:59:35 +0000</pubDate>
      <link>https://dev.to/gildotdev/patterns-app-regex-tool-for-the-mac-1ah0</link>
      <guid>https://dev.to/gildotdev/patterns-app-regex-tool-for-the-mac-1ah0</guid>
      <description>&lt;p&gt;I am sure I have posted about this app before but it requires mentioning it again. I could not imagine writing regualr expressions without using the Patterns app on the Mac. It allows you to test your regex in an editor and see a cheat sheet. When you are done, you can get export the regex code for your language. I highly recommend it!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://krillapps.com/patterns/" rel="noopener noreferrer"&gt;krillapps.com/patterns/&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Empty functions.config() in Firebase Functions</title>
      <dc:creator>Gil</dc:creator>
      <pubDate>Tue, 28 Apr 2020 05:23:18 +0000</pubDate>
      <link>https://dev.to/gildotdev/empty-functions-config-in-firebase-functions-45b2</link>
      <guid>https://dev.to/gildotdev/empty-functions-config-in-firebase-functions-45b2</guid>
      <description>&lt;p&gt;After upgrading &lt;code&gt;firebase-admin&lt;/code&gt;, &lt;code&gt;firebase-functions&lt;/code&gt;, and &lt;code&gt;typescript&lt;/code&gt; and making some changes in my cloud functions to accomodate stricter types in &lt;code&gt;express&lt;/code&gt;, I had one last nagging problem. When running &lt;code&gt;firebase serve&lt;/code&gt; the functions would not load properly because &lt;code&gt;functions.config()&lt;/code&gt; was returning an empty object. This was confusing because we make sure to create the &lt;code&gt;.runtimeconfig.json&lt;/code&gt; file whenever we run &lt;code&gt;npm start&lt;/code&gt; (which creates the file and then runs &lt;code&gt;firebase serve&lt;/code&gt;). After several hours of digging around trying to figure out why this was happening I gave up for the day … or so I thought. I came back to this problem after laying in bed and came across &lt;a href="https://github.com/firebase/firebase-functions/issues/437#issuecomment-620278306" rel="noopener noreferrer"&gt;a comment left 6 hours ago&lt;/a&gt; that got me pointed in the right direction. After running &lt;code&gt;npm list -depth=0&lt;/code&gt; to see what the actual version of &lt;code&gt;firebase-tools&lt;/code&gt; I was using (&lt;code&gt;@7.16.2&lt;/code&gt;). I upgraded my Angular app and my Firebase functions app.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;npm install --save-dev firebase-tools@latest&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This brought &lt;code&gt;firebase-tools&lt;/code&gt; to version &lt;code&gt;@8.2.0&lt;/code&gt; and everything started working again.🍾 🎉&lt;/p&gt;

</description>
      <category>firebase</category>
      <category>angular</category>
      <category>npm</category>
    </item>
    <item>
      <title>How to possibly fix your npm globally installed binary not being found</title>
      <dc:creator>Gil</dc:creator>
      <pubDate>Sat, 25 Apr 2020 02:09:01 +0000</pubDate>
      <link>https://dev.to/gildotdev/how-to-possibly-fix-your-npm-globally-installed-binary-not-being-found-n18</link>
      <guid>https://dev.to/gildotdev/how-to-possibly-fix-your-npm-globally-installed-binary-not-being-found-n18</guid>
      <description>&lt;p&gt;This line in my &lt;code&gt;~/.npmrc&lt;/code&gt; file has been killing my sanity for longer than I want to admit.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;prefix=/Users/myusername/.nvm/versions/node/v10.0.0&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If your globally installed npm binaries are not being found it could be because somehow you have a prefix set like the one above. I’m using nvm and I could not figure this out. All I had to do was delete this line and my binaries were finally installing in to the correct directory. I slayed the beast just now thanks to &lt;a href="https://github.com/nvm-sh/nvm/issues/1954#issuecomment-442275974" rel="noopener noreferrer"&gt;this handy issue comment&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>npm</category>
      <category>node</category>
      <category>nvm</category>
    </item>
    <item>
      <title>Using Pick&lt;T,K&gt; in TypeScript</title>
      <dc:creator>Gil</dc:creator>
      <pubDate>Tue, 21 Apr 2020 20:54:00 +0000</pubDate>
      <link>https://dev.to/gildotdev/using-pick-t-k-in-typescript-1hmh</link>
      <guid>https://dev.to/gildotdev/using-pick-t-k-in-typescript-1hmh</guid>
      <description>&lt;p&gt;I used &lt;code&gt;Pick&amp;lt;T,K&amp;gt;&lt;/code&gt; for the first time today in TypeScript. I had been using &lt;code&gt;Partial&amp;lt;T&amp;gt;&lt;/code&gt; for a while to allow some properties of a class/interface to be used in other places in my application. After doing a lot more reading on TypeScript lately I decided to find a way to grab specific properties from a class/interface and lo and behold that’s what &lt;code&gt;Pick&amp;lt;T,K&amp;gt;&lt;/code&gt; is for. I was going to do a write up on how I am using it but I &lt;a href="https://medium.com/codafication-blog/typescript-2-1-and-the-power-of-pick-ff433f1e6fb" rel="noopener noreferrer"&gt;found a post that sums it up quite nicely&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>angular</category>
    </item>
    <item>
      <title>Rearranging for WFH</title>
      <dc:creator>Gil</dc:creator>
      <pubDate>Sun, 29 Mar 2020 19:09:05 +0000</pubDate>
      <link>https://dev.to/gildotdev/rearranging-for-wfh-2d8i</link>
      <guid>https://dev.to/gildotdev/rearranging-for-wfh-2d8i</guid>
      <description>&lt;p&gt;Did some rearranging of my office area yesterday to accommodate my newish coworkers and classmates. I separated desks and now my side desks sits behind me with my iMac and 3D printer (and my Nanoleaf until I get more command tape). My son’s gaming PC and desk will be in front so we will share this space when he is done with school work. He’ll be in his room during school hours. I have to put together my wife’s desk and put it in the living room where my son’s desk used to be. Anyone else have to make arrangements for better WFH for all?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffdy3fmjy618qmf57kpwc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffdy3fmjy618qmf57kpwc.jpg" width="800" height="600"&gt;&lt;/a&gt; &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4su0laxov75da5wudvso.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4su0laxov75da5wudvso.jpg" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Returning Observable objects from combineLatest()</title>
      <dc:creator>Gil</dc:creator>
      <pubDate>Thu, 19 Mar 2020 17:56:59 +0000</pubDate>
      <link>https://dev.to/gildotdev/returning-observable-objects-from-combinelatest-402l</link>
      <guid>https://dev.to/gildotdev/returning-observable-objects-from-combinelatest-402l</guid>
      <description>&lt;p&gt;In trying to use more Reactive patterns in Angular I have been using the &lt;code&gt;combineLatest()&lt;/code&gt; RxJs method to combine several Observables into one Observable and using the &lt;code&gt;async&lt;/code&gt; pipe to use the data in the template. This ensures that all of the data is available in the template by using &lt;code&gt;*ngIf&lt;/code&gt;. One thing I did not like about using &lt;code&gt;combineLatest()&lt;/code&gt; is that it returns an array of results back based on the array of Observables you handed to it. This made accessing this data in the template look messy and made it harder to understand what data you were accessing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;cousePageData$&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Observable&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Course&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getCurrentUser&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// get the current user&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;course$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getCourse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;courseId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// get course by course id&lt;/span&gt;
&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cousePageData$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;combineLatest&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;user$&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;course$&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the template this would result in array(&lt;code&gt;[user, course]&lt;/code&gt;) as a result of using the &lt;code&gt;async&lt;/code&gt; pipe (&lt;code&gt;&amp;lt;div *ngIf="cousePageData$ | async as cousePageData&amp;gt;&lt;/code&gt;) and you would have to access &lt;code&gt;user&lt;/code&gt; and &lt;code&gt;course&lt;/code&gt; using the index on the array (&lt;code&gt;cousePageData[0]&lt;/code&gt; and &lt;code&gt;cousePageData[1]&lt;/code&gt;). As you can see, this obfuscates what data is actually being accessed at this indexes.&lt;/p&gt;

&lt;p&gt;So I set out this morning to get this cleaned up in our repository and found a pretty easy solution in RxJs, using &lt;code&gt;pipe&lt;/code&gt; and &lt;code&gt;map&lt;/code&gt; to return the results of &lt;code&gt;combineLatest()&lt;/code&gt; as an object.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;cousePageData$&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Observable&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;course&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Course&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getCurrentUser&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// get the current user&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;course$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getCourse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;courseId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// get course by course id&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cousePageData$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;combineLatest&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;user$&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;course$&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
                       &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(([&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;course&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;course&lt;/span&gt; &lt;span class="p"&gt;})));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the template this would result in object(&lt;code&gt;{user: userData, course: courseData }&lt;/code&gt;) as a result of using the same async pipe and you can now access &lt;code&gt;user&lt;/code&gt; and &lt;code&gt;course&lt;/code&gt; using the property name on the object (&lt;code&gt;cousePageData.user&lt;/code&gt; and &lt;code&gt;cousePageData.course&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Yay for less obsfucation! Let me know if you have any other ideas regarding this!&lt;/p&gt;

</description>
      <category>angular</category>
      <category>rxjs</category>
      <category>reactive</category>
    </item>
    <item>
      <title>What is this style?</title>
      <dc:creator>Gil</dc:creator>
      <pubDate>Thu, 06 Feb 2020 19:35:55 +0000</pubDate>
      <link>https://dev.to/gildotdev/what-is-this-style-43pk</link>
      <guid>https://dev.to/gildotdev/what-is-this-style-43pk</guid>
      <description>&lt;p&gt;Design and Dev friends, what is this style called?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://planetary.social/" rel="noopener noreferrer"&gt;planetary.social&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wetransfer.com/about" rel="noopener noreferrer"&gt;wetransfer.com/about&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mailchimp.com/" rel="noopener noreferrer"&gt;mailchimp.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To me the common thread is the fonts used, the big color areas, the illustrations.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmsr3cafp49uszjbyoptj.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmsr3cafp49uszjbyoptj.jpg" alt="mailchimp.com" width="800" height="756"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuvhlxz2lzrjdi09ia7j6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuvhlxz2lzrjdi09ia7j6.png" alt="wetransfer.com" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2cwryw8d41j2xhp306ou.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2cwryw8d41j2xhp306ou.png" alt="planetary.social" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Firebase Summit 2019 - What’s New for Firebase Web?</title>
      <dc:creator>Gil</dc:creator>
      <pubDate>Sun, 24 Nov 2019 19:33:00 +0000</pubDate>
      <link>https://dev.to/gildotdev/firebase-summit-2019-what-s-new-for-firebase-web-27c8</link>
      <guid>https://dev.to/gildotdev/firebase-summit-2019-what-s-new-for-firebase-web-27c8</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy4vg1sy46nq4h6xs9ly1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy4vg1sy46nq4h6xs9ly1.png" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I gave a lightning talk yesterday at &lt;a href="https://www.meetup.com/GDGSpaceCoast/events/266211096/" rel="noopener noreferrer"&gt;an event I helped organize for GDG Space Coast&lt;/a&gt; covering what was new in Firebase for Web Applications from the &lt;a href="https://firebase.google.com/summit" rel="noopener noreferrer"&gt;Firebase Summit&lt;/a&gt; back in September.&lt;/p&gt;




&lt;h2&gt;
  
  
  Adventures in Making Slides
&lt;/h2&gt;

&lt;p&gt;I originally did my slides in Keynote to tryout the transitions that it provides. I ran into an error when my iCloud save presentation didn't sync properly so I was stuck having to redo my slides just before and during the beginning of the event. I went to share them in this blog post and I realized with the videos I included I would need to remake my slides once again. First I had to export the slides as PowerPoint from Keynote as Google Slides doesn't support importing Keynote slides. After I imported I decided to take a look at the branding guidelines Google Developers recently pushed out to organizers of Google Developer Groups. I copied over some of the slides for my intro and thank you slide. I'll have to remember to use the provided templates as a basis for future slides.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Bitbucket Pipeline Failure Deploying to Firebase</title>
      <dc:creator>Gil</dc:creator>
      <pubDate>Fri, 01 Nov 2019 14:59:09 +0000</pubDate>
      <link>https://dev.to/gilcreque/bitbucket-pipeline-failure-deploying-to-firebase-2db3</link>
      <guid>https://dev.to/gilcreque/bitbucket-pipeline-failure-deploying-to-firebase-2db3</guid>
      <description>&lt;p&gt;After a recent push in our &lt;code&gt;develop&lt;/code&gt; branch our Bitbucket pipeline was complaining that it could not deploy to Firebase. The dev team was perplexed because we had built the branch several times locally and manually deployed with no problems. Here is the command we were running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;firebase deploy --token=$FIREBASE_DEPLOY_TOKEN --project project-name --non-interactive
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Here is the error we were receiving:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: Error occurred while parsing your function triggers. Error: @grpc/grpc-js only works on Node ^8.13.0 || &amp;gt;=10.10.0
at Object.&amp;lt;anonymous&amp;gt;
(/opt/atlassian/pipelines/agent/build/functions/node_modules/@grpc/grpc-js/build/src/index.js:47:11)     at Module._compile
(internal/modules/cjs/loader.js:689:30)     at Object.Module._extensions..js
(internal/modules/cjs/loader.js:700:10)     at Module.load
(internal/modules/cjs/loader.js:599:32)     at tryModuleLoad
(internal/modules/cjs/loader.js:538:12)     at Function.Module._load
(internal/modules/cjs/loader.js:530:3)     at Module.require
(internal/modules/cjs/loader.js:637:17)     at require
(internal/modules/cjs/helpers.js:20:18)     at Object.&amp;lt;anonymous&amp;gt;
(/opt/atlassian/pipelines/agent/build/functions/node_modules/google-gax/build/src/grpc.js:37:14)     at Module._compile
(internal/modules/cjs/loader.js:689:30)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;We started barking up the wrong tree and thought maybe the version of Node set in our Firebase functions was the issue. It actually turned out to be the version of Node set in our Bitbucket Pipeline YAML. We had recently updated our local dev environments to use Node &lt;a href="https://nodejs.org/en/blog/release/v10.17.0/"&gt;v10.17.0, the LTS for version 10 of Node&lt;/a&gt;(Firebase is maxed out at using 10 for now). We had forgotten to update the Bitbucket image. We fixed it by updating our &lt;code&gt;bitbucket-pipelines.yml&lt;/code&gt; in our project like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;image: node:10.17.0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The new deploy ran perfectly!&lt;/p&gt;

</description>
      <category>softwaredevelopment</category>
      <category>bitbucket</category>
      <category>devops</category>
      <category>firebase</category>
    </item>
  </channel>
</rss>
