<?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: Lorna Watson</title>
    <description>The latest articles on DEV Community by Lorna Watson (@lornasw93).</description>
    <link>https://dev.to/lornasw93</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%2F256500%2Fa3661d6a-f267-44a6-a824-09a61c2b8ff6.jpg</url>
      <title>DEV Community: Lorna Watson</title>
      <link>https://dev.to/lornasw93</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lornasw93"/>
    <language>en</language>
    <item>
      <title>All deployments regardless of retention period?</title>
      <dc:creator>Lorna Watson</dc:creator>
      <pubDate>Tue, 28 Sep 2021 21:42:05 +0000</pubDate>
      <link>https://dev.to/lornasw93/all-deployments-regardless-of-retention-period-hf</link>
      <guid>https://dev.to/lornasw93/all-deployments-regardless-of-retention-period-hf</guid>
      <description>&lt;p&gt;I've asked in various places including Stackoverflow and at work this question but not getting anything back: how to get a list of all project deployments regardless of retention period (specifically using Octopus Deploy REST API)?&lt;/p&gt;

&lt;p&gt;What I'm currently getting: a list of all project deployments as per retention period set.&lt;/p&gt;

&lt;p&gt;I believe (might be wrong) it's retention period is set per environment as, for example, for project X I'm getting 2 Live deployments back and in the same project all (by default) of Branch Tests.&lt;/p&gt;

&lt;p&gt;I'm wanting to get a list of all project deployments but, to me at least, seems odd I can't get just a list regardless of retention period.&lt;/p&gt;

&lt;p&gt;This gets me a list of all deployments but still only get 2 for Live for instance.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;HTTP GET: https://&amp;lt;base-url&amp;gt;/api/deployments&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Does anyone have idea how to get around this? Or have I missed something? There is documentation online in general but not enough tbh and not this specific.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>octopusdeploy</category>
      <category>api</category>
      <category>node</category>
    </item>
    <item>
      <title>📊 Calculating DORA Metrics - Deployment Frequency</title>
      <dc:creator>Lorna Watson</dc:creator>
      <pubDate>Mon, 27 Sep 2021 00:23:25 +0000</pubDate>
      <link>https://dev.to/lornasw93/calculating-dora-metrics-deployment-frequency-38ib</link>
      <guid>https://dev.to/lornasw93/calculating-dora-metrics-deployment-frequency-38ib</guid>
      <description>&lt;p&gt;The easiest metric to calculate - get a list of project deployments by environment and then group by date format(s) i.e. by day, by month and by year; and finally to calculate the throughput % score which is essentially:&lt;/p&gt;

&lt;p&gt;throughput % = (count of deployments by environment * count of all deployments) * 100&lt;/p&gt;

