<?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>Forem: Laura Weatherhead</title>
    <description>The latest articles on Forem by Laura Weatherhead (@lssweatherhead).</description>
    <link>https://forem.com/lssweatherhead</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%2F116397%2F66821678-cd45-4a47-8c8e-488b29d873da.jpg</url>
      <title>Forem: Laura Weatherhead</title>
      <link>https://forem.com/lssweatherhead</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/lssweatherhead"/>
    <language>en</language>
    <item>
      <title>Umbraco in the City - Community, Code, and Cuddles</title>
      <dc:creator>Laura Weatherhead</dc:creator>
      <pubDate>Mon, 10 Nov 2025 12:37:40 +0000</pubDate>
      <link>https://forem.com/lssweatherhead/umbraco-in-the-city-community-code-and-cuddles-80c</link>
      <guid>https://forem.com/lssweatherhead/umbraco-in-the-city-community-code-and-cuddles-80c</guid>
      <description>&lt;p&gt;Last Friday, I had the excitement of attending the first-ever Umbraco in the City conference in Manchester—with a twist. My nine-month-old was my plus-one for the day, and honestly, I wasn't sure how it would go. Would I catch any of the talks? Would the baby cooperation gods smile upon me? And add to that my new role as part of the Developer Relations team at Umbraco, I wasn't quite sure who to show up "as": developer, community member, candid contrib, HQ'r, or mother?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TLDR: The baby cooperation gods did smile, the Umbraco community showed up in the most wonderful way, and I got to be all of the above ❤️&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before I dive into the excellent technical talks I saw, I just want to say a really heart-felt thanks to the organising team - Adam Prendergast, Phil Whittaker, Rachel Breeze and Jon Whitter - who created a genuinely inclusive space. Bringing a baby to a tech conference isn't exactly standard operating procedure, but the organisers made it work without batting an eyelid. From the welcoming atmosphere to the practical accommodations, they showed that "friendly" isn't just a word we use—it's a practice.&lt;/p&gt;

&lt;p&gt;And this matters. It matters that people at different life stages can still show up, learn, and contribute. It matters that we're building a community where participation doesn't require leaving parts of your life at the door.&lt;/p&gt;

&lt;p&gt;So, thank you to everyone who made it possible. You set a wonderful example for what tech events can be.&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%2Foc1i9nggh0fqg8whevst.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%2Foc1i9nggh0fqg8whevst.JPG" alt="Matt Brailsford on stage talking about Spec Driven Development" width="640" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Despite my adorable distraction, I managed to catch some really excellent sessions. Matt Brailsford delivered what might have been my favourite talk of the day—a beautifully illustrated exploration of vibe coding vs spec-driven development and an exploration of when we need to stop exploring a problem space with AI as a copilot and instead write a proper technical specification to use it as a tool.&lt;/p&gt;

&lt;p&gt;Matt's talk hit home because we've all been there: riding the wave of intuition, letting AI suggest the next line, feeling productive... until suddenly we're three refactors deep and not entirely sure what problem we're solving anymore. He did a super job of explaining where AI sometimes makes a problem harder rather than easier, and I'm looking forward to trying out &lt;a href="https://mattbrailsford.dev/speckl-testing-a-human-first-approach-to-ai-assisted-development" rel="noopener noreferrer"&gt;SPECKL&lt;/a&gt; which is a toolset aimed at finding that middle ground between vibes and full specifications.&lt;/p&gt;

&lt;p&gt;I also thoroughly enjoyed sessions from Jonny Muir and Matt Wise, both of whom took us on some really fascinating journeys from the land of accessibility in Jonny's talk to the land of vibe coding in Matt's.&lt;/p&gt;

&lt;p&gt;Over lunch, I had the privilege of joining my fellow Candid Contributions podcast hosts, Carole, Emma and Lotte, on stage. It had been a couple of years since we'd all been in the same physical location together so we were super excited about being there. We talked about the landscape of open source contribution in a project where there's already significant in-house development happening at Umbraco HQ. It's a fascinating dynamic—how do we make space for community contributions when the core team is so active?&lt;/p&gt;