&lt;p&gt;I've parsed the data into a specific format for my charts in the frontend. Check out my &lt;a href="https://github.com/lornasw93/dora-metrics" rel="noopener noreferrer"&gt;repo here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "score": 4.16,
    "result": [
        {
            "title": "By Day", 
            "content": [
                {
                    "name": "29 Aug 21",
                    "value": 2
                },
                {
                    "name": "10 Sep 21",
                    "value": 2
                }
            ],
            "average": 2
        },
        {
            "title": "By Month", 
            "content": [
                {
                    "name": "Aug 21",
                    "value": 2
                },
                {
                    "name": "Sep 21",
                    "value": 2
                }
            ],
            "average": 2
        },
        {
            "title": "By Year", 
            "content": [
                {
                    "name": "21",
                    "value": 4
                }
            ],
            "average": null
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thanks for reading!&lt;/p&gt;

</description>
      <category>node</category>
      <category>devops</category>
      <category>dora</category>
      <category>showdev</category>
    </item>
    <item>
      <title>📊 Intro: DORA Metrics</title>
      <dc:creator>Lorna Watson</dc:creator>
      <pubDate>Mon, 27 Sep 2021 00:14:17 +0000</pubDate>
      <link>https://dev.to/lornasw93/calculating-dora-metrics-3k1l</link>
      <guid>https://dev.to/lornasw93/calculating-dora-metrics-3k1l</guid>
      <description>&lt;p&gt;I've created a small Node.js project to calculate DORA Metrics, it's ongoing so is not finished but you can find the &lt;a href="https://github.com/lornasw93/dora-metrics" rel="noopener noreferrer"&gt;repo here&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;References/useful links: &lt;a href="https://services.google.com/fh/files/misc/state-of-devops-2021.pdf" rel="noopener noreferrer"&gt;Accelerate: State of DevOps 2021&lt;/a&gt;, &lt;a href="https://www.sleuth.io/post/dora-metrics-explained" rel="noopener noreferrer"&gt;DORA metrics explained&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is DORA?
&lt;/h2&gt;

&lt;p&gt;DORA (DevOps Research and Assessment) represents 7 years of research by a team at Google to identify the most effective and efficient ways to develop and deliver software. They surveyed more than 32,000 industry professionals to find out and understand what makes a high performing team different than a low performing team. As a now industry standard, DORA's research has identified four key metrics (depending on where you look will have slightly different names):&lt;/p&gt;

&lt;h3&gt;
  
  
  Deployment Frequency
&lt;/h3&gt;

&lt;p&gt;Measure &lt;u&gt;throughput&lt;/u&gt; by how often an organisation successfully releases to production.&lt;/p&gt;

&lt;p&gt;For elite performers: on demand, multiple deploys per day&lt;br&gt;
For high performers: once per week - once per week&lt;br&gt;
For medium performers: once per month - once per 6 months&lt;br&gt;
For low performers: &amp;lt; once per 6 months&lt;/p&gt;

&lt;h3&gt;
  
  
  Lead Time for Changes
&lt;/h3&gt;

&lt;p&gt;Measure &lt;u&gt;throughput&lt;/u&gt; by the amount of time it takes a commit to get into production.&lt;/p&gt;

&lt;p&gt;For elite performers: &amp;lt; one hour&lt;br&gt;
For high performers: 1 day - 1 week&lt;br&gt;
For medium performers: 1 month - 6 months&lt;br&gt;
For low performers: &amp;gt; 6 months&lt;/p&gt;

&lt;h3&gt;
  
  
  Time to Restore Service
&lt;/h3&gt;

&lt;p&gt;Measure &lt;u&gt;stability&lt;/u&gt; by how long it takes an organisation to recover from a failure in production.&lt;/p&gt;

&lt;p&gt;For elite performers: &amp;lt; 1 hour&lt;br&gt;
For high performers: &amp;lt; 1 day&lt;br&gt;
For medium performers: 1 day - 1 week&lt;br&gt;
For low performers: &amp;gt; 6 months&lt;/p&gt;

&lt;h3&gt;
  
  
  Change Failure Rate
&lt;/h3&gt;

&lt;p&gt;Measure &lt;u&gt;stability&lt;/u&gt; by percentage of deployments causing a failure in production. &lt;/p&gt;

&lt;p&gt;For elite performers: 0% - 15%&lt;br&gt;
For high performers: 16% - 30%&lt;br&gt;
For medium performers: 16% - 30%&lt;br&gt;
For low performers: 16% - 30%&lt;/p&gt;

&lt;h2&gt;
  
  
  ✨ Thank you ✨
&lt;/h2&gt;

&lt;p&gt;This is a first post in a series #AllAboutDora, hope this post was useful and interesting!&lt;/p&gt;

</description>
      <category>node</category>
      <category>devops</category>
      <category>dora</category>
      <category>showdev</category>
    </item>
    <item>
      <title>How does one JQL with the Jira API?</title>
      <dc:creator>Lorna Watson</dc:creator>
      <pubDate>Wed, 19 May 2021 22:04:47 +0000</pubDate>
      <link>https://dev.to/lornasw93/jira-api-with-jql-4ae6</link>
      <guid>https://dev.to/lornasw93/jira-api-with-jql-4ae6</guid>
      <description>&lt;p&gt;This post is to document, for myself to remember, but also for others who are looking to play with the Jira API - more specifically JQL. I've wrote a list of &lt;a href="https://dev.to/lornasw93/useful-jql-jira-query-language-1793"&gt;useful queries here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The following example assumes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Base URL is: (you'll need to replace 'host' with yours) &lt;a href="https://host.atlassian.net/rest/api/2" rel="noopener noreferrer"&gt;https://host.atlassian.net/rest/api/2&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;TestProject is a real project with a team called Avengers&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;

&lt;p&gt;Get list of bugs in TestProject in current sprint for Avengers team&lt;/p&gt;

&lt;h3&gt;
  
  
  Authentication
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://id.atlassian.com/manage-profile/security/api-tokens" rel="noopener noreferrer"&gt;Generate an API token here&lt;/a&gt; and copy it somewhere for safe keeping as you're going to need it in a moment.&lt;/p&gt;

&lt;p&gt;In the "Authorization" tab, select "Basic Auth" as type with your email address as username and the token you just generated as the password.&lt;/p&gt;

&lt;h3&gt;
  
  
  Request URL (GET):
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://host.atlassian.net/rest/api/2/search?jql=project=TSTP" rel="noopener noreferrer"&gt;https://host.atlassian.net/rest/api/2/search?jql=project=TSTP&lt;/a&gt; AND issuetype = "Bug" AND Sprint in openSprints() AND "Engineering Team[Dropdown]" = TSTP-Avengers&lt;/p&gt;

&lt;h3&gt;
  
  
  Where query params are:
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;jql&lt;/td&gt;
&lt;td&gt;project=TSTP AND issuetype = "Bug" AND Sprint in openSprints() AND "Engineering Team[Dropdown]" = TSTP-Avengers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  JSON Response
&lt;/h3&gt;

&lt;p&gt;You'll get back a hefty JSON response which I believe you can filter (not looked into this yet). Please note I've heavily removed bits to focus on the main juicy data you get back without boring the page too much. There are loads of custom fields returned where I believe (again, not looked into this as yet) you can check on your Jira account for a list/create some more.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "expand": "schema,names",
  "startAt": 0,
  "maxResults": 50,
  "total": 1,
  "issues": [
    {
      "expand": "operations,versionedRepresentations,editmeta,changelog,renderedFields,customfield_16139.properties",
      "id": "44421",
      "self": "https://host.atlassian.net/rest/api/2/issue/44421",
      "key": "TSTP-5980",
      "fields": {
        "resolution": {
          "self": "https://host.atlassian.net/rest/api/2/resolution/10000",
          "id": "10000",
          "description": "Work has been completed on this issue.",
          "name": "Done"
        },
        "lastViewed": "2021-05-19T09:10:22.953+0100",
        "labels": [
          "Tech Debt"
        ],
        "assignee": {
          "displayName": "Lorna Watson"
        },
        "reporter": {
          "displayName": "Bob Smith"
        },
        "customfield_15725": {
          "released": true,
          "releaseDate": "2017-10-25"
        },
        "issuetype": {
          "self": "https://host.atlassian.net/rest/api/2/issuetype/1",
          "id": "1",
          "description": "A problem which impairs or prevents the functions of the product.",
          "iconUrl": "https://host.atlassian.net/secure/viewavatar?size=medium&amp;amp;avatarId=1223&amp;amp;avatarType=issuetype",
          "name": "Bug",
          "subtask": false,
          "avatarId": 1223
        },
        "project": {
          "self": "https://host.atlassian.net/rest/api/2/project/1450",
          "id": "1450",
          "key": "TSTP",
          "name": "TestProject",
          "avatarUrls": {
            "48x48": "https://host.atlassian.net/secure/projectavatar?pid=1450&amp;amp;avatarId=20535",
            "24x24": "https://host.atlassian.net/secure/projectavatar?size=small&amp;amp;s=small&amp;amp;pid=1450&amp;amp;avatarId=20535",
            "16x16": "https://host.atlassian.net/secure/projectavatar?size=xsmall&amp;amp;s=xsmall&amp;amp;pid=1450&amp;amp;avatarId=20535",
            "32x32": "https://host.atlassian.net/secure/projectavatar?size=medium&amp;amp;s=medium&amp;amp;pid=1450&amp;amp;avatarId=20535"
          },
          "projectCategory": {
            "self": "https://host.atlassian.net/rest/api/2/projectCategory/10200",
            "id": "10200",
            "description": "Used by ABC TestProject",
            "name": "ABC TestProject"
          }
        },
        "resolutiondate": "2021-05-19T09:10:22.982+0100",
        "updated": "2021-05-19T14:40:38.903+0100",
        "description": "Details of task item will be shown here",
        "customfield_10007": [
          {
            "id": 35,
            "name": "Sprint 1 (Avengers)",
            "state": "active",
            "boardId": 1,
            "startDate": "2021-05-10T07:00:00.000Z",
            "endDate": "2021-05-21T16:30:00.000Z"
          }
        ],
        "priority": {
          "name": "Sev 2",
          "id": "4"
        },
        "status": {
          "self": "https://host.atlassian.net/rest/api/2/status/1086",
          "description": "",
          "iconUrl": "https://host.atlassian.net/images/icons/statuses/generic.png",
          "name": "Complete",
          "id": "1086",
          "statusCategory": {
            "self": "https://host.atlassian.net/rest/api/2/statuscategory/1",
            "id": 1,
            "key": "done",
            "colorName": "green",
            "name": "Done"
          }
        },
        "creator": {
          "displayName": "Bob Smith"
        },
        "customfield_14006": {
          "self": "https://host.atlassian.net/rest/api/2/customFieldOption/11734",
          "value": "Pending",
          "id": "11734"
        },
        "customfield_13710": "Some more details",
        "customfield_13702": {
          "self": "https://host.atlassian.net/rest/api/2/customFieldOption/11512",
          "value": "Not Reviewed",
          "id": "11512"
        },
        "created": "2017-12-12T11:07:34.517+0000",
        "customfield_12600": "{pullrequest={dataType=pullrequest, state=MERGED, stateCount=1}, json={\"cachedValue\":{\"errors\":[],\"summary\":{\"pullrequest\":{\"overall\":{\"count\":1,\"lastUpdated\":\"2021-05-18T16:48:41.146+0100\",\"stateCount\":1,\"state\":\"MERGED\",\"dataType\":\"pullrequest\",\"open\":false},\"byInstanceType\":{\"bitbucket\":{\"count\":1,\"name\":\"Bitbucket Cloud\"}}}}},\"isStale\":true}}"
      }
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  All good to go.
&lt;/h3&gt;

&lt;p&gt;I hope this was useful, I found it painful to get it to this stage with not being much (IMO) documentation and tutorials on using JQL for Jira API requests. Thank you!!&lt;/p&gt;

</description>
      <category>api</category>
      <category>jira</category>
      <category>jql</category>
      <category>postman</category>
    </item>
    <item>
      <title>Useful JQL (Jira Query Language) Dump</title>
      <dc:creator>Lorna Watson</dc:creator>
      <pubDate>Thu, 13 May 2021 22:51:03 +0000</pubDate>
      <link>https://dev.to/lornasw93/useful-jql-jira-query-language-1793</link>
      <guid>https://dev.to/lornasw93/useful-jql-jira-query-language-1793</guid>
      <description>&lt;p&gt;I'm playing around with JQL to see what interesting data I can get back from Jira. I'll keep this page updates with more queries as I find them.&lt;/p&gt;

&lt;p&gt;Overview and some useful bits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;DevProject&lt;/code&gt; is an example project and &lt;code&gt;DP&lt;/code&gt; being the ID of it&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DP-Avengers&lt;/code&gt; is a team name &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;summary ~ help&lt;/code&gt; issues that contains help in summary&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;labels = TechDebt&lt;/code&gt; issues with label TechDebt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.atlassian.com/blog/jira-software/jql-secrets-and-shortcuts" rel="noopener noreferrer"&gt;Secrets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://confluence.atlassian.com/jirasoftware/blog/2015/06/search-jira-like-a-boss-with-jql" rel="noopener noreferrer"&gt;Search&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cheatography.com/justinbyrne/cheat-sheets/jql-jira-query-language/" rel="noopener noreferrer"&gt;Cheat Sheet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;JQL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;List of DevProject tasks with no assignee, open status and was last updated more than 4 weeks ago&lt;/td&gt;
&lt;td&gt;&lt;code&gt;project = DP AND assignee is EMPTY and status = OPEN and updatedDate &amp;lt;= -4w&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List of DevProject issues created this week&lt;/td&gt;
&lt;td&gt;&lt;code&gt;project = DP AND created &amp;gt; startOfWeek() and created &amp;lt; endOfWeek()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List of DevProject issues created this year&lt;/td&gt;
&lt;td&gt;&lt;code&gt;project = DP AND created &amp;gt;= startOfYear()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List of DevProject bugs created this year&lt;/td&gt;
&lt;td&gt;&lt;code&gt;project = DP AND created &amp;gt;= startOfYear() AND issuetype = Bug&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List of DevProject issues created this year and still open&lt;/td&gt;
&lt;td&gt;&lt;code&gt;project = DP AND created &amp;gt;= startOfYear() AND status = open&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List of DevProject support tickets in open sprints&lt;/td&gt;
&lt;td&gt;&lt;code&gt;project = DP AND issuetype = "Support Ticket" AND Sprint in openSprints()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List of open DevProject issues order by oldest first&lt;/td&gt;
&lt;td&gt;&lt;code&gt;project = DP AND status not in(Complete, Closed, Resolved, Done, Declined) ORDER BY created ASC&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List of top severity issues in DevProject for Team Avengers created since start of month&lt;/td&gt;
&lt;td&gt;&lt;code&gt;project = DP AND priority = "Sev 1" AND "Engineering Team[Dropdown]" = DP-Avengers AND created &amp;gt;= startOfMonth()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List of level 3 severity issues in DevProject since start of year&lt;/td&gt;
&lt;td&gt;&lt;code&gt;project = DP AND priority = "Sev 3" AND created &amp;gt;= startOfYear()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List of issues in current sprint in DevProject with a story point assigned order by largest value&lt;/td&gt;
&lt;td&gt;&lt;code&gt;project = DP AND sprint in openSprints() AND "Story Points[Number]" IS NOT EMPTY ORDER BY cf[10003] DESC&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List of in progress issues in DevProject with empty assignee&lt;/td&gt;
&lt;td&gt;&lt;code&gt;project = DP AND statusCategory = "In Progress" AND assignee IS EMPTY&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>jira</category>
      <category>jql</category>
    </item>
    <item>
      <title>Satisfaction of ✨ clean ✨ branding</title>
      <dc:creator>Lorna Watson</dc:creator>
      <pubDate>Thu, 01 Apr 2021 13:06:20 +0000</pubDate>
      <link>https://dev.to/lornasw93/satisfaction-of-clean-branding-530p</link>
      <guid>https://dev.to/lornasw93/satisfaction-of-clean-branding-530p</guid>
      <description>&lt;p&gt;I love playing around in &lt;a href="https://www.canva.com" rel="noopener noreferrer"&gt;Canva&lt;/a&gt;, it's super easy to use and plenty of free and paid resources available e.g. icons, images. I saw a random post on LinkedIn a good while ago of someone's business card that had the layout you can see in the cover image, I was immediately drawn to it and thought it was really clever. I unfortunately didn't make note of the post but didn't forget it. I decided I wanted to make one of my own but not a business card, just a nice cover image for my LinkedIn profile (for now). Check of the initial version in the cover image and let me know what you think!&lt;/p&gt;

&lt;p&gt;Have you done something similar? &lt;/p&gt;

</description>
      <category>productivity</category>
      <category>design</category>
    </item>
    <item>
      <title>Polishing your GitHub profile landing page 🧹</title>
      <dc:creator>Lorna Watson</dc:creator>
      <pubDate>Mon, 29 Mar 2021 15:49:43 +0000</pubDate>
      <link>https://dev.to/lornasw93/polish-your-landing-page-for-your-github-profile-51ak</link>
      <guid>https://dev.to/lornasw93/polish-your-landing-page-for-your-github-profile-51ak</guid>
      <description>&lt;p&gt;I've had a GitHub account since 2014 and I had no idea until now you could create a secret repo by typing your username to get a pretty nice readme on the landing page of your GitHub profile.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F87xmb1j8oy6svq9qkavl.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F87xmb1j8oy6svq9qkavl.jpeg" alt="Alt Text" width="729" height="210"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd5lnod9tv98l8f1ietsy.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd5lnod9tv98l8f1ietsy.PNG" alt="Alt Text" width="800" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>webdev</category>
      <category>portfolio</category>
    </item>
    <item>
      <title>Why won't your website thumbnail hasn't updated when trying to share on LinkedIn</title>
      <dc:creator>Lorna Watson</dc:creator>
      <pubDate>Wed, 24 Mar 2021 10:59:19 +0000</pubDate>
      <link>https://dev.to/lornasw93/solution-to-why-won-t-your-website-thumbnail-hasn-t-updated-when-trying-to-share-on-linkedin-37e9</link>
      <guid>https://dev.to/lornasw93/solution-to-why-won-t-your-website-thumbnail-hasn-t-updated-when-trying-to-share-on-linkedin-37e9</guid>
      <description>&lt;p&gt;The issue is cached data. You need to purge. Go to &lt;a href="https://www.linkedin.com/post-inspector" rel="noopener noreferrer"&gt;Post inspector&lt;/a&gt;, copy over your website UR and hit inspect. You should now see your updated website thumbnail.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/ipfEdUr83aNoO4aBKQ/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/ipfEdUr83aNoO4aBKQ/giphy.gif" width="500" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>seo</category>
    </item>
    <item>
      <title>Single or multi page dev portfolio website?</title>
      <dc:creator>Lorna Watson</dc:creator>
      <pubDate>Wed, 24 Mar 2021 04:19:45 +0000</pubDate>
      <link>https://dev.to/lornasw93/dev-portfolio-site-single-page-or-multi-5ek5</link>
      <guid>https://dev.to/lornasw93/dev-portfolio-site-single-page-or-multi-5ek5</guid>
      <description>&lt;p&gt;I've recently (as of less than an hour ago) updated my &lt;a href="https://lorna.dev" rel="noopener noreferrer"&gt;portfolio site&lt;/a&gt; from being a multi-page site to a single page with the reason being I felt I didn't have enough content to warrant the extra space after a lot of thought. I then began wondering if there is an industry standard. I've seen my fair share of portfolio sites but I can't say for sure which layout I've seen most.&lt;/p&gt;

&lt;p&gt;What are your thoughts? - Do you have a portfolio site with a few pages or single? Why is that?&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>portfolio</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Smooth scrolling to same-page element</title>
      <dc:creator>Lorna Watson</dc:creator>
      <pubDate>Wed, 24 Mar 2021 04:10:00 +0000</pubDate>
      <link>https://dev.to/lornasw93/smoothly-scroll-to-same-page-element-44gd</link>
      <guid>https://dev.to/lornasw93/smoothly-scroll-to-same-page-element-44gd</guid>
      <description>&lt;p&gt;I decided to condense &lt;a href="https://lorna.dev" rel="noopener noreferrer"&gt;my portfolio site&lt;/a&gt; into a single page pretty much because I felt I didn't need that much space. There are various ways, as with most things, I could have gone with but ultimately decided to go with the &lt;a href="https://github.com/nicky-lenaers/ngx-scroll-to" rel="noopener noreferrer"&gt;ngx-scroll-to&lt;/a&gt; package.&lt;/p&gt;

&lt;p&gt;To begin, install the package into your project folder &lt;code&gt;npm i @nicky-lenaers/ngx-scroll-to&lt;/code&gt; and then into the &lt;code&gt;AppModule&lt;/code&gt; file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { ScrollToModule } from '@nicky-lenaers/ngx-scroll-to';

@NgModule({
  imports: [ 
    ScrollToModule.forRoot()
  ]
}) 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;navbar.component.html&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; &amp;lt;ul class="navbar-nav ml-auto"&amp;gt;
      &amp;lt;li class="nav-item"&amp;gt;&amp;lt;a class="nav-link" [ngxScrollTo]="'home'" [ngxScrollToEasing]="'easeInOutQuad'"&amp;gt;&amp;lt;fa-icon [icon]="faHome"&amp;gt;&amp;lt;/fa-icon&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
      &amp;lt;li class="nav-item"&amp;gt;&amp;lt;a class="nav-link" [ngxScrollTo]="'about'" [ngxScrollToEasing]="'easeInOutQuad'"&amp;gt;About&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
      &amp;lt;li class="nav-item"&amp;gt;&amp;lt;a class="nav-link" [ngxScrollTo]="'dev'" [ngxScrollToEasing]="'easeInOutQuad'"&amp;gt;Dev&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
      &amp;lt;li class="nav-item"&amp;gt;&amp;lt;a class="nav-link" [ngxScrollTo]="'blog'" [ngxScrollToEasing]="'easeInOutQuad'"&amp;gt;Blog&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
      &amp;lt;li class="nav-item"&amp;gt;&amp;lt;a class="nav-link" [ngxScrollTo]="'projects'" [ngxScrollToEasing]="'easeInOutQuad'"&amp;gt;Projects&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
      &amp;lt;li class="nav-item"&amp;gt;&amp;lt;a class="nav-link" [ngxScrollTo]="'contact'" [ngxScrollToEasing]="'easeInOutQuad'"&amp;gt;Contact&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;about.component.html&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div id="about" #about&amp;gt; &amp;lt;!-- ✨ --&amp;gt;
  &amp;lt;div class="container"&amp;gt;
    &amp;lt;div class="row"&amp;gt; 
      &amp;lt;div class="col-lg-6"&amp;gt; 
        &amp;lt;button [ngxScrollTo]="'contact'" [ngxScrollToEasing]="'easeInOutQuad'" alt="Send message"&amp;gt;Send message&amp;lt;/button&amp;gt; &amp;lt;!-- ✨ --&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I need to play around with more setting i.e. easing, but so far enjoying it. It was simple enough to add in where needed, does the job nicely! 🤗&lt;/p&gt;

</description>
      <category>angular</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Rendering multiple icons in AG Grid cell</title>
      <dc:creator>Lorna Watson</dc:creator>
      <pubDate>Wed, 17 Mar 2021 18:14:38 +0000</pubDate>
      <link>https://dev.to/lornasw93/rendering-multiple-icons-in-ag-grid-cell-66p</link>
      <guid>https://dev.to/lornasw93/rendering-multiple-icons-in-ag-grid-cell-66p</guid>
      <description>&lt;h2&gt;
  
  
  End result 🥳
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fpzd6qhucsi5kjv2c876p.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fpzd6qhucsi5kjv2c876p.PNG" alt="Alt Text" width="630" height="194"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;

&lt;p&gt;I've tried to strip out any irrelevant bits. Also to note I am using the free Font Awesome icons and community edition of AG Grid.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deployments List Component
&lt;/h3&gt;

&lt;h4&gt;
  
  
  TS
&lt;/h4&gt;

&lt;p&gt;Include the new cell renderer component when setting up your col defs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  field: 'DeployedBy', 
  cellRendererFramework: IconCellRendererComponent 
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Icon Cell Renderer Component
&lt;/h3&gt;

&lt;h4&gt;
  
  
  TS
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { Component } from "@angular/core";
import { ICellRendererAngularComp } from 'ag-grid-angular';
import { IconDefinition } from '@fortawesome/fontawesome-svg-core';
import { faUsers, faCity } from '@fortawesome/free-solid-svg-icons';

@Component({
  selector: 'app-icon-cell-renderer',
  templateUrl: './icon-cell-renderer.component.html'
})
export class IconCellRendererComponent implements ICellRendererAngularComp {
  faUsers = faUsers;
  faCity = faCity;

  params: any;
  icons: IconDefinition[]; // ✨ if wanting just the 1 icon change to `IconDefinition`

  agInit(params: any): void {
    this.params = params;
    if (this.params.value === 'Teamcity') {
      this.icons = [faUsers, faCity];
    }

    return this.params.value;
  }

  refresh(): boolean {
    return false;
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  HTML
&lt;/h4&gt;

&lt;p&gt;I'm looking at tidying this up.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;span *ngIf="icons != null; else notSys"&amp;gt;
  &amp;lt;span *ngFor="let icon of icons"&amp;gt;
    &amp;lt;fa-icon [icon]="icon"&amp;gt;&amp;lt;/fa-icon&amp;gt;
  &amp;lt;/span&amp;gt;
&amp;lt;/span&amp;gt;
&amp;lt;ng-template #notSys&amp;gt;
  {{params.value}}
&amp;lt;/ng-template&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Styling
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@almost-black: #262626;

ag-grid-angular.ag-theme-material {
  .ag-row .ag-cell fa-icon { 
    margin-left: 2px;
    margin-right: 2px;
    color: @almost-black; 
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>angular</category>
      <category>aggrid</category>
      <category>fontawesome</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Deploying Node.js app with Heroku config vars</title>
      <dc:creator>Lorna Watson</dc:creator>
      <pubDate>Sat, 06 Mar 2021 23:30:50 +0000</pubDate>
      <link>https://dev.to/lornasw93/deploying-node-js-with-heroku-config-vars-instead-of-gitignore-config-file-after-getting-a-file-not-found-error-post-deploy-41em</link>
      <guid>https://dev.to/lornasw93/deploying-node-js-with-heroku-config-vars-instead-of-gitignore-config-file-after-getting-a-file-not-found-error-post-deploy-41em</guid>
      <description>&lt;p&gt;I tried to deploy my Node.js project via Heroku and got the following error message:&lt;/p&gt;

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

&lt;p&gt;To see more details, I &lt;code&gt;cd&lt;/code&gt; into the project’s directory and enter &lt;code&gt;heroku logs --tail&lt;/code&gt;. The error is &lt;code&gt;Cannot find module '../../config'&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  config.js file 🧾
&lt;/h2&gt;

&lt;p&gt;I have a config.js file at the project root (and is included in &lt;code&gt;.gitignore&lt;/code&gt; so secrets not exposed!!):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var config = {};

config.baseUrl = "http://teamcity:8111/app/rest";
config.apiKey = "XXX";

module.exports = config;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Function before
&lt;/h2&gt;

&lt;p&gt;My code looked like this (striped out irrelevant bits):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const axios = require('axios'),
    config = require("../../config"); // ✨

exports.getAll = (req, res) =&amp;gt; {
    axios({
        method: "get",
        url: `${config.teamCityBaseUrl}/builds`,
        headers: { 'Authorization': config.teamCityApiKey }
    }).then(response =&amp;gt; {
        res.send(response.data);
    }).catch(error =&amp;gt; {
        console.log(error);
    });
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Solution ✅
&lt;/h2&gt;

&lt;p&gt;Add your new config vars in Heroku and then access them in your code like &lt;code&gt;process.env.TEAM_CITY_BASE_URL&lt;/code&gt;.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Function after
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const axios = require('axios');

exports.getAll = (req, res) =&amp;gt; {
    axios({
        method: "get",
        url: `${process.env.TEAM_CITY_BASE_URL}/builds`,
        headers: { 'Authorization': process.env.TEAM_CITY_API_KEY}
    }).then(response =&amp;gt; {
        res.send(response.data);
    }).catch(error =&amp;gt; {
        console.log(error);
    });
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🤩 Website loads perfectly with no errors 🤩
&lt;/h2&gt;

</description>
      <category>node</category>
      <category>heroku</category>
      <category>todayilearned</category>
    </item>
  </channel>
</rss>