&lt;p&gt;We had some great input from the audience - and from Paul Seal, Michael Latouche and Kieron McIntyre in particular. Hopefully everyone enjoyed joining for a wee lunch break chat! If you fancy catching up with us, you can &lt;a href="https://www.spreaker.com/episode/live-from-umbraco-in-the-city-manchester--68487985" rel="noopener noreferrer"&gt;give the episode a listen&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%2Fnl940gy10g9jhznmwpnv.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%2Fnl940gy10g9jhznmwpnv.jpg" alt="Carole, Emma, Laura and Lotte on stage" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Walking away from Manchester (baby on hip, head full of ideas), I felt deeply grateful. Grateful for a community that makes space for everyone. Grateful for organisers who put in the work to make events accessible. Grateful for speakers who challenge us to think more carefully about our craft.&lt;/p&gt;

&lt;p&gt;And grateful for a nine-month-old who, against all odds, decided that yes, a tech conference could be fun.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>9 Tips and Tricks for Chrome Dev Tools</title>
      <dc:creator>Laura Weatherhead</dc:creator>
      <pubDate>Sun, 30 Dec 2018 10:22:51 +0000</pubDate>
      <link>https://forem.com/lssweatherhead/9-tips-and-tricks-for-chrome-dev-tools-149c</link>
      <guid>https://forem.com/lssweatherhead/9-tips-and-tricks-for-chrome-dev-tools-149c</guid>
      <description>&lt;p&gt;&lt;a href="https://developers.google.com/web/tools/chrome-devtools/" rel="noopener noreferrer"&gt;Chrome&lt;/a&gt; is increasingly not just a browser of choice, but also a powerful development tool in its own right. New features are regularly introduced, some of which fall more naturally into (my) development cycles than others.&lt;/p&gt;

&lt;p&gt;Here are some of the features I make the best use of and think are worth a wee highlight:&lt;/p&gt;

&lt;h1&gt;
  
  
  1. Conditional Breakpoints
&lt;/h1&gt;

&lt;p&gt;Adding breakpoints to the script sources is an incredibly helpful way to know what's going wrong (or right!) and where. Being able to add conditional breakpoints helps you to get to the root of a problem even quicker by specifying parameter criteria that you are interested in investigating further. Ideal!&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%2Fyy9t3tu2l0mbem29r4gm.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%2Fyy9t3tu2l0mbem29r4gm.PNG" alt="Conditional breakpoints" width="495" height="106"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Read more about &lt;a href="https://developers.google.com/web/tools/chrome-devtools/javascript/breakpoints#conditional-loc" rel="noopener noreferrer"&gt;conditional breakpoints here.&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  2. Watch variables
&lt;/h1&gt;

&lt;p&gt;It is possible to interrogate variables in the &lt;code&gt;sources&lt;/code&gt; window when a breakpoint is engaged. This looks a bit like this:&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%2F04ud1zn0exuifj3qj7ll.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%2F04ud1zn0exuifj3qj7ll.PNG" alt="Variable" width="190" height="62"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is fine, but say you want to keep an eye on multiple variables at the same time or want to compare, or just remind yourself what they are (or should be), then it's possible to expand the &lt;code&gt;watch&lt;/code&gt; panel on the right-hand side and add as many variables there as you'd like:&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%2F5y4ut9en0aswnl66j0j6.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%2F5y4ut9en0aswnl66j0j6.PNG" alt="Watch panel" width="259" height="64"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  3. Stop Infinite Loops
&lt;/h1&gt;

&lt;p&gt;If you have ever accidentally run a javascript function, realised a second too late and had to watch as your computer begins to grind to a halt as you feverishly try to force quit Chrome, then this one is for you...&lt;/p&gt;

&lt;p&gt;Hit pause script, and then...&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%2Fbk1lfs6lw8sk2qtygjvd.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%2Fbk1lfs6lw8sk2qtygjvd.PNG" alt="Stop!" width="343" height="137"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Read more about &lt;a href="https://developers.google.com/web/updates/2018/04/devtools#stop" rel="noopener noreferrer"&gt;stopping infinite loops here.&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  4. Measure interactions
&lt;/h1&gt;

&lt;p&gt;Ever wanted to know how long something takes on a website...?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How long after page load does someone play a video or click a button?&lt;/li&gt;
&lt;li&gt;Where are the performance bottlenecks? How long does a script method take to run?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can now use &lt;code&gt;window.performance&lt;/code&gt; to trigger measurement starts and completions, and consequently extract the data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;onPageLoadOrMethodStart&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;start&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;onMethodCompletionOrCtaInteraction&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;end&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;measure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;customMeasure&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;start&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;end&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;retrieveData&lt;/span&gt;&lt;span class="p"&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;customPerf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getEntriesByName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;customMeasure&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Handily, the data is also printed out in the &lt;code&gt;performance&lt;/code&gt; window on the top panel, so you can see all measurements at a glance. Awesome!&lt;/p&gt;

&lt;p&gt;Read more about &lt;a href="https://developers.google.com/web/updates/2018/08/devtools#bonus" rel="noopener noreferrer"&gt;measuring real world interactions&lt;/a&gt; using the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/User_Timing_API" rel="noopener noreferrer"&gt;User Timing API&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  5. Pretty print minified files
&lt;/h1&gt;

&lt;p&gt;Minified files in production are industry standard, and are to be expected, but sometimes it's handy to attach breakpoint or look into individual structures or methods. Make it readable - make it pretty! (bottom left-hand corner of the &lt;code&gt;sources&lt;/code&gt; panel):&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%2F6kls1umtzj8dgofkoc1k.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%2F6kls1umtzj8dgofkoc1k.PNG" alt="Pretty print" width="216" height="82"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  6. Monitor Events
&lt;/h1&gt;

&lt;p&gt;Ever wondered why your event listeners weren't firing, or were firing at random times?&lt;/p&gt;

&lt;p&gt;You can track page events and interactions using the &lt;code&gt;console&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Try it now:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Right click and "inspect" the search input bar at the top of the page&lt;/li&gt;
&lt;li&gt;Copy this into the console: &lt;code&gt;monitorEvents($0, "key");&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Type something into the search input...&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Read more about &lt;a href="https://developers.google.com/web/tools/chrome-devtools/console/command-line-reference#monitorevents" rel="noopener noreferrer"&gt;monitoring events here&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  7. Export Requests Data
&lt;/h1&gt;

&lt;p&gt;You've got a problem. Something looks weird, but you're not sure why. You've got heaps of network requests to sift through, the answer must be in there somewhere... You could really use a hand, wouldn't it be handy to share them with someone else?&lt;/p&gt;

&lt;p&gt;You can!&lt;/p&gt;

&lt;p&gt;You can download the requests as a HAR file, and send it to a colleague who can import it into their Chrome to cast an eye over the requests also. Simply right-click on any request and select &lt;code&gt;Save as HAR with Content&lt;/code&gt;. Ta-da.&lt;/p&gt;

&lt;p&gt;Read more about &lt;a href="https://developers.google.com/web/tools/chrome-devtools/network-performance/reference#save-as-har" rel="noopener noreferrer"&gt;exporting requests data&lt;/a&gt; and how to &lt;a href="https://toolbox.googleapps.com/apps/har_analyzer/" rel="noopener noreferrer"&gt;analyze HAR files&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  8. Enable dark theme (purely aesthetic...)
&lt;/h1&gt;

&lt;p&gt;Open dev tools &amp;gt; go to &lt;code&gt;Settings&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Toggle it!&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%2Fytkehcqsbl36f7g1iiz6.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%2Fytkehcqsbl36f7g1iiz6.PNG" alt="Dark theme" width="312" height="168"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  9. Chrome Extensions
&lt;/h1&gt;

&lt;p&gt;There are also a load of really handy extensions for use with various frameworks and tools. Ones that I have found particularly useful are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd" rel="noopener noreferrer"&gt;VueJS dev tools&lt;/a&gt; (Really excellent user experience)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi" rel="noopener noreferrer"&gt;ReactJS dev tools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/webstore/detail/google-analytics-debugger/jnkmfdileelhofjcijamephohjechhna" rel="noopener noreferrer"&gt;Google Analytics&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>javascript</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Learn. Do. Teach.</title>
      <dc:creator>Laura Weatherhead</dc:creator>
      <pubDate>Mon, 17 Dec 2018 14:24:48 +0000</pubDate>
      <link>https://forem.com/lssweatherhead/learn-do-teach-3225</link>
      <guid>https://forem.com/lssweatherhead/learn-do-teach-3225</guid>
      <description>&lt;p&gt;In the drizzly February of 2015, I was in San Francisco with a gaggle of Scottish women visiting some of the big tech giants such as Pinterest, Facebook and Google. Whilst there, we were invited to &lt;a href="https://www.ideo.com" rel="noopener noreferrer"&gt;IDEO&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For those who are unaware, IDEO is a digital product design company based out in Palo Alto (amongst other places) and they are connoisseurs of human-centred design. Some examples of their ideology include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Employing a 96-year-old woman to design and build a range of products to support the elderly.&lt;/li&gt;
&lt;li&gt;Having an entire &lt;a href="http://www.ideotoylab.com/" rel="noopener noreferrer"&gt;PlayLab&lt;/a&gt; which makes your inner child want to crash out on the beanbags and play with magic.&lt;/li&gt;
&lt;li&gt;Building fantastic projects such as a &lt;a href="https://www.ideo.com/blog/we-built-a-bot-to-assign-parking-spots-it-fought-back" rel="noopener noreferrer"&gt;sassy parking space assignment chatbot&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One thing that really stood out to me during our visit was their mantra of employee progression: &lt;strong&gt;Learn-Do-Teach&lt;/strong&gt;. I have used it as a signpost in my own career ever since.&lt;/p&gt;

&lt;p&gt;At its core, the idea is simple, they ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For each skill that you possess, where is it on the learn-do-teach scale?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For example, a high-level snapshot of my own LDT scale at the moment:&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%2Fz6wdd6coqqamvamgwxg3.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%2Fz6wdd6coqqamvamgwxg3.png" alt="Learn-Do-Teach" width="800" height="266"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I know that I'm happiest when I have pending learning to supplement what I am already actively dabbling with, but it's different for everyone. There are some paradigms (such as C# .NET) that I will never feel I fully "know", but always work with and am capable of teaching aspects of...! It always depends, and it's always a fluid model - the joy of being a developer is that you can never really stop learning! &amp;lt;3&lt;/p&gt;

&lt;p&gt;As we come to the close of 2018, now might be a good time to line up your own learnings or teachings. What's next for you?&lt;/p&gt;

</description>
      <category>career</category>
      <category>beginners</category>
      <category>learning</category>
    </item>
    <item>
      <title>What were (or are) your initial thoughts about the technology/software development industry?</title>
      <dc:creator>Laura Weatherhead</dc:creator>
      <pubDate>Sun, 09 Dec 2018 10:45:28 +0000</pubDate>
      <link>https://forem.com/lssweatherhead/what-were-or-are-your-initial-thoughts-about-the-technologysoftware-development-industry-1f41</link>
      <guid>https://forem.com/lssweatherhead/what-were-or-are-your-initial-thoughts-about-the-technologysoftware-development-industry-1f41</guid>
      <description>&lt;p&gt;“It’s all men.”&lt;/p&gt;

&lt;p&gt;“You need a technical degree before you can even knock on the door.”&lt;/p&gt;

&lt;p&gt;“Everybody is really clever.”&lt;/p&gt;




&lt;p&gt;I’m curious... how do we, as a technical industry, initially present to groups like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;new starts?&lt;/li&gt;
&lt;li&gt;juniors?&lt;/li&gt;
&lt;li&gt;graduates?&lt;/li&gt;
&lt;li&gt;people making lateral moves from other industries?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But also children, or parents? What do they think the unwritten rules of working in technology are?&lt;/p&gt;

&lt;p&gt;Doesn’t matter if you’ve dispelled them now or if they are actually true - every viewpoint is valid:&lt;/p&gt;

&lt;p&gt;What did &lt;strong&gt;you&lt;/strong&gt; think the rules were?&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>career</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Azure Web Apps - the troubleshooting era</title>
      <dc:creator>Laura Weatherhead</dc:creator>
      <pubDate>Wed, 05 Dec 2018 21:12:33 +0000</pubDate>
      <link>https://forem.com/lssweatherhead/azure-web-apps---the-troubleshooting-era-4n4i</link>
      <guid>https://forem.com/lssweatherhead/azure-web-apps---the-troubleshooting-era-4n4i</guid>
      <description>&lt;p&gt;So I am in something of a complicated relationship with Azure.&lt;/p&gt;

&lt;p&gt;I like that (in general) it makes my life easier.&lt;br&gt;
I like that hooking up continuous integration is so incredibly easy.&lt;br&gt;
I like that managing deployment slots and setting up new ones is logical and can be done quickly (albeit with something of a deployment wait); and I like that you can configure instances that will scale up or down depending on the demands that are made on their resources.&lt;/p&gt;

&lt;p&gt;I don't like how long everything seems to take to update/deploy/propagate.&lt;br&gt;
I don't like that the UI seems to have been built by about 200 people in simultaneous development so that sometimes things happen automagically and sometimes you have to hit 8 different confirm buttons before it registers that yes, you really do want to do that.&lt;br&gt;
I don't like trying to troubleshoot performance issues when there are so many different places for logs/analytics/insights.&lt;br&gt;
&lt;strong&gt;And I don't like that occasionally their idea of an error message is an unhappy cloud.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  I got 99 problems (well not concurrently, but that's how it felt)
&lt;/h3&gt;

&lt;p&gt;Recently, I was trying to get to the bottom of some rather frustrating performance issues on our Azure cloud catalog.&lt;/p&gt;

&lt;p&gt;The symptoms included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;intermittent downtime&lt;/li&gt;
&lt;li&gt;slow app restarts&lt;/li&gt;
&lt;li&gt;laggy front-end performance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One NET Core app in particular was very sickly and would classically take 7-8 minutes to find it's wee feet again when restarted. Bafflingly, it was also one of our simplest, smallest, lowest traffic apps, so what gives?&lt;/p&gt;




&lt;h3&gt;
  
  
  Have you tried switching it off and on again?
&lt;/h3&gt;

&lt;p&gt;Cue a montage (although in reality it was more an increasingly frustrating, ever-decreasing spiral) of trailing through spiky graph after spiky graph in Application Insights, downloading memory dumps, clicking hopefully through every log folder on blob storage and tentatively poking through various routes on the "Diagnose and Solve Problems" dashboard which wants to "chat" to you. Endearing.&lt;/p&gt;

&lt;p&gt;I started using phrases like "possible thread starvation" when colleagues asked how I was getting on, and spent enough time reading about startup configuration in Net Core that I was able to troubleshoot app bootstrapping at 50 paces, and yet still felt no closer to a solution.&lt;/p&gt;

&lt;p&gt;Although, that's not strictly true. I knew a little more about why things were happening...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;we have ~7 production sites sitting within one App Plan, and this plan scaled up and down on a schedule (7am and 10pm) as well as when resources were under pressure or released outwith this period&lt;/li&gt;
&lt;li&gt;when the plan scaled, the app service instances within it were either spun up or wound down for the sites and it was this period that made the poor wee Net Core app the most unhappy&lt;/li&gt;
&lt;li&gt;the Net Core app was the one which Pingdom kept pulling up for downtime issues, but actually all of the apps had a bit of a wobble during the restarts (they were just sitting under a different alert criteria, doh!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With this information, I could at least narrow my conversation with Google from the abstract and teenage-angst flavoured &lt;em&gt;"but why?"&lt;/em&gt; to a more concrete &lt;em&gt;"managing azure app restarts"&lt;/em&gt; and &lt;em&gt;"configuring multiple instances of net core apps"&lt;/em&gt;. This was small but hopeful progress.&lt;/p&gt;




&lt;h3&gt;
  
  
  Cutting a long (and, oh, terribly exciting) story a bit short
&lt;/h3&gt;

&lt;p&gt;Further investigation and coding montages led me to a set of guidance that I will lay here for future reference, and for any who are also trying to nurse sickly Azure Web Apps back to health:&lt;/p&gt;

&lt;p&gt;First, and the biggest win for me: the &lt;strong&gt;&lt;code&gt;AlwaysOn&lt;/code&gt;&lt;/strong&gt; setting on the &lt;em&gt;Application Settings&lt;/em&gt; tab. For those not familiar:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When Always On is enabled on a site, Windows Azure will automatically ping your Web Site regularly to ensure that the Web Site is always active and in a warm/running state.  This is useful to ensure that a site is always responsive (and that the app domain or worker process has not paged out due to lack of external HTTP requests).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Extracted from &lt;a href="https://weblogs.asp.net/scottgu/windows-azure-staging-publishing-support-for-web-sites-monitoring-improvements-hyper-v-recovery-manager-ga-and-pci-compliance" rel="noopener noreferrer"&gt;Scott Guthrie's blog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Sound sensible eh? And it is - on &lt;em&gt;production&lt;/em&gt; sites. But, and here is the small hole we'd dug for ourselves having been lent a shovel by Microsoft, it is &lt;strong&gt;not&lt;/strong&gt; a slot specific option so - to avoid production sites idling by accident after a staging swap - we had the &lt;code&gt;AlwaysOn&lt;/code&gt; option always on. On every slot. On every environment. For every project.&lt;/p&gt;

&lt;p&gt;That means that every time our 7 production sites scaled up, we'd get (e.g.) 2 instances of each, and both of these would get restarted and warmed up and then pinged to ensure they are &lt;code&gt;AlwaysOn&lt;/code&gt;. So far, so good. But then all of the staging and dev slots would be pinged and forced to start up and the sheer volume of I/O totally destroys the performance of, well, pretty much everything and gives the perceived downtime. Why does Azure Web App suffer so much with this? That's &lt;a href="https://stackoverflow.com/questions/36966505/azure-web-apps-are-really-slow" rel="noopener noreferrer"&gt;a different kettle of fish&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There's no nice way of managing this for us at the moment - if you handle slot swaps with a script I imagine you can toggle the &lt;code&gt;AlwaysOn&lt;/code&gt; option post-swappage. We've just had to add it as a manual check at the end of a deployment. It's not the end of the world, but it's certainly a little irritating nuance to be aware of!&lt;/p&gt;

&lt;p&gt;Other, smaller, wins included: moving from IMemoryCache to IDistributedCache on the Net Core app (to minimise I/O storage writing, and to enable us to take future advantage of load balancing), and ensuring that HTTPS Only flag is set to &lt;code&gt;true&lt;/code&gt; so that the app initializer isn't bounced around anywhere silly on startup. &lt;/p&gt;

</description>
      <category>azure</category>
      <category>webdev</category>
      <category>devops</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>Net Core security - NWebSec to the rescue!</title>
      <dc:creator>Laura Weatherhead</dc:creator>
      <pubDate>Fri, 30 Nov 2018 15:18:39 +0000</pubDate>
      <link>https://forem.com/lssweatherhead/net-core-security---nwebsec-to-the-rescue-259i</link>
      <guid>https://forem.com/lssweatherhead/net-core-security---nwebsec-to-the-rescue-259i</guid>
      <description>&lt;p&gt;A quick overview of securing a Net Core webapp using &lt;a href="https://docs.nwebsec.com/en/latest/" rel="noopener noreferrer"&gt;NWebSec&lt;/a&gt; and the web.config&lt;/p&gt;

&lt;p&gt;First up, let's install NWebSec middleware from nuget via the package manager&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;PM&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Install-Package&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;NWebsec.AspNetCore.Middleware&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For those of you (like me) who are a little rusty on security best practise, two of the general principles are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reduce attack surface (make it as hard as possible for potential attackers to glean information about your app)&lt;/li&gt;
&lt;li&gt;Restrict access (unless securely authorised)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The ingredients for a safe Net Core app broadly feed into these practises and include the following (non-exhaustive) list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[HSTS] HTTP Strict Transport Security Header&lt;/li&gt;
&lt;li&gt;X-XSS-Protection Header&lt;/li&gt;
&lt;li&gt;X-Frame-Options Header&lt;/li&gt;
&lt;li&gt;[CSP] Content-Security-Policy Header&lt;/li&gt;
&lt;li&gt;X-Content-Type-Options Header&lt;/li&gt;
&lt;li&gt;Referrer-Policy Http Header&lt;/li&gt;
&lt;li&gt;Remove the X-Powered-By header to remove the additional information transferred by verifying the app tech&lt;/li&gt;
&lt;li&gt;[HPKP] HTTP Public Key Pinning Header&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's take these one at a time!&lt;/p&gt;

&lt;h4 id="hsts"&gt;[HSTS] HTTP Strict Transport Security Header&lt;/h4&gt;

&lt;p&gt;This is what it sounds like - force all comms to go through HTTPS! Using the &lt;code&gt;.Preload()&lt;/code&gt; indicated below forces it from the first request.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseHsts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MaxAge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;365&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;IncludeSubdomains&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;Preload&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4 id="xxss"&gt;X-XSS-Protection Header&lt;/h4&gt;

&lt;p&gt;This response header prevents pages from loading in modern browsers when reflected cross-site scription is detected. This is often unnecessary if a site implements a strong &lt;code&gt;Content-Security-Policy&lt;/code&gt; (spoilers!)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseXXssProtection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;EnabledWithBlockMode&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4 id="xframoptions"&gt;X-Frame-Options Header&lt;/h4&gt;

&lt;p&gt;Ensure that site content is not being embedded in an iframe on other sites - used to avoid clickjacking attacks.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseXfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SameOrigin&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4 id="csp"&gt;[CSP] Content-Security-Policy Header&lt;/h4&gt;

&lt;p&gt;The content security policy essentially allows you to whitelist resource origins when the site is loaded. These policies are usually to do with server and script origins.&lt;/p&gt;

&lt;p&gt;There are a heap of different ways you can configure this and they are very much dependent upon your requirements and what you need to load in and out. You can read more about your options &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy" rel="noopener noreferrer"&gt;in the handy Mozilla docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An example would be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseCsp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opts&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;BlockAllMixedContent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;StyleSources&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Self&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;StyleSources&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UnsafeInline&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FontSources&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Self&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FormActions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Self&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FrameAncestors&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Self&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ImageSources&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Self&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ScriptSources&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Self&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4 id="xcontenttypeoptions"&gt;X-Content-Type-Options Header&lt;/h4&gt;

&lt;p&gt;Blocks any content sniffing that could happen that might change an innocent MIME type (e.g. text/css) into something executable that could do some real damage.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseXContentTypeOptions&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4 id="referrerpolicy"&gt;Referrer-Policy Http Header&lt;/h4&gt;

&lt;p&gt;This tells the site how much information to send along in the &lt;code&gt;Referer&lt;/code&gt; header field (misspelt!). Default value is &lt;code&gt;no-referrer-when-downgrade&lt;/code&gt; i.e. don't send any referrer data is we're downgrading security protocols and going HTTPS to an HTTP site.&lt;/p&gt;

&lt;p&gt;This one depends a bit on your requirements, the options are listed in detail &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy" rel="noopener noreferrer"&gt;on Mozilla's dev site&lt;/a&gt; to help you make a decision. If you want to be super safe, then opt for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseReferrerPolicy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opts&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;NoReferrer&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4 id="xpoweredby"&gt;Remove X-Powered-By Header&lt;/h4&gt;

&lt;p&gt;Now let's make sure that we're not giving information away regarding the technology in use (i.e. ASP.NET). To do this, we'll remove the X-Powered-By header by adding to the web.config&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;system.web&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;httpRuntime&lt;/span&gt; &lt;span class="na"&gt;enableVersionHeader=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/system.web&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;system.webServer&amp;gt;&lt;/span&gt;
   ...
   &lt;span class="nt"&gt;&amp;lt;httpProtocol&amp;gt;&lt;/span&gt;
     &lt;span class="nt"&gt;&amp;lt;customHeaders&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;remove&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"X-Powered-By"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
     &lt;span class="nt"&gt;&amp;lt;/customHeaders&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;/httpProtocol&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/system.webServer&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4 id="hpkp"&gt;[HPKP] HTTP Public Key Pinning Header&lt;/h4&gt;

&lt;p&gt;This one is interesting and to do with the whitelisting certificates. There are couple of plugins you can use to facilitate this and it's covered comprehensively in @JoonasWestlin blog &lt;a href="https://joonasw.net/view/hpkp-in-aspnet-core" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;b&gt;Further links/reading:&lt;/b&gt; A good tool to test the security headers is using &lt;a href="https://tools.geekflare.com/header-security-test" rel="noopener noreferrer"&gt;Geek Flare&lt;/a&gt; and a wealth of easy to digest information for general .NET security best practise is available at &lt;a href="https://www.owasp.org/index.php/.NET_Security_Cheat_Sheet" rel="noopener noreferrer"&gt;OWASP.org&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is just a quick point of reference to get started on Net Core site (mostly header-based) security - what's missing? Other recommendations?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>security</category>
      <category>aspnetcore</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>The Happy World of ngrok</title>
      <dc:creator>Laura Weatherhead</dc:creator>
      <pubDate>Tue, 27 Nov 2018 12:46:50 +0000</pubDate>
      <link>https://forem.com/lssweatherhead/the-happy-world-of-ngrok-45km</link>
      <guid>https://forem.com/lssweatherhead/the-happy-world-of-ngrok-45km</guid>
      <description>&lt;p&gt;Current favourite tool: &lt;b&gt;ngrok&lt;/b&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Have you ever wanted to share something still in development with a product manager, project manager or even another developer just so they could give it a quick click through, maybe give you some pointers, nothing too intense?&lt;/li&gt;
&lt;li&gt;Have you ever been working with a third-party service (Mailchimp, SendGrid, SparkPost, Twilio, Authy, the list goes on…) and want to use a webhook to channel data around on a dev site?&lt;/li&gt;
&lt;li&gt;Have you ever been giving a dev talk and thought “it would be great if people could just access this site I’m running locally”, but you don’t want to deploy anything?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ngrok is the answer. It’s a command line tool that gives access to your local server using a secure URL and an excellent debugging/inspection panel to boot.&lt;/p&gt;

&lt;p&gt;It is the best thing. No, really. I am prone to occasional geeking-out on technology-fronts (a certain ramble about how finding the perfect monitor configuration could equate to finding true love springs to mind), but trust me on this one.&lt;/p&gt;

&lt;p&gt;Reasons why you should love ngrok as much as I do:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It’s free! (I mean, you can pay if you want custom subdomains etc, but for most development/testing needs the free version is where it’s at)&lt;/li&gt;
&lt;li&gt;It’s as easy as cmd &lt;code&gt;ngrok http 80&lt;/code&gt; and boom, you’re up and running&lt;/li&gt;
&lt;li&gt;But what if you’re running on IIS express? That’s super easy too:
&lt;code&gt;ngrok http -host-header="localhost:[port-number]" [port-number]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The inspection panel is unexpectedly helpful, I’ve never felt so supported by a tool. I mean, I love Fiddler, but there’s just so much functionality I often feel like I’m shortchanging it a bit... (like someone built me a mansion and I’ve moved into the larder to live)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Just to be clear, I am in no way affiliated with ngrok or it’s devs, I am just excitable when it comes to speeding up my own dev processes!&lt;/p&gt;

&lt;p&gt;Download it here: &lt;a href="https://ngrok.com/download" rel="noopener noreferrer"&gt;https://ngrok.com/download&lt;/a&gt; &lt;/p&gt;

</description>
      <category>productivity</category>
      <category>technology</category>
      <category>csharp</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
