<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Funky Si&#39;s Blog</title>
    <link>https://www.funkysi1701.com/</link>
    <description>Recent content on Funky Si&#39;s Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-gb</language>
    <lastBuildDate>Sun, 18 Feb 2024 11:00:00 +0000</lastBuildDate><atom:link href="https://www.funkysi1701.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Funky Si walks a half marathon</title>
      <link>https://www.funkysi1701.com/posts/2024/charity-hike/</link>
      <pubDate>Sun, 18 Feb 2024 11:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2024/charity-hike/</guid>
      <description>&lt;p&gt;On June 8th I will walk 13 miles near Bakewell in the Peak District to raise £250 (or more) for Cancer Research. To sponsor me click &lt;a href=&#34;https://fundraise.cancerresearchuk.org/page/funkysi1701&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;fundraise.cancerresearchuk.org/page/funkysi1701&lt;/a&gt;
, to find out more about the event go &lt;a href=&#34;https://www.cancerresearchuk.org/get-involved/find-an-event/big-hike/big-hike-peak-district&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;www.cancerresearchuk.org/get-involved/find-an-event/big-hike/big-hike-peak-district&lt;/a&gt;
&lt;/p&gt;
&lt;h2 id=&#34;so-why-am-i-doing-this&#34;&gt;So why am I doing this?&lt;a class=&#34;anchor ms-1&#34; href=&#34;#so-why-am-i-doing-this&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;img src=&#34;https://www.funkysi1701.com/images/fsi-hike-route.png&#34; width=&#34;400px&#34; style=&#34;float:left;padding-right:8px&#34; /&gt;
I am a Software Developer in my day to day life, which does not involve a lot of physical activity. I have become very lazy. Doing a half marathon is completely outside of my comfort zone and is not at all a me thing to do.
&lt;p&gt;However last year I realised my mental health was starting to degrade. I have a family which keeps me very busy, I am facing lots of challenges with this, other members of my family have mental health issues which is starting to have a knock on affect on me.&lt;/p&gt;
&lt;p&gt;I mentioned some of these challenges to a friend who suggested I join a walking group which was helping people with mental health problems. I went along and to my surprise I really enjoyed myself, the people were friendly and I enjoyed the walk in the countryside. After this I went out and bought some proper walking shoes&lt;/p&gt;
&lt;p&gt;I went to the next one, and the next one and each time I enjoyed myself. I must admit that after these walks it tired me out due to my unfit nature, but it was worth it as for a few hours I wasn&amp;rsquo;t thinking about the 101 problems that I had no solutions for.&lt;/p&gt;
&lt;p&gt;Fast forward to about a week ago, an advert for this charity walk popped up on facebook. I took a look at it and I started thinking. The 10k was a similar distance I had done on one of my walks, so I could easily do that. What if I could raise some money for a charity and go for a fun walk? For the next few days I kept thinking about it. Eventually I booked it. My thinking was if I am going to do something for charity I need to push myself outside of my comfort zone. I would never manage a full marathon, but what about a half marathon?&lt;/p&gt;
&lt;p&gt;So tomorrow I start training, every day or so I walk for about 40 minutes, I will probably post some updates on my &lt;a href=&#34;https://fundraise.cancerresearchuk.org/page/funkysi1701&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;charity page&lt;/a&gt;
 as no doubt I will struggle to keep going.&lt;/p&gt;
&lt;p&gt;Please if you can think about donating, and give me some encouragement I think I am going to need it.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>TrekRanks #174</title>
      <link>https://www.funkysi1701.com/posts/2024/trekranks/</link>
      <pubDate>Fri, 05 Jan 2024 20:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2024/trekranks/</guid>
      <description>&lt;h2 id=&#34;trek-ranks-174-top-5-ensemble-episodes&#34;&gt;Trek Ranks #174: Top 5 Ensemble Episodes&lt;a class=&#34;anchor ms-1&#34; href=&#34;#trek-ranks-174-top-5-ensemble-episodes&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I was recently invited onto the &lt;a href=&#34;https://www.trekranks.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;TrekRanks&lt;/a&gt;
 podcast. I had a great time talking Trek with Jim Moorhouse and fellow guest Anika Dane. If Trek is your thing, do take a listen.&lt;/p&gt;
&lt;p&gt;Everyone contributes in this episode of TrekRanks as we break down the &amp;ldquo;Top 5 Ensemble Episodes.&amp;rdquo; Our panel highlight those episodes in which the entire cast play important roles and help portray the group as a whole, rather than as individuals. From heavy hitters to deep cuts and everything in between, this one quite appropriately covers it all.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.thetricordertransmissions.com/episode.php?ep=TR174&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Listen here&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://www.funkysi1701.com/images/TrekRanks-ep174.jpg&#34; loading=&#34;lazy&#34;
   width=&#34;1920&#34; height=&#34;1080&#34;
   /&gt;

&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Make API calls from Visual Studio or Visual Studio Code</title>
      <link>https://www.funkysi1701.com/posts/2023/make-api-calls-from-visual-studio/</link>
      <pubDate>Sun, 19 Nov 2023 22:50:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2023/make-api-calls-from-visual-studio/</guid>
      <description>&lt;p&gt;It is that exciting time of year where Microsoft announce a new version of .Net (Version 8 this time) and Visual Studio. There have been lots of announcements which I am still digesting, but one that caught my eye was a new window in Visual Studio that shows all your API endpoints.&lt;/p&gt;
&lt;p&gt;The new window is called &lt;strong&gt;Endpoint Explorer&lt;/strong&gt; and can be added from the menu &lt;strong&gt;View &amp;gt; Other Windows &amp;gt; Endpoint Explorer&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://www.funkysi1701.com/images/endpoint-explorer.png&#34; loading=&#34;lazy&#34;
   width=&#34;400&#34; height=&#34;434&#34;
   /&gt;

&lt;/p&gt;
&lt;p&gt;If you right click on one of the endpoints you can view the code or send a request. It works with minimal APIs or standard MVC APIs. If you select send a request a .http file will be created, this is a feature that has been in Visual Studio for a while but I haven&amp;rsquo;t taken much notice.&lt;/p&gt;
&lt;p&gt;The syntax for writing these API calls is fairly simple&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;GET {{Catalog.API_HostAddress}}/api/v1/catalog/items
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Or something more complex, this one is a POST with a body and a header. This is how you might call APIs which require authentication. Just include a header with your auth token.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;POST {{Catalog.API_HostAddress}}/api/v1/catalog/items
Accept: application/json

{
    &amp;#34;name&amp;#34;: &amp;#34;Test&amp;#34;,
    &amp;#34;description&amp;#34;: &amp;#34;Test&amp;#34;,
    &amp;#34;price&amp;#34;: 1.99,
    &amp;#34;pictureFileName&amp;#34;: &amp;#34;test.png&amp;#34;,
    &amp;#34;pictureUri&amp;#34;: &amp;#34;https://picsum.photos/200/300&amp;#34;

}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You can also set up various variables at the top of your .http files by prefixing with an @, by default you get one that defines your base URL, but you can add more.&lt;/p&gt;
&lt;p&gt;eg @variable = value&lt;/p&gt;
&lt;p&gt;Full docs of how you use .http files can be found &lt;a href=&#34;https://learn.microsoft.com/en-us/aspnet/core/test/http-files?view=aspnetcore-8.0&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;here&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;A hyperlink above each API call in your .http file is labelled Send request. This initiates the API call and your window splits in half with the right hand side displaying the response.&lt;/p&gt;
&lt;p&gt;The response has four tabs, a nicely json formatted response, a raw response, a headers tab and a request tab.&lt;/p&gt;
&lt;p&gt;Now you will notice an env box underneath your file tabs, where the method dropdown is in a normal c# class file. It took me a while to figure out how to setup environments, but you can add a file that contain environment specific config, like base URL for test/prod/dev etc.&lt;/p&gt;
&lt;p&gt;This blog post tells me about it &lt;a href=&#34;https://devblogs.microsoft.com/visualstudio/safely-use-secrets-in-http-requests-in-visual-studio-2022/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;here&lt;/a&gt;
 but the main thing is you need to add a json file called &lt;strong&gt;http-client.env.json&lt;/strong&gt; and create some json like this:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;  &amp;#34;local&amp;#34;: {
    &amp;#34;Api_HostAddress&amp;#34;: &amp;#34;http://localhost:44338&amp;#34;
  },
  &amp;#34;dev&amp;#34;: {
    &amp;#34;Api_HostAddress&amp;#34;: &amp;#34;https://dev.example.com&amp;#34;
  },
  &amp;#34;test&amp;#34;: {
    &amp;#34;Api_HostAddress&amp;#34;: &amp;#34;https://test.example.com&amp;#34;
  },
  &amp;#34;prod&amp;#34;: {
    &amp;#34;Api_HostAddress&amp;#34;: &amp;#34;https://prod.example.com&amp;#34;
  }
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Other environment specific variables can be added in the same way. Now you can easily call your API in different environments without having to change the URL each time.&lt;/p&gt;
&lt;h2 id=&#34;but-what-about-vs-code&#34;&gt;But what about VS Code?&lt;a class=&#34;anchor ms-1&#34; href=&#34;#but-what-about-vs-code&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Well it turns out that VS Code has a similar feature, but it is not enabled by default. You need to install the &lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=humao.rest-client&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;REST Client&lt;/a&gt;
 extension. Once installed you can create a .http file and start making API calls. The syntax is very similar to Visual Studio.&lt;/p&gt;
&lt;p&gt;VS Code has a similar concept of environments. Go to Extensions &amp;gt; REST Client &amp;gt; Extension Settings and click on Edit in settings.json. Add the same settings we used with VS to your settings.json file. You can now switch environments from the command palette &amp;ldquo;Rest Client: Switch Environment&amp;rdquo; and select the environment you want to use.&lt;/p&gt;
&lt;p&gt;You can make use of the response of one API call in the request of another.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;### 1st API Call
# @name login
POST {{Catalog.API_HostAddress}}/api/v1/identity/login
Content-Type: application/json

{
    &amp;#34;user&amp;#34;: &amp;#34;username&amp;#34;,
    &amp;#34;password&amp;#34;: &amp;#34;password&amp;#34;
}

### 2nd API Call
GET {{Catalog.API_HostAddress}}/api/v1/catalog/items
Authorization: Bearer {{login.response.body.token}}
Content-Type: application/json
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The last feature of VS Code I want to mention is that it can make GQL calls.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;POST {{Catalog.API_HostAddress}}/graphql
X-REQUEST-TYPE: GraphQL
Content-Type: application/json
Authorization: Bearer {{login.response.body.token}}

query ($name: String!, $owner: String!) {
  repository(name: $name, owner: $owner) {
    name
    fullName: nameWithOwner
    description
    diskUsage
    forkCount
    stargazers(first: 5) {
        totalCount
        nodes {
            login
            name
        }
    }
    watchers {
        totalCount
    }
  }
}

{
    &amp;#34;name&amp;#34;: &amp;#34;vscode-restclient&amp;#34;,
    &amp;#34;owner&amp;#34;: &amp;#34;Huachao&amp;#34;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sorry postman but I think I have a new favourite tool for making API calls.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Become the best Actor, Astronaut or Developer you can be!</title>
      <link>https://www.funkysi1701.com/posts/2023/become-the-best-actor-astronaut-or-developer-you-can-be/</link>
      <pubDate>Fri, 03 Nov 2023 01:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2023/become-the-best-actor-astronaut-or-developer-you-can-be/</guid>
      <description>&lt;img src=&#34;https://www.funkysi1701.com/images/patrick-stewart.jpg&#34; width=&#34;400px&#34; style=&#34;float:left;padding-right:8px&#34; /&gt;
&lt;p&gt;Recently I have been reading the first few chapters of Patrick Stewart&amp;rsquo;s Memoir, &lt;a href=&#34;https://www.amazon.co.uk/Making-It-So-A-Memoir/dp/B0C3VXDSGR/ref=sr_1_1&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Making It So: A Memoir&lt;/a&gt;
. In it he tells the story of his early life. I find it fascinating that very early on it is quite clear he had a life goal. Become the best actor Patrick Stewart can be.&lt;/p&gt;
&lt;p&gt;Yes, there are other things in his life but this is what motivates much of what he does. At 12 he went on an 8 day residential drama course, where he met with like minded people that encourage him. So much that he continued to meet with them years after that course finished to grow his skills as an actor. This is something I would encourage everyone to do, find your tribe, find like minded people that will encourage you to grow and learn.&lt;/p&gt;
&lt;p&gt;After school he couldn&amp;rsquo;t see a future in acting professionally so took a job at a newspaper.  However when his job interfered with his acting in amateur dramatic groups, it caused him to reassess his priorities and he began saving to go to drama school. While at drama school he continued to improve and grow his acting skills. He has a singular vision in these early years to become an actor, and within a few weeks of finishing his training he had a job as an actor at a theatre. I have got up to the point where he is about to go on a world tour with a theatre group. During his first few jobs he continues to work on his acting skills. There is no doubt in my mind that this sense of continuous improvement helped mold Patrick Stewart into the actor we know today. While I am not a actor, I often think about continuous improvement, how can I be better at what I do.&lt;/p&gt;
&lt;img src=&#34;https://www.funkysi1701.com/images/million-miles.jpg&#34; width=&#34;400px&#34; style=&#34;float:right;padding-left:8px&#34; /&gt;
&lt;p&gt;A film I saw recently has a similar tale of a singular vision. &lt;a href=&#34;https://www.amazon.co.uk/Million-Miles-Away-Michael-Pe%C3%B1a/dp/B0CC7MQFVD/ref=sr_1_1&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;A Million Miles Away&lt;/a&gt;
 tells the story of Jose Hernandez, a man that wanted to be an Astronaut and applied to NASA 12 times (he was rejected 11 times!) He started life as a migrant farm worker, (so similar to Patrick Stewart who also grew up in poverty). He did everything in his power to achieve his goals, and didn&amp;rsquo;t give up.&lt;/p&gt;
&lt;p&gt;Jose Hernandez, when facing failure looked at those that had got into NASA. What did they have that he didn&amp;rsquo;t? He then worked on those areas to improve himself. He didn&amp;rsquo;t give up, he kept going. He works on his fitness, he got a pilots license, he learns Russian.&lt;/p&gt;
&lt;p&gt;So what&amp;rsquo;s my point. Have a Big Goal. It can be anything but it needs to be &lt;strong&gt;big&lt;/strong&gt;. My big goal of becoming a developer was achieved many years ago, and since then I have done a fair amount of drifting through life. What I need to do is be more like Patrick Stewart and continue to improve my skills, everyday make myself a better developer. What problems am I facing, lets break them down into manageable goals and get them solved so I can move on to the next lot.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>DDD East Midlands</title>
      <link>https://www.funkysi1701.com/posts/2023/ddd-east-midlands/</link>
      <pubDate>Mon, 09 Oct 2023 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2023/ddd-east-midlands/</guid>
      <description>&lt;p&gt;On Saturday 7th October I attended &lt;a href=&#34;https://dddeastmidlands.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;DDD East Midlands&lt;/a&gt;
. It is a community run conference for Developers (the D&amp;rsquo;s stand for Developer) and I had a great time, I have been to DDD North before but this was the first time going to Nottingham for a conference (I grew up in Nottingham, or a town not far from). As I have said before there is nothing quite like chatting over coffee or lunch with fellow Developers about the tech you are learning about, this was probably my favourite thing about conferences. Now on to the talks:&lt;/p&gt;
&lt;h2 id=&#34;dungeons-dragons-and-developers&#34;&gt;Dungeons, Dragons and Developers&lt;a class=&#34;anchor ms-1&#34; href=&#34;#dungeons-dragons-and-developers&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/Brunty&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Matt Brunt&lt;/a&gt;
 gave an excellent keynote talk, comparing the role playing game Dungeons and Dragons with working on Software projects. A good D&amp;amp;D game involves team work, very like a good Software Team. A team of all wizards isn&amp;rsquo;t going to get you very far, the same way a team full of developers that excel at algorithms, won&amp;rsquo;t be good at testing, talking to customers etc. A wizard that has a secret spell to defeat the Troll under the bridge, is almost as bad as a developer that hordes his knowledge and &amp;ldquo;saves the day&amp;rdquo; when things go wrong.  Keeping connected with your team as you go out on your quest so no one gets lost is as important as keeping connected with your software team.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://www.funkysi1701.com/images/F701q6xXEAAgZk3.jpg&#34; loading=&#34;lazy&#34;
   width=&#34;680&#34; height=&#34;510&#34;
   /&gt;

&lt;/p&gt;
&lt;h2 id=&#34;microservice-mistakes&#34;&gt;Microservice Mistakes&lt;a class=&#34;anchor ms-1&#34; href=&#34;#microservice-mistakes&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/DoesDotNet&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Matt Hunt&lt;/a&gt;
 talked about microservice mistakes he had made.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Long lived small teams&lt;/li&gt;
&lt;li&gt;Can&amp;rsquo;t test by &lt;strong&gt;only&lt;/strong&gt; interacting with the frontend&lt;/li&gt;
&lt;li&gt;Use events as well as API calls&lt;/li&gt;
&lt;li&gt;Need to be able to deploy independently of each other&lt;/li&gt;
&lt;li&gt;Have a specific reason for using microservices, a problem to solve&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;the-art-of-the-bad-code-review&#34;&gt;The Art of the Bad Code Review&lt;a class=&#34;anchor ms-1&#34; href=&#34;#the-art-of-the-bad-code-review&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A 15 minute lightning talk with &lt;a href=&#34;https://twitter.com/makitdev&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Martyn Kilbryde&lt;/a&gt;
 A fun talk showing some examples of bad code reviews, a few takeaways from this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Explain what is being fixed with a link to the ticket&lt;/li&gt;
&lt;li&gt;Give specific, actionable feedback&lt;/li&gt;
&lt;li&gt;Balance the boy scout rule of leaving the code better than when you found it with do one thing rule&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t make assumptions -&amp;gt; have a conversation instead&lt;/li&gt;
&lt;li&gt;Be helpful and constructive, not dismissive and negative&lt;/li&gt;
&lt;li&gt;Use a branch per ticket, don&amp;rsquo;t tie them together&lt;/li&gt;
&lt;li&gt;Refer to the requirements&lt;/li&gt;
&lt;li&gt;No room for ego, code belongs to the team not an individual&lt;/li&gt;
&lt;li&gt;Avoid overly verbose comments&lt;/li&gt;
&lt;li&gt;Pragmatism is important&lt;/li&gt;
&lt;li&gt;If urgent, raise additional tickets with tech debt issues&lt;/li&gt;
&lt;li&gt;Challenge if necessary, but do so respectfully&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t do a piecemeal review&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;git-under-the-covers&#34;&gt;Git Under the covers&lt;a class=&#34;anchor ms-1&#34; href=&#34;#git-under-the-covers&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Another 15 minute lightning talk with &lt;a href=&#34;https://twitter.com/dracan&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Dan Clarke&lt;/a&gt;
 This looked at the inner workings of git, this was fascinating as every part points at another part which is obviously part of the reason git is so powerful. It was quite technical and I am sure some of it went over my head.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://www.funkysi1701.com/images/F71PCBEXsAA4_aJ.jpg&#34; loading=&#34;lazy&#34;
   width=&#34;1639&#34; height=&#34;864&#34;
   /&gt;

&lt;/p&gt;
&lt;h2 id=&#34;this-talk-could-have-been-a-blog-post&#34;&gt;This talk could have been a blog post&lt;a class=&#34;anchor ms-1&#34; href=&#34;#this-talk-could-have-been-a-blog-post&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Another 15 minute lightning talk with &lt;a href=&#34;https://twitter.com/JamieTanna&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Jamie Tanna&lt;/a&gt;
. This was a good talk about the importance of blogging. He used the phrase &lt;strong&gt;blogumentation&lt;/strong&gt;, now I have heard of this before but not its name. It is where you use your blog to document what you have learnt, it can be anything a new command or a new language or technology. This talk inspired me to write this blog post, Thank you Jamie. His blog can be found at &lt;a href=&#34;https://www.jvt.me/posts/2023/10/07/why-blog/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://www.jvt.me/posts/2023/10/07/why-blog/&lt;/a&gt;
&lt;/p&gt;
&lt;h2 id=&#34;how-to-create-the-conditions-where-happy-people-do-their-best-work&#34;&gt;How to create the conditions where happy people do their best work&lt;a class=&#34;anchor ms-1&#34; href=&#34;#how-to-create-the-conditions-where-happy-people-do-their-best-work&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/paul_bailey_&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Paul Bailey&lt;/a&gt;
 introduced the concept of Communities of Practice. Lots of the features of a Community of Practice I have heard of or been in teams that implement. &lt;em&gt;&amp;ldquo;Communities of Practice are groups of people who share a concern or passion for something they do and learn how to do it better as they interact regularly&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://www.funkysi1701.com/images/F71n4uiWYAA4KHL.jpg&#34; loading=&#34;lazy&#34;
   width=&#34;2048&#34; height=&#34;1536&#34;
   /&gt;

&lt;/p&gt;
&lt;h2 id=&#34;building-robots-for-complete-beginners&#34;&gt;Building Robots for Complete Beginners&lt;a class=&#34;anchor ms-1&#34; href=&#34;#building-robots-for-complete-beginners&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Last talk of the day was my favourite (because it was about Robots) &lt;a href=&#34;https://www.linkedin.com/in/mark4security/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Mark Goodwin&lt;/a&gt;
 talked about building Robots using Rasbery Pi Pico (a microcontroller board), most of his examples used python. His demo can be found at &lt;a href=&#34;https://github.com/computerist/robot-demos&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://github.com/computerist/robot-demos&lt;/a&gt;
 This fascinated me as I have already dipped my toe into this area when playing with &lt;a href=&#34;https://www.funkysi1701.com/posts/2022/microbit/&#34;&gt;microbits&lt;/a&gt;
&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Picard Season 3</title>
      <link>https://www.funkysi1701.com/posts/2023/picard-season-three/</link>
      <pubDate>Thu, 23 Feb 2023 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2023/picard-season-three/</guid>
      <description>&lt;p&gt;Last night I had a bit of a chat about season 3 of Star Trek Picard.&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;Before &lt;a href=&#34;https://twitter.com/hashtag/startrek?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#startrek&lt;/a&gt; &lt;a href=&#34;https://twitter.com/hashtag/Picard?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#Picard&lt;/a&gt; S3ep2 airs this week; &lt;a href=&#34;https://twitter.com/danielhuckfield?ref_src=twsrc%5Etfw&#34;&gt;@danielhuckfield&lt;/a&gt; Special Guest &lt;a href=&#34;https://twitter.com/funkysi1701?ref_src=twsrc%5Etfw&#34;&gt;@funkysi1701&lt;/a&gt; and &lt;a href=&#34;https://twitter.com/hitch_daniel?ref_src=twsrc%5Etfw&#34;&gt;@hitch_daniel&lt;/a&gt; chat about the first episode on the Nexus Nights spin-off show.&lt;a href=&#34;https://t.co/Jyov53z7hC&#34;&gt;https://t.co/Jyov53z7hC&lt;/a&gt;&lt;/p&gt;&amp;mdash; The Temporal Trek Podcast(s) (@rider_coattail) &lt;a href=&#34;https://twitter.com/rider_coattail/status/1628713326149570563?ref_src=twsrc%5Etfw&#34;&gt;February 23, 2023&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;p&gt;Here is the episode I recorded: &lt;a href=&#34;https://anchor.fm/daniel-peter-hitch/episodes/TTNN-Ep-36---PIC-S3ep1-Reaction-Chat-e1vdglo&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;TTNN Ep 36 - PIC S3ep1 Reaction Chat&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Dan and Dan are joined by previous Temporal Trek guest Si Foster for a little chinwag over the return of PICARD for the final season.&lt;/p&gt;
&lt;p&gt;Badass Bev, Starships of Thesseus, love to loathe Captain Shaw, Predictions and More.&lt;/p&gt;
&lt;p&gt;It was great fun to record and I hope you enjoy giving it a listen., Hopefully I will be back at the end of the season to discuss the conclusion.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How much does it cost?</title>
      <link>https://www.funkysi1701.com/posts/2023/how-much-does-it-cost/</link>
      <pubDate>Sat, 04 Feb 2023 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2023/how-much-does-it-cost/</guid>
      <description>&lt;p&gt;How much does it Cost to run my side projects? This is going to be an interesting look at my spending, hopefully it can show you can do a lot without breaking the bank!&lt;/p&gt;
&lt;p&gt;I have a personal Azure subscription that I pay for myself. I don&amp;rsquo;t use anything connected to my work, as jobs change and I don&amp;rsquo;t want to have to shift stuff if I change employers (which happened quite recently). I like Azure, and I like learning what I can do with it, so spending small amounts on a personal subscription is not a problem for me.&lt;/p&gt;
&lt;p&gt;This is how much Azure is costing me daily, I like to keep an eye on this chart fairly often so I can see if I get any increases, especially if I have added a new service.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://www.funkysi1701.com/images/daily-costs.png&#34; loading=&#34;lazy&#34;
   width=&#34;1204&#34; height=&#34;780&#34;
   /&gt;

&lt;/p&gt;
&lt;p&gt;This is my monthly charges over the last few months. In Sept/Oct I switched from CosmosDB to Mongo DB Atlas as my database backend. Experience has told me that my biggest charge is data storage, websites are cheap but any database or storage is what tends to cost the most.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://www.funkysi1701.com/images/monthly-costs.png&#34; loading=&#34;lazy&#34;
   width=&#34;1206&#34; height=&#34;748&#34;
   /&gt;

&lt;/p&gt;
&lt;p&gt;This website you are reading this on (assuming you are not on DevTo or Hashnode) is running Hugo which runs on an Azure Static Web App, the free tier so almost free. I have two of these, a production one and a test one. Source code is on Github (another free service), and auto deploys via Github actions. I have a load of images which I have stuffed in blob storage from when I used to run a wordpress site, the cost for file storage is minimal.&lt;/p&gt;
&lt;p&gt;I also have a service I built using Azure Functions and Static Web Apps which makes use of public APIs like (Twitter/Mastodon/GitHub etc), data for this is stored in the free tier of Mongo DB Atlas. I then use consumption tier Azure Functions and Free Static Web App to do stuff. The definition of what I have deployed is all setup in Pulumi, so I have identical environments for Dev/Test/Prod mostly because I can rather than it being business critical or getting a lot of traffic.&lt;/p&gt;
&lt;p&gt;I currently have 240Mb of data in my free MongoDb database, I have 512 Mb max storage to play with. I have plenty of data to play with at this tier, but I may investigate other options that involve storing less or what costs might be. I previously made use of cosmosDB, which was costing me between £10-£20 per month, so not breaking the bank, but also cheaper to use MongoDB.&lt;/p&gt;
&lt;p&gt;Interrogating the Azure Cost Analysis tool reveals that my biggest cost is file storage (67p Prod, 101p Test and 93p Dev), I may investigate this a bit and see what is using this, but its not breaking the bank so I am pretty happy.&lt;/p&gt;
&lt;p&gt;So what else does it cost to run my things?&lt;/p&gt;
&lt;p&gt;My domains live on CloudFlare, I recently got a bill for £8.04 for a couple of renewals for the next 12 months. But I am struggling to think what else costs me to run my digital things.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>What podcasts have I been listening to - Week 2</title>
      <link>https://www.funkysi1701.com/posts/2023/what-have-i-been-listening-to-week2/</link>
      <pubDate>Mon, 23 Jan 2023 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2023/what-have-i-been-listening-to-week2/</guid>
      <description>&lt;p&gt;Another week has gone by so here is a rundown of my podcasts listenings&amp;hellip;&lt;/p&gt;
&lt;h2 id=&#34;hachyderms-kris-nova-on-running-a-mastodon-server&#34;&gt;Hachyderm&amp;rsquo;s Kris Nova on running a Mastodon Server&lt;a class=&#34;anchor ms-1&#34; href=&#34;#hachyderms-kris-nova-on-running-a-mastodon-server&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://hanselminutes.com/872/hachyderms-kris-nova-on-running-a-mastodon-server&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Hanselminutes episode 871&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;A great chat about how Hachderm grew as people moved from Twitter to Mastodon. You can find me on Hachyderm &lt;a href=&#34;https://hachyderm.io/web/@funkysi1701&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://hachyderm.io/web/@funkysi1701&lt;/a&gt;
 Hachyderm saw amazing growth in a short space of time, so great to hear how that impacted the service, which Kris Nova provides for free in her own time.&lt;/p&gt;
&lt;h2 id=&#34;the-shipment&#34;&gt;The Shipment&lt;a class=&#34;anchor ms-1&#34; href=&#34;#the-shipment&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://podcasts.apple.com/gb/podcast/the-temporal-trek-podcast-season-3-episode-59-the-shipment/id1499160640?i=1000591042656&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;The Temporal Trek Season 3 episode 58&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;DanDan discuss the season 3 episode The Shipment, which sees Enterprise season 3 back on track, with a proper Star Trek story. But I can&amp;rsquo;t believe Dan forgot to include the DanDan jingle its why I tune in each week.&lt;/p&gt;
&lt;h2 id=&#34;trekranks-potpouri&#34;&gt;TrekRanks Potpouri&lt;a class=&#34;anchor ms-1&#34; href=&#34;#trekranks-potpouri&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://www.trekranks.com/trekranks-podcast&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;TrekRanks episode 150&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;This was a great show celebrating 150 shows, and was a lucky dip into all the 149 topics that have been chosen before. Jim was caught out by the guests this week as they went above and beyond finding answers for all possible shows that could be picked. As always some great picks reminding me why I love the show.&lt;/p&gt;
&lt;h2 id=&#34;troy-hunts-weekly-update&#34;&gt;Troy Hunt&amp;rsquo;s Weekly Update&lt;a class=&#34;anchor ms-1&#34; href=&#34;#troy-hunts-weekly-update&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://www.troyhunt.com/weekly-update-327/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Weekly Update 327&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;I like listening to what Troy has been up to in the last week. (I am a bit behind as this show came out at Christmas time) Troy talks about Twitter and Elon Musk, and the LastPass data breach. I am a big fan of 1Password for my password manager but my employer uses LastPass&lt;/p&gt;
&lt;h2 id=&#34;troy-vinson-learning-from-the-rackspace-security-breach&#34;&gt;Troy Vinson: Learning From the Rackspace Security Breach&lt;a class=&#34;anchor ms-1&#34; href=&#34;#troy-vinson-learning-from-the-rackspace-security-breach&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=MsK5zaUogJ4&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Azure DevOps Podcast Episode 225&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;An interesting look at security and the recent rackspace incident. I used to be a big fan of Rackspace but in recent years I have been more interested in cloud offerings like Azure.&lt;/p&gt;
&lt;h2 id=&#34;dr-gregory-kapfhammer-wants-to-stop-flaky-tests&#34;&gt;Dr. Gregory Kapfhammer wants to stop flaky tests&lt;a class=&#34;anchor ms-1&#34; href=&#34;#dr-gregory-kapfhammer-wants-to-stop-flaky-tests&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://hanselminutes.com/874/dr-gregory-kapfhammer-wants-to-stop-flaky-tests&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Hanselminutes episode 874&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;I am currently looking at fixing some flaky tests on a codebase I am not familiar with so this is a great podcast to listen to. The episode goes through common reactions to flaky tests, why tests get flaky and what to do about them.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>What podcasts have I been listening to</title>
      <link>https://www.funkysi1701.com/posts/2023/what-have-i-been-listening-to/</link>
      <pubDate>Thu, 05 Jan 2023 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2023/what-have-i-been-listening-to/</guid>
      <description>&lt;p&gt;I love listening to podcasts so I thought I would share what I have been listening to over the last few days.&lt;/p&gt;
&lt;h2 id=&#34;source-open-vs-open-source-and-identityserver-with-dominick-baier-and-brock-allen&#34;&gt;Source Open vs Open Source and IdentityServer with Dominick Baier and Brock Allen&lt;a class=&#34;anchor ms-1&#34; href=&#34;#source-open-vs-open-source-and-identityserver-with-dominick-baier-and-brock-allen&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://www.dotnetrocks.com/details/1824&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;.Net Rocks episode 1824&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;The creators of the open source project Identity Server which went commercial discuss the reasons for doing so. This was a very interesting discussion on the challenges of running open source projects and ways that they can be more maintainable. I have seen Twitter arguments on both sides about various products that have done this. It is a very nuanced problem, which I don’t know much about so interesting hearing what was involved.&lt;/p&gt;
&lt;h2 id=&#34;growing-as-an-engineering-manager-with-taylor-poindexter&#34;&gt;Growing as an Engineering Manager with Taylor Poindexter&lt;a class=&#34;anchor ms-1&#34; href=&#34;#growing-as-an-engineering-manager-with-taylor-poindexter&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://hanselminutes.com/871/growing-as-an-enginering-manager-with-taylor-poindexter&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Hanselminutes episode 871&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;A discussion about being an engineering manager, mentoring and growing and learning. I am not a manager and I don’t have people that report to me, however, I am a senior developer so anything that can help me improve on the leadership side of things is great. On a side note, I love how diverse the guests are on Hanselminutes, I often listen to people on this show I would never have heard of or known about if I just stuck to topics I know about.&lt;/p&gt;
&lt;h2 id=&#34;top-5-scenes-at-a-table&#34;&gt;Top 5 Scenes at a Table&lt;a class=&#34;anchor ms-1&#34; href=&#34;#top-5-scenes-at-a-table&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://www.trekranks.com/trekranks-podcast&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;TrekRanks episode 149&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Star Trek for me has always been about positivity and Trek Ranks delivers this in spades. The concept, in case you don’t know, is to choose 5 episodes about the chosen topic, but it is really an excuse to talk about them! So what 5 scenes at a table would I choose?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Undiscovered Country - Dinner with the Klingons. Klingons, Shakespeare, terrible table manners what is not to love about this scene&lt;/li&gt;
&lt;li&gt;Q Who - Scene in the observation lounge with Q and Guinan as they discuss how to respond to the newly discovered Borg&lt;/li&gt;
&lt;li&gt;Civil Defence - Scene in Ops between Garak and Dukat while the crew hide from an automated phaser firing at them, the best bit is when Duakt tried to leave and ends up trapped with the rest of the crew&lt;/li&gt;
&lt;li&gt;Mirror, Mirror - Scene where Bones realises that some things are the same in the mirror universe, the spot where he spilt acid&lt;/li&gt;
&lt;li&gt;Unification Part 2 - Spock, Picard and Data have been captured by Sela, and Sela comments that she doesn’t get to write many speeches, and then Data comments that maybe she would be happy doing another job&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>2022 What Happened?</title>
      <link>https://www.funkysi1701.com/posts/2022/2022-what-happened/</link>
      <pubDate>Sat, 31 Dec 2022 22:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2022/2022-what-happened/</guid>
      <description>&lt;p&gt;As 2022 draws to a close its time to do my annual look back at what happened.&lt;/p&gt;
&lt;p&gt;I am going to talk a bit about my personal life as well as tech things, so if that is not your bag feel free to skip this post and read my more technical articles.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;January - I started the year &lt;a href=&#34;https://www.funkysi1701.com/posts/2021/back-to-basic/&#34;&gt;teaching my son to code&lt;/a&gt;
.&lt;/li&gt;
&lt;li&gt;February - I did some work on my website this year, and it is now using Hugo instead of wordpress.&lt;/li&gt;
&lt;li&gt;March - I was guest on a Star Trek &lt;a href=&#34;https://www.funkysi1701.com/posts/2022/temporal-trek-podcast/&#34;&gt;podcast&lt;/a&gt;
, hopefully a repeat appearance in the works very soon. I also passed an &lt;a href=&#34;https://www.funkysi1701.com/posts/2022/aws-cloud-practitioner/&#34;&gt;AWS exam&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;April - Lots of work with &lt;a href=&#34;https://www.funkysi1701.com/posts/2022/scratch/&#34;&gt;Scratch&lt;/a&gt;
 with my boy&lt;/li&gt;
&lt;li&gt;June - &lt;a href=&#34;https://www.funkysi1701.com/posts/2022/scottishsummit/&#34;&gt;Scottish Summit&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;August - My boys birthday so some coding activities with his &lt;a href=&#34;https://www.funkysi1701.com/posts/2022/microbit/&#34;&gt;Microbit&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;October - I bought a second hand car and less than a week later it burst into flames, a scary event but no one hurt and everything has since been replaced/repaired.&lt;/li&gt;
&lt;li&gt;November - I lost my job&lt;/li&gt;
&lt;li&gt;December - Extended time with family for Christmas with a new job starting in January. I sat and narrowly missed passing AZ-204 (Developing Solutions for Azure). I attended &lt;a href=&#34;https://www.funkysi1701.com/posts/2022/ddd-north/&#34;&gt;DDD North&lt;/a&gt;
, I attended LeedsSharp and went on a virtual tour of a Microsoft Datacenter.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I don&amp;rsquo;t know what is in store for 2023 but I am sure it will be equally interesting. The first thing to get my head around is my new job.&lt;/p&gt;
&lt;p&gt;So onto my goals for 2023&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;New job and get my head around all the new stuff I need to learn&lt;/li&gt;
&lt;li&gt;Celebrate 10 years of marriage and concentrate on family things&lt;/li&gt;
&lt;li&gt;Pass AZ-204 - It was such a close miss that I need to retry this&lt;/li&gt;
&lt;li&gt;More coding with my son, he got a laptop for Christmas and would be great to build on what he has learnt so far.&lt;/li&gt;
&lt;li&gt;Blog regularly - I doubled the number of blog posts from 2021, but it would be great to keep up the momentum with regular posts of what I am up to.&lt;/li&gt;
&lt;li&gt;I recently added an events page, so I need to go to some events. Events like DDD North and Scottish Summit are great, but so are local user groups so a mix of these would be great.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Last year I had the following &lt;a href=&#34;https://www.funkysi1701.com/posts/2022/2022-goals/&#34;&gt;goals&lt;/a&gt;
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Video - Not used my green screen yet, would be good to make some time to use this in 2023&lt;/li&gt;
&lt;li&gt;Conference - I attended Scottish Summit and DDD North, would be great to go to more like these this year as well&lt;/li&gt;
&lt;li&gt;Blog More - Yeah I achieved this, but lets keep doing this.&lt;/li&gt;
&lt;li&gt;Metrics - I have done little bits with this over the last year, but not a huge amount.&lt;/li&gt;
&lt;li&gt;My personal brand has improved this year as my blog relaunched on the Hugo platform, and I am very happy with its look, probably more I can do.&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>DDD North</title>
      <link>https://www.funkysi1701.com/posts/2022/ddd-north/</link>
      <pubDate>Mon, 05 Dec 2022 18:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2022/ddd-north/</guid>
      <description>&lt;p&gt;On Saturday 3rd December I attended &lt;a href=&#34;https://www.dddnorth.co.uk/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;DDD North&lt;/a&gt;
. It is a community run conference for Developers (the D&amp;rsquo;s stand for Developer) and I had a fab time there. Many conferences are going online which is great, however there is nothing quite like chatting over coffee or lunch with fellow Developers about the tech you are learning about, this was probably my favourite thing about the conference.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://www.funkysi1701.com/images/dddnorth-hull-developers-conference-2022.jpg&#34; loading=&#34;lazy&#34;
   width=&#34;800&#34; height=&#34;600&#34;
   /&gt;

&lt;/p&gt;
&lt;p&gt;The first talk I attended was &amp;lsquo;.Net Minimal APIs&amp;rsquo; by &lt;a href=&#34;https://twitter.com/kev_bite&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Kevin Smith&lt;/a&gt;
. Kevin runs .Net user groups in York and Sheffield so I have heard him speak before. He went through some of the features of minimal APIs. I have briefly experimented with them in .Net 6, however from the sound of things the tech is much improved in .Net 7, with lots of improvements, so this is something I want to give another try.&lt;/p&gt;
&lt;p&gt;During the coffee break I managed to have a quick conversation with &lt;a href=&#34;https://www.youtube.com/c/Elfocrash&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Nick Chapsas&lt;/a&gt;
. Nick has a YouTube channel that my colleagues at work have been sharing during our weekly knowledge share sessions. It was great to chat with someone that I have been watching on YouTube.&lt;/p&gt;
&lt;p&gt;The second talk was &amp;lsquo;When microservices go bad&amp;rsquo; by &lt;a href=&#34;https://twitter.com/TechyChap&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Andy Clark&lt;/a&gt;
. This talk was a discussion of the different ways you can use &lt;a href=&#34;https://github.com/App-vNext/Polly&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Polly&lt;/a&gt;
, Carl Franklin of .NetRocks fame has mentioned Polly a few times on the show, so this was a good talk to explain the different ways it can be used.&lt;/p&gt;
&lt;p&gt;The third talk was &amp;lsquo;Don&amp;rsquo;t put your messages in a bottle; Implement messaging patterns&amp;rsquo; by &lt;a href=&#34;https://twitter.com/egrootenboer&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Eldert Grootenboer&lt;/a&gt;
, he should have been joined by &lt;a href=&#34;https://twitter.com/borzenko_lena&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Olena Borzenko&lt;/a&gt;
 however she was unable to travel (didn&amp;rsquo;t catch exactly why, I think she was from Ukraine or working in Ukraine and Visa&amp;rsquo;s from that part of the world are a problem at the moment). This was a talk all about message queues and the patterns and practises you should implement. I don&amp;rsquo;t know much about queues, having only recently started using AWS SQS messages recently so this was useful to put that work into context. The slides from this talk are available &lt;a href=&#34;https://eldertnet-my.sharepoint.com/:p:/g/personal/eldert_eldert_net/EXbVxQpSzzNJmtvKNPjzSvYBSGfnLI7qC5U5Ia-PYCqioA?rtime=fIdK6wHX2kg&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;here&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Lunch was next and the food was excellent. I found myself sitting with Jamie Taylor (from the Tabs and Spaces podcast), &lt;a href=&#34;https://twitter.com/YorkshireTechy&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Craig Pickles&lt;/a&gt;
, &lt;a href=&#34;https://twitter.com/chris_sainty&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Chris Sainty&lt;/a&gt;
 and a few others. There was a fascinating discussion on Blazor, .Net and how Microsoft introduces new stuff. Really appreciate being able to listen in on such an interesting discussion.&lt;/p&gt;
&lt;p&gt;The fourth talk was &amp;lsquo;Why don&amp;rsquo;t people seem to be able to diagnose problems these days?&amp;rsquo; by &lt;a href=&#34;https://twitter.com/richardfennell&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Richard Fennell&lt;/a&gt;
. This was a fascinating walk through computer history and the challenges of finding where the problem is. The slides from this talk are available &lt;a href=&#34;https://github.com/rfennell/Presentations/blob/main/Why%20don%27t%20people%20seem%20to%20be%20able%20to%20diagnose%20problems%20these%20days.pptx&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;here&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;The last talk was &amp;lsquo;Empathy, Sympathy, and Compassion&amp;rsquo; by &lt;a href=&#34;https://twitter.com/podcasterJay&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Jamie Taylor&lt;/a&gt;
 who I had met at lunch. This was a fascinating look at how we place barriers between ourselves as Developers and the users of the software. It expanded into ethics, code of conduct and doing good. The slides from this talk are available &lt;a href=&#34;https://shorturl.at/mAMUZ&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;here&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;It was a great event so thank you &lt;a href=&#34;https://twitter.com/dddnorth&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;DDD North&lt;/a&gt;
 for all your hard work, I look forward to the next one. I have lots to go away and think about.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Expiring Azure AD Client Secrets</title>
      <link>https://www.funkysi1701.com/posts/2022/expiring-azuread-client-secrets/</link>
      <pubDate>Tue, 18 Oct 2022 18:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2022/expiring-azuread-client-secrets/</guid>
      <description>&lt;p&gt;This morning the client complains that the website is not working. I do some checking and I confirm that there is indeed an error.&lt;/p&gt;
&lt;p&gt;The error they are seeing is:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;An unhandled exception occurred while processing the request.
MsalServiceException: A configuration issue is preventing authentication 
- check the error message from the server for details. 
You can modify the configuration in the application registration portal. 
See https://aka.ms/msal-net-invalid-client for details. 
Original exception: AADSTS7000222: The provided client secret keys for 
app &amp;#39;00000000-0000-0000-0000-000000000000&amp;#39; are expired. 
Visit the Azure portal to create new keys for your app: https://aka.ms/NewClientSecret, 
or consider using certificate credentials for added security: https://aka.ms/certCreds.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The fix for this is relatively simple, generate a new client secret in Azure AD and update the website config to make use of it.&lt;/p&gt;
&lt;p&gt;The problem is that this problem will reoccur in 3, 6, 12, 18 or 24 months, depending on what expiry date you set on the secret.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://www.funkysi1701.com/images/AzureADSecret.png&#34; loading=&#34;lazy&#34;
   width=&#34;572&#34; height=&#34;350&#34;
   /&gt;

&lt;/p&gt;
&lt;p&gt;A suggestion from twitter is that Logic Apps and Event Grid might help solve this problem. Lets see how this might work.&lt;/p&gt;
&lt;p&gt;Logic Apps have a consumption plan, so this kind of solution shouldn&amp;rsquo;t break the bank as will only cost per run eg daily/weekly etc&lt;/p&gt;
&lt;p&gt;But first here is a powershell script that lists all the secrets that are due to expire in the next 30 days.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#secret expiration date filter (for example 30 days)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$LimitExpirationDays = &lt;span style=&#34;color:#ae81ff&#34;&gt;30&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#Retrieving the list of secrets that expires in the above range of days&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$SecretsToExpire = Get-AzureADApplication -All:$true | ForEach-Object {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    $app = $_
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    @(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Get-AzureADApplicationPasswordCredential -ObjectId $_.ObjectId
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Get-AzureADApplicationKeyCredential -ObjectId $_.ObjectId
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ) | Where-Object {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $_.EndDate &lt;span style=&#34;color:#f92672&#34;&gt;-lt&lt;/span&gt; (Get-Date).AddDays($LimitExpirationDays)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } | ForEach-Object {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $id = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Not set&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;($_.CustomKeyIdentifier) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            $id = [&lt;span style=&#34;color:#66d9ef&#34;&gt;System.Text.Encoding&lt;/span&gt;]::UTF8.GetString($_.CustomKeyIdentifier)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        [&lt;span style=&#34;color:#66d9ef&#34;&gt;PSCustomObject&lt;/span&gt;] @{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            App = $app.DisplayName
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            ObjectID = $app.ObjectId
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            AppId = $app.AppId
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Type = $_.GetType().name
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            KeyIdentifier = $id
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            EndDate = $_.EndDate
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#Printing the list of secrets that are near to expire&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;($SecretsToExpire.Count &lt;span style=&#34;color:#f92672&#34;&gt;-EQ&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Write-Output &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;No secrets found that will expire in this range&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Write-Output &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Secrets that will expire in this range:&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Write-Output $SecretsToExpire.Count
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Write-Output $SecretsToExpire
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This works quite well, but I have to manually run it every so often. I have not found a way to automate this as I don&amp;rsquo;t know how to get past the MFA that is configured on my Azure AD tenant.&lt;/p&gt;
&lt;p&gt;Now lets look at how a Logic App might help us. First of all we need somewhere to query the expiry dates, and Azure Key Vault is the ideal place to store them.&lt;/p&gt;
&lt;p&gt;Create a Key Vault if you don&amp;rsquo;t already have one and add a new Secret. Manually add the Client Secret from Azure AD and give it a name you can identify it with. Tick the Set expiration date and save the expiry date of your secret.&lt;/p&gt;
&lt;p&gt;Now Create a Logic App, I am going to use Consumption, so it only costs you when it runs.&lt;/p&gt;
&lt;p&gt;Using the Logic Apps Designer, start with a Recurrence trigger. This lets you queue up your logic app on a schedule, I&amp;rsquo;ve set mine to run every 30 days.&lt;/p&gt;
&lt;p&gt;Next run a Get Secret command from your Key Vault. Select the identifying name you saved the secret with earlier. This will retrieve the secret from the Key Vault, if you go into the settings you can hide the output as you are only really interested in the expiry date.&lt;/p&gt;
&lt;p&gt;I am doing a low tech solution for now, and just emailing myself the expiry date. It is easy to add the expiry date of the secret to an email.&lt;/p&gt;
&lt;p&gt;Later on I might add a bit more logic to only email myself when the expiry is less than 30 days, a reminder to create a new secret. When creating a new secret in Azure AD, I also need to add the secret and expiry date into Key Vault.&lt;/p&gt;
&lt;p&gt;At the very least this solution will give me an early warning of when my secrets are about to expire. It is possible to get my website to read information from Key Vault directly which I may well investigate.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Upgrading to .Net 7</title>
      <link>https://www.funkysi1701.com/posts/2022/dotnet7/</link>
      <pubDate>Sat, 01 Oct 2022 18:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2022/dotnet7/</guid>
      <description>&lt;p&gt;I have a Blazor application that was built with .Net Core 3, and I have updated it to .Net 5 and later .Net 6 when those versions of were released. In November .Net 7 is released so I have been testing it with the .Net 7 previews.&lt;/p&gt;
&lt;p&gt;However for this update I encountered a few more issues than I remember from the other updates.&lt;/p&gt;
&lt;h2 id=&#34;automapper&#34;&gt;Automapper&lt;a class=&#34;anchor ms-1&#34; href=&#34;#automapper&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The first issue I encountered was with Automapper. My Unit tests failed with the following error&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Error Message:
   System.ArgumentException : GenericArguments[0], &amp;#39;System.Char&amp;#39;, on &amp;#39;T MaxFloat[T](System.Collections.Generic.IEnumerable`1[T])&amp;#39; violates the constraint of type &amp;#39;T&amp;#39;.
---- System.Security.VerificationException : Method System.Linq.Enumerable.MaxFloat: type argument &amp;#39;System.Char&amp;#39; violates the constraint of type parameter &amp;#39;T&amp;#39;.
  Stack Trace:
     at System.RuntimeType.ValidateGenericArguments(MemberInfo definition, RuntimeType[] genericArguments, Exception e)
   at System.Reflection.RuntimeMethodInfo.MakeGenericMethod(Type[] methodInstantiation)
   at AutoMapper.Internal.TypeDetails.&amp;lt;&amp;gt;c__DisplayClass25_1.&amp;lt;GetPublicNoArgExtensionMethods&amp;gt;b__10(MethodInfo extensionMethod)
   at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
   at System.Linq.Enumerable.ConcatIterator`1.MoveNext()
   at System.Linq.Enumerable.SelectManyIterator[TSource,TCollection,TResult](IEnumerable`1 source, Func`2 collectionSelector, Func`3 resultSelector)+MoveNext()
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Linq.Enumerable.UnionIterator`1.GetNext()
   at System.Linq.Enumerable.UnionIterator`1.MoveNext()
   at System.Linq.Enumerable.ConcatIterator`1.MoveNext()
   at AutoMapper.Internal.TypeDetails.PossibleNames()
   at AutoMapper.Internal.TypeDetails.GetMember(String name)
   at AutoMapper.Configuration.Conventions.DefaultName.GetMatchingMemberInfo(TypeDetails sourceTypeDetails, Type destType, Type destMemberType, String nameToSearch)
   at AutoMapper.Configuration.Conventions.ParentSourceToDestinationNameMapper.GetMatchingMemberInfo(TypeDetails sourceTypeDetails, Type destType, Type destMemberType, String nameToSearch)
   at AutoMapper.Configuration.Conventions.DefaultMember.MapDestinationPropertyToSource(ProfileMap options, TypeDetails sourceTypeDetails, Type destType, Type destMemberType, String nameToSearch, List`1 resolvers, IMemberConfiguration parent, Boolean isReverseMap)
   at AutoMapper.Configuration.Conventions.MemberConfiguration.MapDestinationPropertyToSource(ProfileMap options, TypeDetails sourceType, Type destType, Type destMemberType, String nameToSearch, List`1 resolvers, Boolean isReverseMap)
   at AutoMapper.Configuration.Conventions.NameSplitMember.MapDestinationPropertyToSource(ProfileMap options, TypeDetails sourceType, Type destType, Type destMemberType, String nameToSearch, List`1 resolvers, IMemberConfiguration parent, Boolean isReverseMap)
   at AutoMapper.Configuration.Conventions.MemberConfiguration.MapDestinationPropertyToSource(ProfileMap options, TypeDetails sourceType, Type destType, Type destMemberType, String nameToSearch, List`1 resolvers, Boolean isReverseMap)
   at AutoMapper.ProfileMap.MapDestinationPropertyToSource(TypeDetails sourceTypeDetails, Type destType, Type destMemberType, String destMemberName, List`1 members, Boolean reverseNamingConventions)
   at AutoMapper.TypeMap..ctor(Type sourceType, Type destinationType, ProfileMap profile, Boolean isReverseMap)
   at AutoMapper.ProfileMap.BuildTypeMap(IGlobalConfiguration configurationProvider, ITypeMapConfiguration config)
   at AutoMapper.ProfileMap.Register(IGlobalConfiguration configurationProvider)
   at AutoMapper.MapperConfiguration.Seal()
   at AutoMapper.MapperConfiguration..ctor(MapperConfigurationExpression configurationExpression)
   at AutoMapper.MapperConfiguration..ctor(Action`1 configure)
   at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean wrapExceptions)
----- Inner Stack Trace -----
   at System.RuntimeMethodHandle.GetStubIfNeeded(RuntimeMethodHandleInternal method, RuntimeType declaringType, RuntimeType[] methodInstantiation)
   at System.Reflection.RuntimeMethodInfo.MakeGenericMethod(Type[] methodInstantiation)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;At first I didn&amp;rsquo;t realise it was an issue with Automapper and I started searching for breaking changes in dotnet 7. Eventually this lead to finding that a change to .Net had created an issue with version 11 of Automapper. The following github issues explains more about what was involved in fixing this.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/dotnet/runtime/issues/69119&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://github.com/dotnet/runtime/issues/69119&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/AutoMapper/AutoMapper/pull/3999&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://github.com/AutoMapper/AutoMapper/pull/3999&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;This week &lt;a href=&#34;https://github.com/AutoMapper/AutoMapper/releases/tag/v12.0.0&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;version 12&lt;/a&gt;
 of Automapper was released and it fixed this issue for me.&lt;/p&gt;
&lt;h2 id=&#34;code-coverage&#34;&gt;Code Coverage&lt;a class=&#34;anchor ms-1&#34; href=&#34;#code-coverage&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;My build includes the calculation of code coverage of my unit tests. For some reason this step was failing.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;    - task: DotNetCoreCLI@2
      displayName: &amp;#39;Running API Tests&amp;#39;
      inputs:
        command: &amp;#39;test&amp;#39;
        arguments: &amp;#39;--no-restore --no-build --configuration $(buildConfiguration) --runtime win-x64 /p:CollectCoverage=true /p:CoverletOutputFormat=opencover&amp;#39;
        projects: &amp;#39;Path To csproj file&amp;#39;
        nobuild: true    
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;For .Net 6 this step would run my unit tests and include a section that looked a bit like this.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Calculating coverage result...
  Generating report &amp;#39;D:\a\1\s\WhatEver\coverage.opencover.xml&amp;#39;

+---------------------------+--------+--------+--------+
| Module                    | Line   | Branch | Method |
+---------------------------+--------+--------+--------+
| Something                 | 50.91% | 48.77% | 65.44% |
+---------------------------+--------+--------+--------+
| Something.Core            | 41.79% | 6.92%  | 47.2%  |
+---------------------------+--------+--------+--------+
| Something.Core.Email      | 96.55% | 50%    | 100%   |
+---------------------------+--------+--------+--------+

+---------+--------+--------+--------+
|         | Line   | Branch | Method |
+---------+--------+--------+--------+
| Total   | 49.46% | 44.2%  | 53.55% |
+---------+--------+--------+--------+
| Average | 63.08% | 35.22% | 70.88% |
+---------+--------+--------+--------+
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;However for .Net 7 the unit tests would pass but the coverage bit above would not run, and no visible errors to help me.&lt;/p&gt;
&lt;p&gt;Testing dotnet test locally I discovered that if I included the path and filename to the csproj file the coverage would not run, if I removed this it would work as per .Net 6. No idea why this was happening.&lt;/p&gt;
&lt;p&gt;I did some testing with the DotNetCoreCLI@2 task, but I couldn&amp;rsquo;t get the coverage to work. However I was testing this locally via the command line so it was a simple thing to swap DotNetCoreCLI@2 for a command line step. After I did that the coverage started working again!&lt;/p&gt;
&lt;p&gt;Here is the command line step I added&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;    - task: CmdLine@2
      displayName: &amp;#39;Running API Tests&amp;#39;
      inputs:
        script: |
          &amp;#34;C:\Program Files\dotnet\dotnet.exe&amp;#34; test --logger trx --results-directory D:\a\_temp --no-restore --no-build --configuration Release --runtime win-x64 /p:CollectCoverage=true /p:CoverletOutputFormat=opencover
        workingDirectory: &amp;#39;$(Build.SourcesDirectory)/PathToWhereEver&amp;#39;  
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;sql-server-tables-with-triggers&#34;&gt;SQL Server tables with triggers&lt;a class=&#34;anchor ms-1&#34; href=&#34;#sql-server-tables-with-triggers&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;My build was all working so now time to test the application was working. But an error was being thrown if I tried to save any data to the SQL Server database.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Could not save changes because the target table has database triggers. Please configure your entity type accordingly, see https://aka.ms/efcore-docs-sqlserver-save-changes-and-triggers for more information. The target table &amp;#39;Something&amp;#39; of the DML statement cannot have any enabled triggers if the statement contains an OUTPUT clause without INTO clause. 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A nice error, as it gives me a link to the change and what to do to fix.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;protected&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;override&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    configurationBuilder.Conventions.Add(_ =&amp;gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; BlankTriggerAddingConvention());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;BlankTriggerAddingConvention&lt;/span&gt; : IModelFinalizingConvention
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;virtual&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; ProcessModelFinalizing(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        IConventionModelBuilder modelBuilder,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        IConventionContext&amp;lt;IConventionModelBuilder&amp;gt; context)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;foreach&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; entityType &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; modelBuilder.Metadata.GetEntityTypes())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; table = StoreObjectIdentifier.Create(entityType, StoreObjectType.Table);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (table != &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &amp;amp;&amp;amp; entityType.GetDeclaredTriggers().All(t =&amp;gt; t.GetDatabaseName(table.Value) == &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                entityType.Builder.HasTrigger(table.Value.Name + &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;_Trigger&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;foreach&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; fragment &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; entityType.GetMappingFragments(StoreObjectType.Table))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (entityType.GetDeclaredTriggers().All(t =&amp;gt; t.GetDatabaseName(fragment.StoreObject) == &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    entityType.Builder.HasTrigger(fragment.StoreObject.Name + &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;_Trigger&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Adding the following to my DBContext allowed data to be saved even if triggers existed on my database.&lt;/p&gt;
&lt;p&gt;A longer term fix, should be to investigate if the triggers on the database are still needed and remove if not. From reading the docs, it sounds like a performance gain would be had after doing this!&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;a class=&#34;anchor ms-1&#34; href=&#34;#conclusion&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;These are the issues I have encountered so far updating to .Net 7. A few more than for .Net 5 or 6. However so far I have managed to find a solution for all issues. I expect one more release candidate, with the final version of .Net 7 coming out in November.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>MakeCode and the BBC micro:bit</title>
      <link>https://www.funkysi1701.com/posts/2022/microbit/</link>
      <pubDate>Sun, 21 Aug 2022 18:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2022/microbit/</guid>
      <description>&lt;p&gt;Programming is in my DNA, so when I had children it was obvious that I would attempt to share my passion. It has taken a while, for some reason for loops don&amp;rsquo;t interest toddlers! However my 7 year old son has got a taste for it now.&lt;/p&gt;
&lt;img src=&#34;https://www.funkysi1701.com/images/getcoding.jpg&#34;  style=&#34;float:left; padding-right: 15px; &#34; /&gt;
&lt;p&gt;It was his birthday the other day and he got quite a few tech related things. First off he got some programming books. &lt;a href=&#34;https://www.amazon.co.uk/gp/product/1406366846/ref=ppx_yo_dt_b_asin_title_o02_s01?ie=UTF8&amp;amp;psc=1&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Get Coding!&lt;/a&gt;
, &lt;a href=&#34;https://www.amazon.co.uk/gp/product/1641522453/ref=ppx_yo_dt_b_asin_title_o02_s00?ie=UTF8&amp;amp;psc=1&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Coding for Kids: Scratch:&lt;/a&gt;
 and &lt;a href=&#34;https://www.amazon.co.uk/gp/product/1641521759/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&amp;amp;psc=1&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Coding for Kids: Python:&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;He has been reading an old Javascript book, so I wanted to get him something a bit more up to date, so the Get Coding book should give him the basics of creating webpages and doing things with Javascript. He has been also been playing with &lt;a href=&#34;https://www.funkysi1701.com/posts/scratch&#34;&gt;Scratch&lt;/a&gt;
 for a while so the second book will definitely interest him. He also keeps mentioning Python, which I know nothing about, so even if he never reads it, I have something new to learn!&lt;/p&gt;
&lt;p&gt;As well as the books he got a BBC micro:bit (with some accessories!) from his grandparents. He has been playing with &lt;a href=&#34;https://makecode.microbit.org/#&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;MakeCode&lt;/a&gt;
 which features a simulator of a micro:bit, so I thought he might like having a physical device in his hands.&lt;/p&gt;
&lt;p&gt;He has loved playing with it so far, and I have loved working with him. Already we are at the point where he knows where to find some of the blocks he needs to write the programs, and is telling me I am looking in the wrong place!&lt;/p&gt;
&lt;p&gt;In case you are not familiar with MakeCode it is a block based programming language similar to Scratch. You drag blocks onto the screen which represent if statements or variables or loops etc. The micro:bit section of the site, simulates a &lt;a href=&#34;https://microbit.org/new-microbit/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;BBC micro:bit&lt;/a&gt;
 and allows you to write programs for it. There is a download feature which allows you to download the program you have written and run it on a physical device. The process of downloading and running your code on the micro:bit is really straight forward. The micro:bit can be connected to your pc/laptop with a micro usb cable, which also powers the device. The device then shows up as a drive and the programs can be downloaded directly onto the device.&lt;/p&gt;
&lt;p&gt;The BBC micro:bit is a pocket-sized computer that introduces you to how software and hardware work together. It has an LED light display, buttons, sensors and many input/output features that, when programmed, let it interact with you and your world. There is a huge list of sensors from buttons, to accelerometer, to temperature and light. It really is an amazing device.&lt;/p&gt;
&lt;p&gt;The MakeCode website is full of help pages, tutorials and videos, so whatever level or experience you are, you will be able to get started. Also you can get a lot out of the site without having a physical device as the simulator is rather good. However me and my boy, have really enjoyed having a physical device in our hands, that we can move around the house with. We programmed up a simple light sensor, and we could move around the house finding where was dark and what happened if we moved our hands in front of it. The website allows the same thing, however moving a slider is not the same experience.&lt;/p&gt;
&lt;p&gt;Twenty five years ago (or so) my step father was getting me into electronics, by explaining capacitors, resistors and all the other components. So it is no surprise that he has loved setting things up for my boy. He has spent a great deal of time getting components that would work with the micro:bit and 3D printing boards and connectors (to make it easy to connect things up)&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://www.funkysi1701.com/images/microbit-accessories.jpg&#34; loading=&#34;lazy&#34;
   width=&#34;4000&#34; height=&#34;3000&#34;
   /&gt;

&lt;/p&gt;
&lt;p&gt;Pictured are a selection of the components. We have a selection of breadboards which we haven&amp;rsquo;t tried yet, a selection of cables for connecting things up. Two battery boxes, (3V and 9V). A slider variable resistor, we experimented with using this as a volume control earlier. A board that makes it easy to connect components to the micro:bit. A joystick. A &lt;a href=&#34;https://makecode.microbit.org/pkg/microsoft/pxt-neopixel&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;NeoPixel&lt;/a&gt;
 strip of ten colourful LEDs. A 8x8 LED &lt;a href=&#34;https://makecode.microbit.org/pkg/alankrantas/pxt-max7219_8x8&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Matrix&lt;/a&gt;
 for cool scrolling messages. The last two components, the NeoPixel and the Matrix require an extension to the standard controls but these are easily found on the MakeCode website.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://www.funkysi1701.com/images/blocks.png&#34; loading=&#34;lazy&#34;
   width=&#34;461&#34; height=&#34;384&#34;
   /&gt;

&lt;/p&gt;
&lt;p&gt;I have featured on this page the code I helped write that uses the joystick to move a LED around the 5 x 5 grid that is on the micro:bit. To write this I started off by printing the X Co-ordinates to the screen. With the joystick in the centre position, it was about 500, when moved one way it was low teens, and the other way it was 1000+. Then I needed to figure out how to convert X, Y Co-ordinates for the joystick that could be 0 to 1000, to X, Y co-ordinates of the display that is 5 x 5. The Maths was a bit beyond my boy, but he just about understood what was going on. The clear screen step is needed so the previous position can be removed from the screen.&lt;/p&gt;
&lt;p&gt;I am really enjoying learning about the micro:bit and seeing my boy engage with it and learn programming. I have been very impressed with his ability to retain knowledge of ifs and other programming concepts (however I am a bit biased being his father)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>A brief history of Source Control</title>
      <link>https://www.funkysi1701.com/posts/2022/a-brief-history-of-source-control/</link>
      <pubDate>Mon, 25 Jul 2022 18:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2022/a-brief-history-of-source-control/</guid>
      <description>&lt;p&gt;I have been thinking back to when I started using source control and some of the different tools I have used over the years.&lt;/p&gt;
&lt;p&gt;When I was learning to code it was some time after I had learned the basics that I learnt about source control. Back when I started writing webpages I would have a folder containing all my html, css, images etc and I would FTP these up to my web server. If I made a change to a file I would reupload the file I changed, or reupload all my files to make sure I didn&amp;rsquo;t miss anything.&lt;/p&gt;
&lt;p&gt;It was sometime later that I learnt about source control. I can&amp;rsquo;t remember exactly when, but I suspect it was after I had used it at work. (between 2006 and 2010 as a best guess, my oldest repo says it is 12 years old!)&lt;/p&gt;
&lt;p&gt;Source control (or version control) is the practice of tracking and managing changes to code. These tools provide a running history of code development and help to resolve conflicts when merging.&lt;/p&gt;
&lt;img src=&#34;https://www.funkysi1701.com/images/svn.jpg&#34; width=&#34;400px&#34; align=&#34;left&#34; /&gt;
&lt;p&gt;The first source control tool I remember using was subversion. The windows client for this was called &lt;a href=&#34;https://tortoisesvn.net/downloads.html&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;TortoiseSVN&lt;/a&gt;
 and is still available today. I know this as my current job has some legacy code which still uses it.&lt;/p&gt;
&lt;p&gt;Back then, to use Subversion you needed to set up a linux server with subversion on it, and you would then connect over your LAN to it from your development machine. This was before the days of github, where everything was hosted on a SaaS service somewhere. I do not remember the process of getting everything setup, but with it being linux, there was no doubt a load of config files to edit, and different dependencies to install.&lt;/p&gt;
&lt;p&gt;Over the years I installed various web interfaces to allow &amp;ldquo;&lt;em&gt;browsing&lt;/em&gt;&amp;rdquo; of source code, some even had bug trackers built in. The ones I can remember are &lt;a href=&#34;https://trac.edgewall.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Trac&lt;/a&gt;
 and &lt;a href=&#34;https://www.redmine.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Redmine&lt;/a&gt;
. Both look to still be available and you can probably install them if you want to remember way back when.&lt;/p&gt;
&lt;img src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/03/github-octocat.png?resize=300%2C158&amp;ssl=1&#34; width=&#34;400px&#34; align=&#34;right&#34; /&gt;
&lt;p&gt;The first hosted source control tool I remember using was &lt;a href=&#34;https://bitbucket.org/product/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;bitbucket&lt;/a&gt;
 and this as far as I can tell has only ever supported git. So I am guessing I imported my subversion repos into git ones at this point. The reason for bitbucket was chosen was it allowed private repositories for free, at that point github was probably available but only provided public repositories.&lt;/p&gt;
&lt;p&gt;After bitbucket the git repos where moved to Azure DevOps or Visual Studio Team Services as it was called back then. This move was mainly to take advantage of the builds and releases feature and to decommission some aging build servers.&lt;/p&gt;
&lt;img src=&#34;https://www.funkysi1701.com/images/azuredevops.png&#34; align=&#34;left&#34; width=&#34;400px&#34; /&gt;
&lt;p&gt;This brings me to today where I have a mix of public repos on github and private repos on Azure DevOps. For building my code I use a mix of github actions and Azure Pipelines. As Microsoft own both services now, there is a fair amount of crossover between the two services, however it is far from certain which service is the future.&lt;/p&gt;
&lt;p&gt;Wow, my code has moved around a lot over the years. From no source control, to subversion, to git, to Bitbucket to Azure DevOps!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Visual Studio Keyboard Shortcuts</title>
      <link>https://www.funkysi1701.com/posts/2022/keyboard-shortcuts/</link>
      <pubDate>Tue, 05 Jul 2022 21:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2022/keyboard-shortcuts/</guid>
      <description>&lt;p&gt;I use keyboard shortcuts all the time, mostly without thinking, but they can be quite a time saver especially for frequently used tasks.&lt;/p&gt;
&lt;p&gt;I recently came across this list of Visual Studio ones. &lt;a href=&#34;https://docs.microsoft.com/en-us/visualstudio/ide/default-keyboard-shortcuts-in-visual-studio?view=vs-2022&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://docs.microsoft.com/en-us/visualstudio/ide/default-keyboard-shortcuts-in-visual-studio?view=vs-2022&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;I was going to do a top ten, but not really sure how you rank keyboard shortcuts, so instead I will mention some of my favourites.&lt;/p&gt;
&lt;h2 id=&#34;build-solution&#34;&gt;Build solution&lt;a class=&#34;anchor ms-1&#34; href=&#34;#build-solution&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you are using Visual Studio you need to build your code. If you are anything like me, after even the smallest change I want to see what affect that has had so a rebuild is often needed.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ctrl + Shift + B / Build Solution&lt;/li&gt;
&lt;li&gt;F5 / Run&lt;/li&gt;
&lt;li&gt;Ctrl + F5 / Run with no debugging&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;cut-copy-paste-undo-redo&#34;&gt;Cut, Copy, Paste, Undo, Redo&lt;a class=&#34;anchor ms-1&#34; href=&#34;#cut-copy-paste-undo-redo&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Programming is sometimes refered to as copying and pasting from &lt;a href=&#34;https://stackoverflow.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;StackOverflow&lt;/a&gt;
, but they are always times you want to copy and paste stuff so the standard keyboard shortcuts are all here.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ctrl + C / Copy&lt;/li&gt;
&lt;li&gt;Ctrl + X / Cut&lt;/li&gt;
&lt;li&gt;Ctrl + V / Paste&lt;/li&gt;
&lt;li&gt;Ctrl + Z / Undo&lt;/li&gt;
&lt;li&gt;Ctrl + Y / Redo (or Undo your Undo)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;comments-in-your-code&#34;&gt;Comments in your code&lt;a class=&#34;anchor ms-1&#34; href=&#34;#comments-in-your-code&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Often we like to temporarily comment out a line of code to see what affect it has.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ctrl + K, Ctrl + C / Comment selection&lt;/li&gt;
&lt;li&gt;Ctrl + K, Ctrl + U /Uncomment selection&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;using-statements&#34;&gt;Using statements&lt;a class=&#34;anchor ms-1&#34; href=&#34;#using-statements&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I like to keep my using statements tidy, and not clutered up with ones that aren&amp;rsquo;t used anymore.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ctrl + R, Ctrl + G / Remove and Sort Usings&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;go-to-implementation&#34;&gt;Go to Implementation&lt;a class=&#34;anchor ms-1&#34; href=&#34;#go-to-implementation&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I like to move quickly between methods that a class is calling to find out what is happening so the go to implementation and go to definition shortcuts are very useful. I tend to use the right click option more than the sortcut, but I would save myself a heap of time if I learnt these shortcuts.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;F12 / Go to Definition&lt;/li&gt;
&lt;li&gt;Alt + F12 / Peek Definition&lt;/li&gt;
&lt;li&gt;Ctrl + F12 / Go to Implementation&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;find-file-in-solution-explorer&#34;&gt;Find file in Solution Explorer&lt;a class=&#34;anchor ms-1&#34; href=&#34;#find-file-in-solution-explorer&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You are editing a file and you have no idea what folder it is in the Solution Explorer. There is a shortcut to find out where you are.&lt;/p&gt;
&lt;p&gt;Ctrl + [, S / Select Active File in Solution Explorer&lt;/p&gt;
&lt;h2 id=&#34;search&#34;&gt;Search&lt;a class=&#34;anchor ms-1&#34; href=&#34;#search&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Finding references or a certain string is a common activity&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ctrl + F / Find in current file&lt;/li&gt;
&lt;li&gt;Ctrl + H / Replace&lt;/li&gt;
&lt;li&gt;Ctrl + Shift + F / Find in all files&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;visual-studio-tries-to-be-helpful&#34;&gt;Visual Studio tries to be helpful&lt;a class=&#34;anchor ms-1&#34; href=&#34;#visual-studio-tries-to-be-helpful&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Often Visual Studio will try and be helpful with a lightbulb or similar icon, instead of clicking you can press this shortcut to&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ctrl + . / Show Visual Studio suggestion&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;learn-some-more&#34;&gt;Learn some more&lt;a class=&#34;anchor ms-1&#34; href=&#34;#learn-some-more&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As I said before keyboard shortcuts are great time savers. Go check out the complete list and share with me the ones you found most useful.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Diagrams with Mermaid</title>
      <link>https://www.funkysi1701.com/posts/2022/diagrams-with-mermaid/</link>
      <pubDate>Sun, 19 Jun 2022 18:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2022/diagrams-with-mermaid/</guid>
      <description>&lt;p&gt;I have been wanting to produce a diagram of the architecture of my side project for some time, but I have put it off as never sure what the correct tools is for this job.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://mermaid-js.github.io/mermaid/#/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Mermaid&lt;/a&gt;
 is a tool that lets you create diagrams from code and text. I first came across this tool about a year ago for use in a project. I had forgotten about this tool until the other day, when I was thinking about this problem again.&lt;/p&gt;
&lt;p&gt;Is it possible to embed a mermaid diagram in the markdown used in a github repo? Well the answer is yes, so lets look at how that works.&lt;/p&gt;
&lt;p&gt;A simple mermaid diagram looks like this:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;graph TD;
    A[fff]---&amp;gt;B;
    A---&amp;gt;C;
    B---&amp;gt;D;
    C---&amp;gt;D;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;which renders like this:&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://www.funkysi1701.com/images/mermaid.png&#34; loading=&#34;lazy&#34;
   width=&#34;630&#34; height=&#34;912&#34;
   /&gt;

&lt;/p&gt;
&lt;p&gt;Lets look at what it is doing.&lt;/p&gt;
&lt;p&gt;TD means the chart is top down.&lt;/p&gt;
&lt;p&gt;A is the name of a node in the chart, [fff] is a label being applied to it.&lt;/p&gt;
&lt;p&gt;Then we just define the relationships between the different nodes, you can have &amp;lt;&amp;mdash;, &amp;mdash;&amp;gt; or &amp;mdash;, or even&lt;br/&gt; &amp;lt;&amp;mdash;&amp;gt;&lt;/p&gt;
&lt;p&gt;Lets look at my architecture. I have a database (cosmosDB), I have a website running on Azure Static Web Apps, I have some Azure functions for getting data into and out of my database. I also have Application Insights monitoring the whole thing. I also have a console app for doing some data import stuff. This produces a diagram like this:&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://www.funkysi1701.com/images/mermaid2.png&#34; loading=&#34;lazy&#34;
   width=&#34;409&#34; height=&#34;445&#34;
   /&gt;

&lt;/p&gt;
&lt;p&gt;The code to produce this and display it on my &lt;a href=&#34;https://github.com/funkysi1701/Blogv2/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;github repo&lt;/a&gt;
 is simply&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;```mermaid
graph TD
    A[Azure Static Web App]---B[Http Fn]
    B---D[Database]
    C[Timer Fn]---D
    D---E[Import Console App]
    F[App Insights]---A
    F---B
    F---C
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pretty nice for a few lines of code to show what system talks with what.&lt;/p&gt;
&lt;p&gt;There are improvements that can be made to the diagram, for example changing the shapes of the different services.&lt;/p&gt;
&lt;p&gt;eg &lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://www.funkysi1701.com/images/mermaid3.png&#34; loading=&#34;lazy&#34;
   width=&#34;1034&#34; height=&#34;253&#34;
   /&gt;

&lt;/p&gt;
&lt;p&gt;If you live in the AzureDevOps world you can add a mermaid diagram to your wiki pages (but I don&amp;rsquo;t think to your markdown files). Just use the following syntax&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;::: mermaid
sequenceDiagram
    Alice-&amp;gt;&amp;gt;John: Hello John, how are you?
    John--&amp;gt;&amp;gt;Alice: Great!
    Alice-)John: See you later!
:::
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;For more info see the docs &lt;a href=&#34;https://docs.microsoft.com/en-us/azure/devops/project/wiki/wiki-markdown-guidance?view=azure-devops&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;here&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;What diagrams are you going to build?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Scottish Summit 2022</title>
      <link>https://www.funkysi1701.com/posts/2022/scottishsummit/</link>
      <pubDate>Tue, 14 Jun 2022 18:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2022/scottishsummit/</guid>
      <description>&lt;p&gt;On the 10th and 11th June 2022 &lt;a href=&#34;https://scottishsummit.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Scottish Summit 2022&lt;/a&gt;
 happened and I was there. It was an awesome event and I will attempt to summarise what happened.&lt;/p&gt;
&lt;h2 id=&#34;thursday-9th&#34;&gt;Thursday 9th&lt;a class=&#34;anchor ms-1&#34; href=&#34;#thursday-9th&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;On Thursday 9th I travelled down on the train full of excitement about the event. Once I got to the hotel, I was immediately greeted by &lt;a href=&#34;https://twitter.com/OfficialCookJ&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;James Cook&lt;/a&gt;
, I was obviously in the right place, this weekend is going to be good.&lt;/p&gt;
&lt;h2 id=&#34;friday-10th&#34;&gt;Friday 10th&lt;a class=&#34;anchor ms-1&#34; href=&#34;#friday-10th&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The hotel was less then 5 mins walk to the conference, which was being held at the Technology and Innovation Centre, University of Strathclyde. Registration was simple wave your tickets (which were free, apart from a contribution to charity), and you get your badge and a wrist band. (Pink for people contact, blue for hold back) I then got chatting to &lt;a href=&#34;https://twitter.com/MrKeithAtherton&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Keith Atherton&lt;/a&gt;
, who amazingly lived in part of the world where I grew up. (Amazing what you learn at conferences!)&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.funkysi1701.com/images/scottishsummit.jpg&#34; align=&#34;left&#34; &gt;Time for the Keynote talk. Which of course because we are in scotland was introduced by bagpipes marching through the room! The talk was given by &lt;a href=&#34;https://twitter.com/cmcginley&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Connell McGinley&lt;/a&gt;
 and was titled Disability Awareness &amp;amp; Inclusivity. This talk was amazing. Connell is deaf and gave the entire talk with sign language and this was translated for the rest of us to hear. Connell talked about his career and the barriers he faced. Microsoft Teams was an amazing improvement to his work life, as the captioning allowed him to talk with customers for the first time!&lt;/p&gt;
&lt;p&gt;The purple pound is the amount of spending power people with some kind of disability (15% of the worlds population) have and it is approx $13 trillion. If businesses can open their products up to more people it is a win for everyone. This was a really powerful way to open up the conference.&lt;/p&gt;
&lt;p&gt;Next up was &lt;a href=&#34;https://twitter.com/davesmall28&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;David Small&lt;/a&gt;
 talking about Azure DevOps pipelines and Power Platform. I don&amp;rsquo;t know much about Power Platform however all the DevOps stuff was great, some of it reinforced stuff I already knew, some was new.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/samcogan&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Sam Cogan&lt;/a&gt;
 was next talking about Infrastructure as Code. Resources for this talk are on his &lt;a href=&#34;https://github.com/sam-cogan/events/tree/main/Scottish%20Summit%202022&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;github&lt;/a&gt;
 This was a great comparison of different tools for doing Infrastructure as Code. Terraform, Pulumi, Bicep, ARM templates where all covered. The difference between stateless and stateful tools. If you have a state file you need to look after it, so if you don&amp;rsquo;t need this think about using a stateless tool. If you are only using Azure consider Azure. If you are a C# (other languages are available) think about using Pulumi (which I have used and quite like)&lt;/p&gt;
&lt;p&gt;Getting Started with Static Web Apps was next with &lt;a href=&#34;https://twitter.com/PoornimaNayar&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Poornima Nayar&lt;/a&gt;
 this was a great overview of Static Web Apps but as I already use Static Web Apps this was mainly reinforcing what I already knew. However the Static Web App CLI was mentioned which I didn&amp;rsquo;t know about so I am going to spend some time looking at that! Another thing that was mentioned was GraphQL which is a language agnostic way of building APIs which I also want to learn more about. Resources for this talk can be found &lt;a href=&#34;https://poornimanayar.co.uk/community/resources-for-my-talk-at-azure-thursdays-july-2021/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;here&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Next was Naming stuff in Azure with &lt;a href=&#34;https://twitter.com/Ba4bes&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Barbara Forbes&lt;/a&gt;
, she went through the challenges of getting naming right, especially with all the exceptions Azure throws into the mix. Tagging your resources can really help. Also Azure Policy can help report on what you have (and even enforce it, if you are careful). Lots of interesting stuff, as my naming strategy is non existent at the moment!&lt;/p&gt;
&lt;p&gt;Defender for Cloud Apps with &lt;a href=&#34;https://twitter.com/getofmeland&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Charlie Gough&lt;/a&gt;
. This was his first talk and he did really well despite technical problems. This was a security talk, I thought it was going to be about securing the apps you have built, but it was more about securing the apps that the users in your company are using. Still useful to know about, but not really my thing. Sorry Charlie!&lt;/p&gt;
&lt;p&gt;Last talk of the day was &amp;lsquo;What I didn&amp;rsquo;t know about Office 365&amp;rsquo; with &lt;a href=&#34;https://twitter.com/sharoneweaver&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Sharon Weaver&lt;/a&gt;
 Sharon went through Shifts, Planner and Forms all included in your Office 365 subscription.&lt;/p&gt;
&lt;h2 id=&#34;saturday-11th&#34;&gt;Saturday 11th&lt;a class=&#34;anchor ms-1&#34; href=&#34;#saturday-11th&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To start the second day I had &lt;a href=&#34;https://twitter.com/webmaxru&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Maxim Salnikov&lt;/a&gt;
 talk about Static Web apps, if I had know it was about Static Web Apps again I may have chosen a different talk but this was still a great talk. Again the CLI was mentioned which I really need to investigate further.&lt;/p&gt;
&lt;p&gt;Next up was James Cook&amp;rsquo;s talk Monitor Azure DevOps and GitHub with Sentinel. This was all about securing your code repositories with Sentinel and looking through the logs at what is happening. To use this tech you need either a GitHub Enterprise subscription or Azure DevOps using Azure AD Logins as it is designed more for the Enterprise than a one man band kind like me, however I will see if I can have a play around with it and see what I can learn.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/TechieLass&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Sarah Lean&lt;/a&gt;
 gave a talk about the state of IT Ops tools in the hybrid age. I enjoyed this talk, Sarah added extra fun elements like talking about the Scottish language and the highland cow. The first tool mentioned was Windows Admin Centre. I have heard about this but never used it, must have come out after I switched from Ops to Dev. Looks very Azure like. Azure Update Management was mentioned next, which I have used and works really well. This is the next generation of Update Management, a bit like WSUS from my server days. Azure Policy was mentioned again, a great tool for reporting and/or enforcing things. Azure Arc was mentioned, a way to bring Azure to you. With all these tools consider why you want to use them, what benefits do they bring, not just because it it shiny!&lt;/p&gt;
&lt;p&gt;Mental Health with &lt;a href=&#34;https://twitter.com/AzureRory&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Rory Neary&lt;/a&gt;
. This was one of my favourite talks. Rory talked about his mental health problems, his challenges, some of his coping mechanisms some of which involved the power platform. He encouraged us all to be more open about talking about Mental Health. Lots of talks have a solution to a problem, this one didn&amp;rsquo;t, but that Ok. We are all on a journey complete with its ups and downs.&lt;/p&gt;
&lt;p&gt;Accessibility for Blazor with &lt;a href=&#34;https://twitter.com/DennieDeclercq&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Dennie Declercq&lt;/a&gt;
. I wasn&amp;rsquo;t as keen on this talk as some of the others, while I agree Accessibility is very important the solutions presented felt very generic and not really specific to Blazor. However I do have some ideas to try now and the accessibility browser extension sounds like a great idea.&lt;/p&gt;
&lt;h2 id=&#34;after-hours&#34;&gt;After Hours&lt;a class=&#34;anchor ms-1&#34; href=&#34;#after-hours&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;One of the best things about the conference was talking to people between sessions and afterwards. I am an introvert and tend to keep quiet but even I managed to talk to (for me) loads of people. Some of these I had previously connected to on twitter, and some were brand new on the day. I would encourage anyone reading this to reach out to the community, go to an event like this, you will be surprised how friendly and helpful people can be.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Scratch</title>
      <link>https://www.funkysi1701.com/posts/2022/scratch/</link>
      <pubDate>Tue, 26 Apr 2022 18:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2022/scratch/</guid>
      <description>&lt;p&gt;My 6 year old boy has been playing with Scratch, so here is a quick introduction to what we have learnt about it.&lt;/p&gt;
&lt;p&gt;Scratch is a website that allows you to &amp;ldquo;code&amp;rdquo; by combining blocks together.&lt;/p&gt;
&lt;p&gt;This is how the scratch website describes its self&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Scratch is the world’s largest coding community for children and a coding language with a simple visual interface that allows young people to create digital stories, games, and animations. Scratch is designed, developed, and moderated by the Scratch Foundation, a nonprofit organization.
Scratch promotes computational thinking and problem solving skills; creative teaching and learning; self-expression and collaboration; and equity in computing.
Scratch is always free and is available in more than 70 languages.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Scratch can be found by going to &lt;a href=&#34;https://scratch.mit.edu/projects/editor/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://scratch.mit.edu/projects/editor/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;A lot of the blocks affect your character or &amp;ldquo;sprite&amp;rdquo;, the default is a cute looking cat which may also be the scratch logo.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://www.funkysi1701.com/images/scratch.png&#34; loading=&#34;lazy&#34;
   width=&#34;905&#34; height=&#34;835&#34;
   /&gt;

&lt;/p&gt;
&lt;p&gt;The left hand side of the screen consists of a list of the blocks of code you can use and your coding area where you can arrange them.&lt;/p&gt;
&lt;p&gt;The right hand side shows the results of your code, where you can run and test what your code does.&lt;/p&gt;
&lt;p&gt;It didn&amp;rsquo;t take my boy long to code something like this tonight.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://www.funkysi1701.com/images/scratch2.png&#34; loading=&#34;lazy&#34;
   width=&#34;712&#34; height=&#34;725&#34;
   /&gt;

&lt;/p&gt;
&lt;p&gt;This game moves the &amp;ldquo;sprite&amp;rdquo; towards the mouse pointer and a message &amp;ldquo;got you&amp;rdquo; appears on screen when it reaches your mouse pointer.&lt;/p&gt;
&lt;p&gt;I won&amp;rsquo;t go through all the different blocks you can choose from, but I will highlight some of the programming concepts being learnt here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;inputs&lt;/strong&gt; every computer program needs inputs and there are lots to choose from, things like moving the mouse or pressing a key on the keyboard.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;outputs&lt;/strong&gt; your code needs to do something, this code moves a sprite about the screen&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;variables&lt;/strong&gt; my boy hasn&amp;rsquo;t heard of algebra yet, but he is already grasping concepts like variables, where a value can be assigned and maths can be applied to. In this example the score increases&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;loops&lt;/strong&gt; this program keeps looping until it reaches the mouse pointer&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;logic&lt;/strong&gt; other logic commands are also available, like if / else statements, also &amp;lt;, &amp;gt; and = statements can be used&lt;/p&gt;
&lt;p&gt;There are lots of help and tutorials on the site to help you along, and you can customise the look and even record short sound clips to play in your code.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Temporal Trek Podcast</title>
      <link>https://www.funkysi1701.com/posts/2022/temporal-trek-podcast/</link>
      <pubDate>Fri, 18 Mar 2022 18:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2022/temporal-trek-podcast/</guid>
      <description>&lt;p&gt;Earlier this year I was a guest on the Temporal Trek Podcast.&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;Your Inquiry is recognised.&lt;br&gt;Here is this weeks episode of The Temporal Trek.&lt;br&gt;“Dead Stop” part 2 of the unofficial Battle Damage two parter.&lt;br&gt;&lt;br&gt;Special Guest &lt;a href=&#34;https://twitter.com/funkysi1701?ref_src=twsrc%5Etfw&#34;&gt;@funkysi1701&lt;/a&gt; who was paid with three containers of warp plasma. Bargain!&lt;a href=&#34;https://t.co/up4zAKOpZy&#34;&gt;https://t.co/up4zAKOpZy&lt;/a&gt; &lt;a href=&#34;https://t.co/0EUTAWmqgl&#34;&gt;pic.twitter.com/0EUTAWmqgl&lt;/a&gt;&lt;/p&gt;&amp;mdash; The Temporal Trek Podcast(s) (@rider_coattail) &lt;a href=&#34;https://twitter.com/rider_coattail/status/1504830089002897414?ref_src=twsrc%5Etfw&#34;&gt;March 18, 2022&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;p&gt;Here is the episode I recorded:
&lt;a href=&#34;https://podcasts.apple.com/gb/podcast/the-temporal-trek-podcast-season-3-episode-30-dead/id1499160640?i=1000554428633&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Temporal Trek Podcast Season 3 episode 30 Dead Stop&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;This week &amp;ldquo;Dan Dan&amp;rdquo; are joined by long time friend of the show, formerly from The Ten Forward Podcast, Simon Foster.&lt;/p&gt;
&lt;p&gt;We discuss whether this is&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A part two of a two-parter, last of a four parter or a previosuly unseen part 5 to the Tessek Prime Quintology?&lt;/li&gt;
&lt;li&gt;Rogue full-AI or just a really super advanced computer?&lt;/li&gt;
&lt;li&gt;Station seen again in Voyager?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Oh and by the way has anyone seen the guy who flies the ship, you know the one, tall bloke, loves a good prank, Space Boomer, answers to &amp;lsquo;Travis&amp;rsquo;?&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;Temporal Trek Podcast&#34; src=&#34;https://www.funkysi1701.com/images/podcast.jpg&#34; loading=&#34;lazy&#34;
   width=&#34;268&#34; height=&#34;268&#34;
   /&gt;

&lt;/p&gt;
&lt;p&gt;It was great fun to record and I hope you enjoy giving it a listen.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>AWS Cloud Practitioner</title>
      <link>https://www.funkysi1701.com/posts/2022/aws-cloud-practitioner/</link>
      <pubDate>Thu, 17 Mar 2022 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2022/aws-cloud-practitioner/</guid>
      <description>&lt;p&gt;So today I sat the AWS Cloud Practitioner Certification Exam and passed! This is my second certification exam I have sat after the Azure Fundamentals one I sat last year.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.credly.com/badges/3aab54c8-a109-4018-bcad-dbe0d6a1fc0c/public_url&#34;&gt;&lt;img src=&#34;https://www.funkysi1701.com/images/awscp.png&#34; alt=&#34;AWS Cloud Practitioner&#34; width=&#34;150&#34; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This time was different than the Azure one. Colleagues at work encouraged me to look into doing this particular exam and my employer is going to cover the cost of the exam itself. Last time I did the exam in my own time and didn&amp;rsquo;t really discuss it with anyone from work.&lt;/p&gt;
&lt;p&gt;The other difference was this time I went to a testing centre. The centre was a 5 minute walk from the office. So I decided to work from the office today and 20 minutes before the exam started I walked to the centre. I signed a couple of bits of paper, had my photo taken, had my passport and driving license laughed at, put my belongings in a locker and I was free to start the exam. No worrying about internet connectivity or kids making noise outside my room, or the endless photos at the prep stage of an exam from home. I think I prefer the exam centre experience.&lt;/p&gt;
&lt;p&gt;The other difference was the first exam was Azure, this one was AWS. Both exams cover similar concepts, they are both introductions to Cloud Computing. It&amp;rsquo;s ten months since I did the Azure one, however they both had multiple choice questions and gave you the results at the end. I feel overly familir with Azure, while I don&amp;rsquo;t feel that was with AWS yet. A lot of questions relied on you knowing what AWS services are called. eg AWS Pipeline, AWS CodeStar, AWS CodeBuild, Amazon CodeGuru are all AWS services and are easily mixed up, especially as I have only used a few AWS services, while I have used a lot more of the Azure ones.&lt;/p&gt;
&lt;p&gt;My memory is the Azure gave you a breakdown of your score at the end, while I am still waiting for that from todays exam. This difference may of course be due to it being in a testing centre.&lt;/p&gt;
&lt;p&gt;I still prefer Azure to AWS, however today has proven that I can learn AWS stuff as well. For my next exam I want to get more hands on with my learning, as most of the services I have learnt about so far I haven&amp;rsquo;t seen in action.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Updating SQL Server with Docker</title>
      <link>https://www.funkysi1701.com/posts/2022/updating-sqlserver-with-docker/</link>
      <pubDate>Wed, 23 Feb 2022 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2022/updating-sqlserver-with-docker/</guid>
      <description>&lt;p&gt;This morning I was listening to a podcast where the new features coming out for SQL Server 2022 were being discussed. This starting me thinking about what would be involved in upgrading.&lt;/p&gt;
&lt;p&gt;Upgrading production environments is complex and there are licensing considerations to take into account. However for non production workloads like development this isn&amp;rsquo;t a problem so lets look at that first.&lt;/p&gt;
&lt;p&gt;In the past I have installed SQL Server Devloper Edition onto my laptop, this is fine but I have found that unless you are very careful you may end up with multiple different versions of SQL Server sitting around, and it is difficult to cleanly remove them without a fresh install of the OS.&lt;/p&gt;
&lt;p&gt;However in this day and age, Docker and Containers are king. My current development environment makes use of Docker and has a docker compose file which sets up SQL Server for this particular application, lets take a look.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yml&#34; data-lang=&#34;yml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;sqlserver&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;mcr.microsoft.com/mssql/server:2019-latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;Sql&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;5432:1433&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;networks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;my-network&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;sqlvolume:/var/opt/mssql&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This defines which docker image to use, in this case 2019-latest, sets up ports and the name and saves the data on a docker volume.&lt;/p&gt;
&lt;p&gt;If we then run SELECT @@VERSION on this instance of SQL Server we get told:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Microsoft SQL Server 2019 (RTM-CU13) (KB5005679) - 15.0.4178.1 (X64)   Sep 23 2021 16:47:49   Copyright (C) 2019 Microsoft Corporation  Developer Edition (64-bit) on Linux (Ubuntu 20.04.3 LTS) &amp;lt;X64&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;What if we change the docker-compose file to use 2022-latest?&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;manifest for mcr.microsoft.com/mssql/server:2022-latest not found: manifest unknown: manifest tagged by &amp;#34;2022-latest&amp;#34; is not found
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;SQL Server 2022 hasn&amp;rsquo;t been released yet so there is no docker image for it yet. Try this command again in a few months when it is available.&lt;/p&gt;
&lt;p&gt;OK so what else can we try? What about a downgrade to 2017-latest? Will that work?&lt;/p&gt;
&lt;p&gt;SQL Server 2017 starts but the following error gets logged.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;2022-02-23 21:41:15.30 Server      Software Usage Metrics is disabled.

2022-02-23 21:41:15.30 spid6s      Starting up database &amp;#39;master&amp;#39;.

2022-02-23 21:41:15.34 spid6s      Error: 948, Severity: 20, State: 1.

2022-02-23 21:41:15.34 spid6s      The database &amp;#39;master&amp;#39; cannot be opened because it is version 904. This server supports version 869 and earlier. A downgrade path is not supported.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Doh we can&amp;rsquo;t downgrade the existing database we have. Probably a good thing really.&lt;/p&gt;
&lt;p&gt;Microsoft release regular updates for SQL Server called CU&amp;rsquo;s (Cumulative Updates), you can see above we are on CU13. Is there a CU14 or CU15 we could try?&lt;/p&gt;
&lt;p&gt;Update the docker compose to: mcr.microsoft.com/mssql/server:2019-CU14-ubuntu-20.04&lt;/p&gt;
&lt;p&gt;At this point I actually got an error&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;2022-02-23 21:50:20.71 Server      Error: 17058, Severity: 16, State: 1.

2022-02-23 21:50:20.71 Server      initerrlog: Could not open error log file &amp;#39;/var/opt/mssql/log/errorlog&amp;#39;. Operating system error = 5(Access is denied.).
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This is caused by trying to use SQL Server 2017 but it is easy to fix.&lt;/p&gt;
&lt;p&gt;In docker desktop there is a volumes section, find the volume you are using with SQL Server and delete the errorlog mentioned above.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;Docker Desktop&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2022/docker-desktop1.png&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Now if you retry SQL will start OK.&lt;/p&gt;
&lt;p&gt;Repeating the SELECT @@VERSION gives us a new CU&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Microsoft SQL Server 2019 (RTM-CU14) (KB5007182) - 15.0.4188.2 (X64)   Nov  3 2021 19:19:51   Copyright (C) 2019 Microsoft Corporation  Developer Edition (64-bit) on Linux (Ubuntu 20.04.3 LTS) &amp;lt;X64&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Microsoft SQL Server 2019 (RTM-CU15) (KB5008996) - 15.0.4198.2 (X64)   Jan 12 2022 22:30:08   Copyright (C) 2019 Microsoft Corporation  Developer Edition (64-bit) on Linux (Ubuntu 20.04.3 LTS) &amp;lt;X64&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;How much easier is this than manually installing updates and rebooting or attempting to uninstall and reinstall SQL Server. As SQL Server 2022 isn&amp;rsquo;t out yet I can&amp;rsquo;t say for certain what issues I may encounter but hopefully it will be as easier as this. And I don&amp;rsquo;t need to backup or restore and databases they are all available as before!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>dotnet is 20 years old</title>
      <link>https://www.funkysi1701.com/posts/2022/dotnet-is-20-years-old/</link>
      <pubDate>Mon, 14 Feb 2022 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2022/dotnet-is-20-years-old/</guid>
      <description>&lt;p&gt;Today Microsoft celebrated 20 years since the first version of dotnet was released with a special live stream event.&lt;/p&gt;
&lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/67tCWKnweso&#34; title=&#34;YouTube video player&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;A lot has happened in the 20 years of dotnet (or .Net). It is my understanding that .Net was created to rival Java. When the .Net Framework was first created it was a windows only thing, but today modern .Net is a modern run anywhere platform, with .net applications running everywhere from PCs and Laptops, Raspberry Pi&amp;rsquo;s, Mobile phones and tablets (via Xamarin Forms), to Websites and Microservice APIs running on every Cloud platform out there.&lt;/p&gt;
&lt;p&gt;If you want to celebrate this achievment tweet with the hashtag &lt;a href=&#34;https://twitter.com/search?q=%23dotnetlovesme&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#DotNetLovesMe&lt;/a&gt;
 or download some of the digital swag available from &lt;a href=&#34;https://github.com/dotnet-presentations/dotNET20th/tree/main/Swag&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;github&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;On Thursday the 17th Feb the first preview of dotnet 7.0 is going to be released, with the latest version 6.0 only being released last November.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;History of DotNet&#34; src=&#34;https://pbs.twimg.com/media/FLj8kj7XEAcW3ng?format=jpg&amp;amp;name=4096x4096&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;The above graphic comes from the following tweet.&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;This is 20 years of &lt;a href=&#34;https://twitter.com/hashtag/dotnet?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#dotnet&lt;/a&gt; releases. &lt;a href=&#34;https://twitter.com/hashtag/dotNETLovesMe?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#dotNETLovesMe&lt;/a&gt; &lt;a href=&#34;https://t.co/Zxfe1SdWTq&#34;&gt;pic.twitter.com/Zxfe1SdWTq&lt;/a&gt;&lt;/p&gt;&amp;mdash; Khalid 🎟 (@buhakmeh) &lt;a href=&#34;https://twitter.com/buhakmeh/status/1493220984916258817?ref_src=twsrc%5Etfw&#34;&gt;February 14, 2022&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;p&gt;What do you like about dotnet? When did you first start using it? What are you going to build with it next?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Why do I have a website?</title>
      <link>https://www.funkysi1701.com/posts/2022/why-do-i-have-a-website/</link>
      <pubDate>Tue, 25 Jan 2022 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2022/why-do-i-have-a-website/</guid>
      <description>&lt;p&gt;Is it to share my ideas? Is it to learn new technologies and techniques? Is it to create a following? Is it to educate others? Is it to build some kind of service? Is it some combination of all of these.&lt;/p&gt;
&lt;h2 id=&#34;history&#34;&gt;History&lt;a class=&#34;anchor ms-1&#34; href=&#34;#history&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Back when the web was young and I was first learning HTML.  I hand crafted web pages, adding photos I had taken with captions. If I needed a new page I just added a new html page and linked to it from another page.&lt;/p&gt;
&lt;p&gt;As time went on I started to learn mysql and php and my website became a hand crafted php nightmare. I also applied what I learned to help my father run the website for his camera club.&lt;/p&gt;
&lt;p&gt;At some point I started playing with WordPress. I have had various WordPress websites or blogs over the years. WordPress is very powerful you can do so many things, install so many plugins. WordPress runs on php and mysql and as my career started to centre around the .net space, I started to want something that was similar, so I could apply things I had learnt to my own website.&lt;/p&gt;
&lt;p&gt;This has led me to the current state of my website. I have a WordPress blog, with most of my oldest content, my newer content lives on dev.to and I have a Blazor webassembly site that uses the dev.to api to run my new website.&lt;/p&gt;
&lt;p&gt;Blazor webassembly is great, however it has some limitations which I am starting to push against. To host this as cheaply as possible I am using Azure static web apps, so no .net backend all the website is front end. I have some Azure Functions that does the backend bits that I need.&lt;/p&gt;
&lt;p&gt;Google and other bots are not able to find any of my pages except index, due to the way Blazor works. I have got round this by pre rendering the content using &lt;a href=&#34;https://prerender.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://prerender.io/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;My next difficulty is how to generate a sitemap.xml or a rss feed for my blog. This has started to make me question my architecture decisions.&lt;/p&gt;
&lt;p&gt;I could use a hosted solution like &lt;a href=&#34;https://ghost.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;ghost&lt;/a&gt;
 which is popular with a some of my peers. This would solve many of the problems I am currently facing but I wouldn&amp;rsquo;t be able to play with everything as it is hosted and therefore someone else&amp;rsquo;s problem. How important that is I will look at later.&lt;/p&gt;
&lt;p&gt;Another option would be to use github pages, there are quite a few ways to publish a github page, &lt;a href=&#34;https://jekyllrb.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Jekyll&lt;/a&gt;
 and &lt;a href=&#34;https://gohugo.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Hugo&lt;/a&gt;
 appear to be the most popular. Both produce static content and both are a new for me to learn. Interestingly I could also publish either to Azure Static Web apps if github pages ends up not being suitable.&lt;/p&gt;
&lt;h2 id=&#34;split-in-two&#34;&gt;Split in two&lt;a class=&#34;anchor ms-1&#34; href=&#34;#split-in-two&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I think my website needs to be split in two. I need a stable blog platform probably using Hugo and github pages. This is what I want to get indexed by the search engines and be the primary way people find out about what I am doing.&lt;/p&gt;
&lt;p&gt;I then have additional sites, that I use as my playground for learning new tech. I can easily link between them and I can tweak the style so they &amp;ldquo;fit&amp;rdquo; nicely together.&lt;/p&gt;
&lt;p&gt;I am still considering what to do with dev.to. I like that I am using it as the backend for my blog posts, and its API gives me that flexibility to display that content where I want.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Using GitHub Actions</title>
      <link>https://www.funkysi1701.com/posts/2022/using-github-actions/</link>
      <pubDate>Mon, 10 Jan 2022 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2022/using-github-actions/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been running my website on Azure Static Web Apps for a while and it is pretty cool.&lt;/p&gt;
&lt;p&gt;When you create a Static Web App on Azure you get asked for the github repo of your source code and even the branch to use.
&lt;img class=&#34;img-fluid&#34; alt=&#34;GitHub Repo for my Static Web App&#34; src=&#34;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/off7ur2tgsla4smkrhhi.png&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Once you have selected this, you get asked for the type of code to deploy, mine is Blazor Web Assembly but you can use Angular, React or Vue.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;GitHub Actions workflow creation&#34; src=&#34;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ruhzjeujgl1yjxx5lng8.png&#34; loading=&#34;lazy&#34;
  
   /&gt;


You now have three variables to fill in the location in your code of the Website, the location of your Azure Functions and the output location usually wwwroot. Once you have set these three you can preview the GitHub Actions file that will be created and added to your repository.&lt;/p&gt;
&lt;p&gt;I get something like this&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;name: Azure Static Web Apps CI/CD

on:
  push:
    branches:
      - feature/tempbranch
  pull_request:
    types: [opened, synchronize, reopened, closed]
    branches:
      - feature/tempbranch

jobs:
  build_and_deploy_job:
    if: github.event_name == &amp;#39;push&amp;#39; || (github.event_name == &amp;#39;pull_request&amp;#39; &amp;amp;&amp;amp; github.event.action != &amp;#39;closed&amp;#39;)
    runs-on: ubuntu-latest
    name: Build and Deploy Job
    steps:
      - uses: actions/checkout@v2
        with:
          submodules: true
      - name: Build And Deploy
        id: builddeploy
        uses: Azure/static-web-apps-deploy@v1
        with:
          azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_&amp;lt;GENERATED_HOSTNAME&amp;gt; }}
          repo_token: ${{ secrets.GITHUB_TOKEN }} # Used for Github integrations (i.e. PR comments)
          action: &amp;#34;upload&amp;#34;
          ###### Repository/Build Configurations - These values can be configured to match your app requirements. ######
          # For more information regarding Static Web App workflow configurations, please visit: https://aka.ms/swaworkflowconfig
          app_location: &amp;#34;Client&amp;#34; # App source code path
          api_location: &amp;#34;Api&amp;#34; # Api source code path - optional
          output_location: &amp;#34;wwwroot&amp;#34; # Built app content directory - optional
          ###### End of Repository/Build Configurations ######

  close_pull_request_job:
    if: github.event_name == &amp;#39;pull_request&amp;#39; &amp;amp;&amp;amp; github.event.action == &amp;#39;closed&amp;#39;
    runs-on: ubuntu-latest
    name: Close Pull Request Job
    steps:
      - name: Close Pull Request
        id: closepullrequest
        uses: Azure/static-web-apps-deploy@v1
        with:
          azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_&amp;lt;GENERATED_HOSTNAME&amp;gt; }}
          action: &amp;#34;close&amp;#34;
 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This github action will run when you create a Pull Request to the branch mentioned in the file, or if you push code into the branch. This code get added into the .github/workflows/ folder and is the location that all github action workflows live.&lt;/p&gt;
&lt;p&gt;I haven&amp;rsquo;t done much with github actions, however I have used Azure DevOps quite a bit. Over on the Azure DevOps side I have created a pipeline that deploys to a Dev environment, then a Test environment and finally a production environment.&lt;/p&gt;
&lt;p&gt;Lets have a look at the workflow that I ended up with and with can break down how it all works. Note I am new to Github actions so if there is a better way of doing this do let me know.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;name: Azure Static Web Apps

on:
  push:
    branches:
      - main
      - develop
      - feature/*

jobs:
  dev:
    runs-on: ubuntu-latest
    environment: 
      name: Dev
    name: Dev
    steps:
      - uses: actions/checkout@v2
        with:
          submodules: true
      - name: Build And Deploy
        id: builddeploy
        uses: Azure/static-web-apps-deploy@v1
        with:
          azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_ORANGE_POND_09B18B903  }}
          repo_token: ${{ secrets.GITHUB_TOKEN }} # Used for Github integrations (i.e. PR comments)
          action: &amp;#34;upload&amp;#34;
          ###### Repository/Build Configurations - These values can be configured to match your app requirements. ######
          # For more information regarding Static Web App workflow configurations, please visit: https://aka.ms/swaworkflowconfig
          app_location: &amp;#34;Blog&amp;#34; # App source code path
          api_location: &amp;#34;Blog.Func&amp;#34; # Api source code path - optional
          output_location: &amp;#34;wwwroot&amp;#34; # Built app content directory - optional
          ###### End of Repository/Build Configurations ######
  test:
    if: github.ref == &amp;#39;refs/heads/develop&amp;#39;
    runs-on: ubuntu-latest
    environment: 
      name: Test
    name: Test
    steps:
      - uses: actions/checkout@v2
        with:
          submodules: true
      - name: Build And Deploy
        id: builddeploy
        uses: Azure/static-web-apps-deploy@v1
        with:
          azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_WITTY_DUNE_0A1A77903  }}
          repo_token: ${{ secrets.GITHUB_TOKEN }} # Used for Github integrations (i.e. PR comments)
          action: &amp;#34;upload&amp;#34;
          ###### Repository/Build Configurations - These values can be configured to match your app requirements. ######
          # For more information regarding Static Web App workflow configurations, please visit: https://aka.ms/swaworkflowconfig
          app_location: &amp;#34;Blog&amp;#34; # App source code path
          api_location: &amp;#34;Blog.Func&amp;#34; # Api source code path - optional
          output_location: &amp;#34;wwwroot&amp;#34; # Built app content directory - optional
          ###### End of Repository/Build Configurations ######
  prod:
    if: github.ref == &amp;#39;refs/heads/main&amp;#39;
    runs-on: ubuntu-latest
    environment: 
      name: Prod
    name: Prod
    steps:
      - uses: actions/checkout@v2
        with:
          submodules: true
      - name: Build And Deploy
        id: builddeploy
        uses: Azure/static-web-apps-deploy@v1
        with:
          azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_BRAVE_ROCK_0AAC63D03 }}
          repo_token: ${{ secrets.GITHUB_TOKEN }} # Used for Github integrations (i.e. PR comments)
          action: &amp;#34;upload&amp;#34;
          ###### Repository/Build Configurations - These values can be configured to match your app requirements. ######
          # For more information regarding Static Web App workflow configurations, please visit: https://aka.ms/swaworkflowconfig
          app_location: &amp;#34;Blog&amp;#34; # App source code path
          api_location: &amp;#34;Blog.Func&amp;#34; # Api source code path - optional
          output_location: &amp;#34;wwwroot&amp;#34; # Built app content directory - optional
          ###### End of Repository/Build Configurations ######     
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The first thing I did was create three Azure Static Web Apps, I am using the free tier so while this is trippling my costs it is all still free! Doing this created three github action workflow files, I deleted two and edited the third, but before I deleted them I made a note of the AZURE_STATIC_WEB_APPS_API_TOKEN. If you look in your settings -&amp;gt; secrets for your repo you will see secrets have been created, this is the secure token that github uses to update your static web app.&lt;/p&gt;
&lt;p&gt;While we are in settings we might as well look at environments. I created a Prod, Test and Dev environment that I was going to use in my github actions.&lt;/p&gt;
&lt;p&gt;Environments can have various rules setup on them.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Required reviewers - this is like an approver, a user specified here must aprove for the workflow to be deployed&lt;/li&gt;
&lt;li&gt;Wait time - I didn&amp;rsquo;t use this, but it looks like a certain amount of time can be set to pause the deployment. (I assume to do some kind of manual check)&lt;/li&gt;
&lt;li&gt;Deployment Branch - specify what branch are allowed to be deployed to what environments. I specified develop, main and feature branches could be deployed to the Dev environment, develop and main could go on Test and main could go on Prod&lt;/li&gt;
&lt;li&gt;Environment secrets - I didn&amp;rsquo;t use this as my secrets were already created, however it looks like your secrets can be associated with a specific environment&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now that we have the static web apps setup and the environments lets look at the github action file.&lt;/p&gt;
&lt;p&gt;First of all I removed the PR stuff and just concentrated on pushes. I wanted my workflow to be.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Push to feature branch&lt;/li&gt;
&lt;li&gt;Deploys to Dev env&lt;/li&gt;
&lt;li&gt;PR feature branch to develop&lt;/li&gt;
&lt;li&gt;Once merged code gets pushed into develop&lt;/li&gt;
&lt;li&gt;Deploys to Test env&lt;/li&gt;
&lt;li&gt;PR develop to main&lt;/li&gt;
&lt;li&gt;Once merged code gets pushed into main&lt;/li&gt;
&lt;li&gt;Deploys to Prod env (after approval)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The approval on deploying to production I think is probably overkill, but I still have it setup like that for now.&lt;/p&gt;
&lt;p&gt;My gh action has three jobs defined as dev: test: and prod: they are all the same except they have the azure_static_web_apps_api_token that is correct for their environment.&lt;/p&gt;
&lt;p&gt;They also each have a environment defined eg&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;environment:
  name: Prod
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Lastly Test and Prod have an if test setup, if the test is false the job won&amp;rsquo;t run. Importantly it won&amp;rsquo;t fail it just won&amp;rsquo;t run.&lt;/p&gt;
&lt;p&gt;For Prod this needs to only run on main branch so we have&lt;/p&gt;
&lt;p&gt;if: github.ref == &amp;lsquo;refs/heads/main&amp;rsquo;&lt;/p&gt;
&lt;p&gt;For Test this needs to only run on develop so&lt;/p&gt;
&lt;p&gt;if: github.ref == &amp;lsquo;refs/heads/develop&amp;rsquo;&lt;/p&gt;
&lt;p&gt;I could have a test for develop to only run on feature/* but I have allowed it to run everytime.&lt;/p&gt;
&lt;p&gt;There is loads more you can do with github actions, but hopefully this gives you a taste of some of the things you can do. I currently have a mix of Azure DevOps and github actions so I will be working on getting github actions to do more.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>2022 Goals</title>
      <link>https://www.funkysi1701.com/posts/2022/2022-goals/</link>
      <pubDate>Sat, 01 Jan 2022 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2022/2022-goals/</guid>
      <description>&lt;p&gt;Lets have a look at what my goals were for 2021. I had eight of them, lets look at them one by one.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Azure certification&lt;/strong&gt;. In May of this year I sat and passed the Azure Fundamentals exam. I am calling this goal as achieved.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mentoring&lt;/strong&gt;. I didn&amp;rsquo;t do anything about working with others or mentoring, so not sure I achieved this one. However I do now work in a development team and I have been reviewing others code and having my own reviewed. We have a junior developer and I am enjoying the opportunities I have to work with him and share my wisdom.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;F#&lt;/strong&gt;. I have done zero work with F# in 2021, so this one I didn&amp;rsquo;t achieve.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cosmos db/Mongo db&lt;/strong&gt;. I have worked with both of these technologies in 2021. I used Cosmos the most with my website, and storing data for it. I used Mongo/Atlas for auditing for a project I did for my previous job. I wouldn&amp;rsquo;t say I was expert in either of these, but I am starting to get a flavour of non SQL Server databases. I should also note that I am using mysql a lot in my latest job, so another non SQL Server technology that I get to use on a daily basis.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Give a talk&lt;/strong&gt;. I said last year that maybe I would make baby steps towards doing this, and I have. In the interview for my new job I gave a short presentation (I thought it was bad, but others didn&amp;rsquo;t!) I also gave a short introduction to Blazor talk which went down well.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mandlebrot Generator&lt;/strong&gt;. Did nothing on this one as well. I may have googled the code but that is as far as I got.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pwned Pass Mobile App&lt;/strong&gt;. I got an increase in users in 2021 and hence it it still running and I still pay for the API key. I am still considering what to do with it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Time for me&lt;/strong&gt;. Achieved this one, had plenty of time for myself.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;not-a-bad-year-but-what-are-my-goals-for-2022&#34;&gt;Not a bad year but what are my goals for 2022?&lt;a class=&#34;anchor ms-1&#34; href=&#34;#not-a-bad-year-but-what-are-my-goals-for-2022&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Video&lt;/strong&gt;. I have just purchased a green screen, so my first goal is to learn how to use OBS, how to light myself properly without getting horrible reflections. I have the content for my first talk, the talk I gave at work about Blazor.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Conference&lt;/strong&gt;. Attend an in person conference. I am booked to attend Scottish Summit, however it has been postponed due to COVID-19.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Blog More&lt;/strong&gt;. I have been neglecting writing blog posts a bit recently, so I want to do more.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Metrics&lt;/strong&gt;. I have been recording various metrics from twitter, github etc and I would like to expand this and make it a service.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Profile Pic&lt;/strong&gt;. My profile pic is getting a bit old, so it would be nice to update the images I use online and improve my personal brand.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>Back to BASIC</title>
      <link>https://www.funkysi1701.com/posts/2021/back-to-basic/</link>
      <pubDate>Tue, 28 Dec 2021 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2021/back-to-basic/</guid>
      <description>&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;How exciting my Lynx Computer from my childhood has come home, all 96k of it &lt;a href=&#34;https://t.co/aeN38KBiS8&#34;&gt;pic.twitter.com/aeN38KBiS8&lt;/a&gt;&lt;/p&gt;&amp;mdash; Simon Foster (@funkysi1701) &lt;a href=&#34;https://twitter.com/funkysi1701/status/1475139125154037760?ref_src=twsrc%5Etfw&#34;&gt;December 26, 2021&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;p&gt;I can&amp;rsquo;t remember the syntax for BASIC, luckily I have been able to find the &lt;a href=&#34;http://elborg.dk/books.html&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Manual&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;All the commands are listed inside so lets see what we can do.&lt;/p&gt;
&lt;p&gt;The Lynx presents you with a command prompt in which you can type text. Back in the 80s we had a tape player to load programs from tape, however I don&amp;rsquo;t have one today so only programs I write can be run.&lt;/p&gt;
&lt;p&gt;PRINT - To write Hello World, you can just type PRINT &amp;ldquo;Hello World&amp;rdquo; and Hello World appears on the screen. To Write a program that displays Hello World, you just write the line number first.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;10 PRINT &amp;#34;Hello World&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;To run this you type RUN
To view the code you type LIST&lt;/p&gt;
&lt;p&gt;To Edit a specific Line you can use Ctrl+E and type the line number, or you can just write the line out again.&lt;/p&gt;
&lt;p&gt;CLS - This command clears the screen&lt;/p&gt;
&lt;p&gt;INPUT N - stores text typed by the user and stores it in the variable N&lt;/p&gt;
&lt;p&gt;GOTO N - Execution of code continues at Line Number N&lt;/p&gt;
&lt;p&gt;The first Program I wrote with a bit of help from my boys.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;10 CLS
20 PRINT &amp;#34;What is your Age?&amp;#34;
30 INPUT N
40 IF N&amp;gt;5 AND N&amp;lt;41 THEN PRINT &amp;#34;a good age&amp;#34; 
50 ELSE IF N&amp;lt;6 THEN PRINT &amp;#34;a spaceman&amp;#34;
60 ELSE IF N&amp;gt;40 THEN PRINT &amp;#34;too old&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;My 4yo didn&amp;rsquo;t like being &amp;ldquo;too young&amp;rdquo; in the original version, so my 6yo helped me change him to be a &amp;ldquo;spaceman&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Not bad and it was fun pair programming with a 6yo, all my typos were quickly spotted, and he easily understood the logic of IF/ELSE/THEN statements.&lt;/p&gt;
&lt;p&gt;The Lynx comes from 1983 and has just 96k of memory. I am very lucky it actually still works, however I have been able to find an emulator so I can write Lynx BASIC from the comfort of my laptop. &lt;a href=&#34;https://jynxemulator.wordpress.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;jynxemulator&lt;/a&gt;
, it is also on &lt;a href=&#34;https://github.com/jonathan-markland/Jynx&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;github&lt;/a&gt;
 but it doesn&amp;rsquo;t include the ROMs so getting from the website is a better option.&lt;/p&gt;
&lt;p&gt;The developer experience today is so much nicer than it must have been in the 1980s, however back then distractions must have been much reduced.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No internet or google to get answers to your questions&lt;/li&gt;
&lt;li&gt;No Copy/Paste of text&lt;/li&gt;
&lt;li&gt;No Load/Save (unless you have a working disk drive or tape player!)&lt;/li&gt;
&lt;li&gt;No IDE&lt;/li&gt;
&lt;li&gt;No Build or Release process just type RUN&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I then have additional sites, that I use as my playground for learning new tech. I can easily link between them and I can tweak the style so they &amp;ldquo;fit&amp;rdquo; nicely together.&lt;/p&gt;
&lt;p&gt;I am still considering what to do with dev.to. I like that I am using it as the backend for my blog posts, and its API gives me that flexibility to display that content where I want.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>A Comparison of All Good Things... and Star Trek Picard</title>
      <link>https://www.funkysi1701.com/posts/2021/a-comparison-of-all-good-things-and-star-trek-picard/</link>
      <pubDate>Wed, 15 Dec 2021 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2021/a-comparison-of-all-good-things-and-star-trek-picard/</guid>
      <description>&lt;p&gt;The final episode of Star Trek: The Next Generation features a few scenes set 25 years into the future. That episode aired May 1994. The newest Star Trek TV show Star Trek Picard has just aired its first episode and this is 25 years and 8 months after that episode. This article may contain minor spoilers for the first episode of Star Trek Picard, you have been warned.&lt;/p&gt;
&lt;p&gt;I thought it would be interesting to compare the two time periods.&lt;/p&gt;
&lt;h2 id=&#34;fate-of-picards-crew&#34;&gt;Fate of Picards crew&lt;a class=&#34;anchor ms-1&#34; href=&#34;#fate-of-picards-crew&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In All Good Things&amp;hellip; all of Picards crew are still alive except one. Deanna Troi passed away but it is never revealed how.&lt;/p&gt;
&lt;p&gt;In Star Trek Picard, we know Data has died as featured in the feature file Star Trek Nemesis. From the trailers we know Riker and Troi are still alive. We do not know the fate of Crusher, LaForge and Worf yet, but I am going to assume they are still alive somewhere.&lt;/p&gt;
&lt;p&gt;In both timelines we have one dead crew member.&lt;/p&gt;
&lt;h2 id=&#34;living-arrangements&#34;&gt;Living arrangements&lt;a class=&#34;anchor ms-1&#34; href=&#34;#living-arrangements&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In both time lines Picard is living in France at his vineyard.&lt;/p&gt;
&lt;p&gt;In All Good Things&amp;hellip; we do not know who Picard is living with, it is assumed he lives alone, which is why Geordi feels the need to check on him, once he learns about his Irumodic Syndrome.&lt;/p&gt;
&lt;p&gt;In Star Trek Picard we learn that Picard is living with a Romulan couple, due to the involvement Picard made to save the Romulan people when their star went supernova. Picard appears older but for the most part in good health, he can&amp;rsquo;t for example run up a flight of stairs (he is 92 so not surprising really!) and is plagued by dreams from his past.&lt;/p&gt;
&lt;h2 id=&#34;romulan-neutral-zone&#34;&gt;Romulan Neutral Zone&lt;a class=&#34;anchor ms-1&#34; href=&#34;#romulan-neutral-zone&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In All Good Things&amp;hellip; there is no Neutral Zone, the Romulan empire has been taken over by the Klingons.&lt;/p&gt;
&lt;p&gt;In Star Trek Picard one would assume there is no Neutral Zone as well because the Romulan star system was destroyed. A handful of Romulans survived mostly due to the actions of Picard.&lt;/p&gt;
&lt;h2 id=&#34;looks&#34;&gt;Looks&lt;a class=&#34;anchor ms-1&#34; href=&#34;#looks&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As we have seen Patrick Stewart does not appear to be ageing. Below is a comparison of how he looks in the two time frames.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;All Good Things..&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2018/08/all-good-things.jpg?w=584&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;Star Trek Picard&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2022/picard.jpeg&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;I really enjoyed the first episode of Star Trek Picard and it is going to be interesting seeing what other similarities and differences there are between it and All Good Things&amp;hellip;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Lone Developer to Senior Developer, my 2021 story</title>
      <link>https://www.funkysi1701.com/posts/2021/lone-developer-to-senior-developer-my-2021-story/</link>
      <pubDate>Sun, 05 Dec 2021 09:00:05 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2021/lone-developer-to-senior-developer-my-2021-story/</guid>
      <description>&lt;h2 id=&#34;welcome-to-day-5-of-the-festive-tech-calendar&#34;&gt;Welcome to Day 5 of the Festive Tech Calendar!&lt;a class=&#34;anchor ms-1&#34; href=&#34;#welcome-to-day-5-of-the-festive-tech-calendar&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Usually at this time of year I like to take the opportunity to look back on the last 12 months, highlight some of my achievements and make a few goals for the new year.&lt;/p&gt;
&lt;p&gt;Like many of you 2021 has been a difficult year, but it has also been a year of change, and I am in a much better place now than at the start of the year.&lt;/p&gt;
&lt;p&gt;To tell you my 2021 story I first need to give you a bit of a history lesson about my career. So, lets fire up your flux capacitor (or Tardis of similar value) and journey back to 2006.&lt;/p&gt;
&lt;h3 id=&#34;back-to-2006&#34;&gt;Back to 2006&lt;a class=&#34;anchor ms-1&#34; href=&#34;#back-to-2006&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In 2006 I got my first IT job. My housemate, who was working as an IT Manager for a small Health and Safety Company, suggested I come work with him. I was currently working an admin job with no idea what to do with my life, so I said yes.&lt;/p&gt;
&lt;p&gt;So, in October 2006 I joined as a member of the IT Team. I worked mainly on first line support, but as the IT department was small, I learnt about all sorts of IT things, from fixing printers, setting up the CEOs BlackBerry mobile phone with emails, administering active directory, writing SQL queries to swapping tapes for the weekly backups.&lt;/p&gt;
&lt;p&gt;The company had many faults which I won&amp;rsquo;t discuss here, but the work was varied, and I was always learning something new so I stayed with the company.&lt;/p&gt;
&lt;p&gt;At the end of 2010, the IT Manager resigned, shortly followed by the rest of the IT department. In January 2011 I was IT Manager, I had no staff, plenty of IT problems and no clue what I was doing.&lt;/p&gt;
&lt;p&gt;This was an amazing time for me, I learnt how to interview and hire staff, I learnt more about the different systems we used. It was approximately at this point in time that I switched from being exclusively a SysAdmin to starting to learn Development.&lt;/p&gt;
&lt;p&gt;I had been creating simple websites for a while, mainly using PHP and MySQL. But since I started working in IT I learned more and more about databases, SQL Server and writing T-SQL scripts. I was the companies &amp;ldquo;database guy&amp;rdquo;, so the company naturally asked me to do more and more database work. This led to learning other technologies like MS Access and C# so I could do more and solve more of the company&amp;rsquo;s problems.&lt;/p&gt;
&lt;p&gt;However, the company was small, and I would always be dragged in to fix SysAdmin problems so I never managed to spend 100% of my time doing development, so in 2016 I moved on to my first full time development job.&lt;/p&gt;
&lt;p&gt;The new job was great, but I kept in touch with my old CEO, Ally and helped out with bits of work on the side, writing SQL queries, updating the odd bespoke application.&lt;/p&gt;
&lt;h3 id=&#34;back-where-it-all-began&#34;&gt;Back where it all began&lt;a class=&#34;anchor ms-1&#34; href=&#34;#back-where-it-all-began&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In 2019 I started formulating a plan to go back to my old job as a contract developer. To my amazement Ally almost bit my arm off to get me back, agreeing to all my terms. So, in the summer of 2019 I started full time as a contract developer, mostly working from home with the occasionally meeting in the office and supporting the business with IT issues.&lt;/p&gt;
&lt;p&gt;My second stint with the company was different than my first, I was able to concentrate almost exclusively on development work. As the only developer I was in full control of development, I decided to use dotnet and Blazor.&lt;/p&gt;
&lt;p&gt;Late in 2019 I was given advanced warning that the company was being sold. In Feb 2020 the company did get sold, the new owners kept me on to finish the project I was working on but made me a permanent member of staff. In March 2020, the whole company began to work from home due to COVID-19, with parts of the business being furloughed.&lt;/p&gt;
&lt;p&gt;This was a difficult time; on top of the stress the whole world was feeling from the global pandemic I was trying to assist with various IT integrations that you would expect when any company gets sold.&lt;/p&gt;
&lt;h3 id=&#34;january-2021&#34;&gt;January 2021&lt;a class=&#34;anchor ms-1&#34; href=&#34;#january-2021&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This is pretty much where you find me in January 2021. I was working remotely developing internal applications with dotnet/Blazor with the occasional Teams meeting to demonstrate what I had built so far.&lt;/p&gt;
&lt;p&gt;Working on your own as a developer is great! You start work and can write code all day. There is no daily stand up, you don&amp;rsquo;t need to explain what you have been working on, or what challenges you are facing. You don&amp;rsquo;t have any process or formality to follow, only what you impose on yourself.&lt;/p&gt;
&lt;p&gt;I created a build/release pipelines in Azure DevOps, I created pull requests that would kick of a build, run my unit tests, and run some static code analysis. I would glance over my PRs but 99% of the time I would approve them.&lt;/p&gt;
&lt;p&gt;This was the greatest weakness of working on my own, no one to suggest ideas of better ways of writing code, no one to bounce ideas off, no one to encourage or be encouraged when I figured out something clever or offer to help you overcome a problem.&lt;/p&gt;
&lt;h3 id=&#34;redundancy&#34;&gt;Redundancy&lt;a class=&#34;anchor ms-1&#34; href=&#34;#redundancy&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In Mid July I was told that the development function was no longer required, and my job was at risk of redundancy. As I was the only one working in development it sounded very much like a done deal.  I had a couple of redundancy meetings to attend and I would need to talk through how various applications worked as part of a handover.&lt;/p&gt;
&lt;p&gt;To be honest I agreed with the decision to make me redundant. New development work was not coming through, although the users of the applications I had developed loved what I had created, upper management were keen to migrate off these systems and use more centrally managed systems. If I was in charge, I would probably have made a similar difficult decision.&lt;/p&gt;
&lt;p&gt;As soon as I found out I was at risk of redundancy I called up a couple of recruitment agents I had spoken to before. They told me that it was a great time to be looking for a job and immediately arranged some interviews for the next week. I also took advantage of social media and asked on twitter if anyone was looking for developers like me. To my surprise this resulted in at least one interview.&lt;/p&gt;
&lt;p&gt;One thing I stressed in all my conversations with recruiters and companies I spoke with, was that I was looking for a &lt;strong&gt;team&lt;/strong&gt;. I wanted to work in a team, bounce ideas off others, mentor others, learn from others. This was the most important thing I wanted in whatever my next role was going to be.&lt;/p&gt;
&lt;p&gt;Other important things for me was continuing to use Azure or similar cloud technologies. However, I always think that the tech stack and technology can be learnt on the job, tech moves so quickly these days that you have to be constantly learning to stay relevant.&lt;/p&gt;
&lt;p&gt;About two weeks after I first found out about my impending redundancy I contacted (or more likely was contacted by) a third recruitment agency. It was this third one that eventually got me a job, however all three were brilliant, and kept me updated and answered all of my questions.&lt;/p&gt;
&lt;p&gt;The next few days were packed with phone calls, interviews, tech tests. I had a lot of different types of companies that I spoke with, from Software Consultancy companies, FinTech companies, Energy suppliers, Legal companies and many others.&lt;/p&gt;
&lt;p&gt;During this time of interviews, I can think of only two in person interviews. The rest made use of Teams, Zoom, Google Meet and even Skype (yes at least one company still uses it for video chats!)&lt;/p&gt;
&lt;p&gt;The usual way the process went was a conversation with the recruiter about a role after which my details were sent to the company, If the company liked the sound of me an initial informal interview was arranged, after that a second more technical interview was held, sometimes there would be a tech test, sometimes it was more technical questions being asked in the interview. Some companies had more stages that this, but this was what I typically encountered.&lt;/p&gt;
&lt;p&gt;I lost count of the actual number of interviews I had, but I used a spreadsheet to try and keep it all straight in my mind. The last thing I wanted was to ask a question about the wrong company!&lt;/p&gt;
&lt;h3 id=&#34;positive-no&#34;&gt;Positive No&lt;a class=&#34;anchor ms-1&#34; href=&#34;#positive-no&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I got plenty of noes from these interviews, however all were phrased as a positive no. That being they liked me as a person but something about my skill or experience wasn&amp;rsquo;t quite right. A friend once described me as an odd mix of junior and senior developer. I agree with that statement, I have a lot of experience in some areas and a real lacking in others.&lt;/p&gt;
&lt;p&gt;A common one was working in a team. Being a lone developer is not good for gaining experience working in a team. However, each time I spoke with companies I stressed that the &lt;strong&gt;team&lt;/strong&gt; was what I was looking for.&lt;/p&gt;
&lt;p&gt;Another weakness of mine is front end. When I am building something, functionality is more important than getting it looking good. I came from a database and backend start, so it is only natural that I am more at home working on these things. Also, my most recent projects are working with Blazor, which is brand new and few companies are doing much with it yet.&lt;/p&gt;
&lt;p&gt;I tried really hard not to be discouraged by these noes and that the right company was just around the corner. One no hit harder than most. I had an initial chat with the team of a FinTech Company and then there was a second interview with the CTO which I felt had gone OK.&lt;/p&gt;
&lt;p&gt;From what I had heard it ticked a lot of boxes, the team sounded good, with lots of support and development opportunities and they were moving to the Cloud, so my Azure experience sounded ideal. The CTO liked me and thought I would be a good fit, but I was part way between a junior and a senior, so he had gone away to try and make a bespoke role for me, eventually it would be a no.&lt;/p&gt;
&lt;p&gt;Looking back, it is easy to see, that this was really encouraging. They tried to create a bespoke role for me! However, at the time all I could think about was all the noes I was hearing.&lt;/p&gt;
&lt;h3 id=&#34;the-job-for-me&#34;&gt;The job for me&lt;a class=&#34;anchor ms-1&#34; href=&#34;#the-job-for-me&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;About the same time, I had my initial interview with the company I would eventually accept a role with. I kept being told that there was a tech test to do, but for some reason it never got sent to me, so the interview featured a lot of tech questions and they really grilled me. I came away without much of a sense of if it went well or not.&lt;/p&gt;
&lt;p&gt;However, they liked me and wanted me to do a presentation at their office. I am rubbish at public speaking and doing presentations, so I thought I will do this presentation, but it is very unlikely they will like what I do.&lt;/p&gt;
&lt;p&gt;The topic of my presentation was how I upskilled a team on a new project or technology. As a lone developer what an earth could I do for a topic like that? I thought about what I had done to upskill myself on various things, however that doesn&amp;rsquo;t really address the question, as they wanted to know more about what I had done to upskill a team.&lt;/p&gt;
&lt;p&gt;I thought back to a time when I helped get a largely un-version controlled codebase into source control and automated the build and release pipeline using Azure and Azure DevOps. This involved talking to SQL and data developers so could be a better option for a presentation.&lt;/p&gt;
&lt;p&gt;I arrived at the office to do my presentation. First of all, I parked next to the factory where all the forklifts were, I was directed to the correct place to park. Then I tried to go to the wrong building, a very helpful employee helped me go to the correct place. I was introduced to the people who would be interviewing me, one of whom I had worked with in the past, who immediately said you should hire this guy, he is an excellent developer! As introductions go, that&amp;rsquo;s not bad!&lt;/p&gt;
&lt;p&gt;In my opinion the presentation was bad. I didn&amp;rsquo;t have a PowerPoint or similar to go with my talk, so I just waffled on for ten minutes about what I had done a few years back about how I helped get source control being used.&lt;/p&gt;
&lt;h3 id=&#34;the-next-day-i-got-the-job-offer&#34;&gt;The next day I got the job offer.&lt;a class=&#34;anchor ms-1&#34; href=&#34;#the-next-day-i-got-the-job-offer&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I was very surprised to get the offer as I thought I had done so badly the day before they would give me another positive no. I took a few hours to think about it, however all my other applications were either not started or waiting for the next stage, so I was 99% sure I would accept.&lt;/p&gt;
&lt;p&gt;I had no idea what to expect when I started, as I didn&amp;rsquo;t really ask many questions at the last interview as I was convinced, I was going to get a no after my presentation.&lt;/p&gt;
&lt;p&gt;I worked my notice period and at the start of October I started my new job. My contract only arrived the day before I started, so in the days before I started my mind was making up reasons why the job would disappear.&lt;/p&gt;
&lt;p&gt;The job started with a two-day induction. Things that were covered on the induction were, mental health, sleep cycles, company values, health and safety and of course a bit of form filling and photocopying passports that you would expect on a first day.&lt;/p&gt;
&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion&lt;a class=&#34;anchor ms-1&#34; href=&#34;#conclusion&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Back when I had been job hunting, each time I stressed the importance of team. The company I had joined had an amazing focus on supporting its staff and getting the best from each other. I had got the best possible fit for the kind of team I was looking for.&lt;/p&gt;
&lt;p&gt;Usually when I start a new job, I get a large dose of imposter syndrome. Now, two months after I started, I can say, I didn&amp;rsquo;t really get that this time. Maybe it is how the team functions, maybe it is my level of experience, or maybe its just something else.&lt;/p&gt;
&lt;p&gt;I am happy in my new job. There is a lot to learn, both technology and how to work well in this team. But I am supported, there are people to ask question, I am contributing almost from day one. I have already shared a brief talk about my experience with Blazor, which went down better than I expected. I am excited to learn what is next for me.&lt;/p&gt;
&lt;p&gt;If you have read all the way to here, Thank you! This is my story and I hope you have found it interesting. If you are looking for a new role, I would encourage you to focus on the soft skills you are looking for next, if you concentrate on team like I did, there is a good chance you will land in an amazing team.&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t forget to check out some of the other great content that is being created by all the amazing &lt;a href=&#34;https://festivetechcalendar.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Festive Calendar 2021&lt;/a&gt;
 contributors.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>More than halfway through 2021</title>
      <link>https://www.funkysi1701.com/posts/2021/more-than-halfway-through-2021/</link>
      <pubDate>Tue, 31 Aug 2021 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2021/more-than-halfway-through-2021/</guid>
      <description>&lt;p&gt;We are over halfway through 2021, let&amp;rsquo;s have a quick look at some things I have done this year:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Deployed a new version of the Pre Qualification questionnaire website for my employers&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Passed Azure Fundamentals Exam&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mongo DB Atlas - experimented with using it for auditing my application&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SonarCloud - tried to improve the quality of my code&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Azure DevOps API -&amp;gt; built an application to show builds and releases from my Azure DevOps organisation, code is on github&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Experimented with replacing SQL Agent Jobs with Azure Functions, ended up abandoning this project but was a great learning experience&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Played with MS Graph - displaying profile pic from Azure AD but I am the only one in my org with a photo so abandoned this as well&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added a captch to a website to reduce spam&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Charted my Gas and Electricity usage using the Octopus Energy API&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Charted various metrics from services I use, eg twitter followers, github commits, blog posts published&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Started learning react, easily connected it with Azure AD&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Integrated my employers project management system with a postcode API and google maps so can see where in the country different projects are located&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tested dotnet 6 preview and the latest Visual Studio 2022 preview&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I was made redundant and got a new job&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wrote my first piece of dotnet code to run on a Raspberry Pi&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kept cost of Azure down, by removing unused services, refactoring and optimizing existing services.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wow, I have done loads this year, what is next?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>My road to Certification</title>
      <link>https://www.funkysi1701.com/posts/2021/my-road-to-certification/</link>
      <pubDate>Tue, 11 May 2021 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2021/my-road-to-certification/</guid>
      <description>&lt;p&gt;So today I sat the Azure Fundamentals Certification Exam and passed!
&lt;img class=&#34;img-fluid&#34; alt=&#34;Alt Text&#34; src=&#34;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eytphopn3inx2x77m9n5.png&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Really pleased with myself at achieving this. It was one of my goals for 2021 so I can tick that off.&lt;/p&gt;
&lt;p&gt;Back in January I booked my first exam, however due to technical problems I didn&amp;rsquo;t get as far as the Exam. In order to be able to sit an exam like this you need a webcam and microphone so you can be monitored remotely to check that you are not cheating. Something in my network was blocking them from seeing my video so it got cancelled before it started.&lt;/p&gt;
&lt;p&gt;My theory is that either my internet connection was playing up at the time, My Pi Hole was blocking something, or something else on my network was blocking the video feed.&lt;/p&gt;
&lt;p&gt;This cancellation put me off Certifications, as I wasn&amp;rsquo;t sure how to debug the issue and find out exactly what the problem was.&lt;/p&gt;
&lt;p&gt;A few months back I won a free Azure Certification for taking part in a skills challenge run by &lt;a href=&#34;https://twitter.com/gregor_suttie&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Gregor Suttie&lt;/a&gt;
 and &lt;a href=&#34;https://twitter.com/Pixel_Robots&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Richard Hooper&lt;/a&gt;
 and this was due to expire at the end of this month so I thought why not book a second exam and see if I can get past the technical problems. I didn&amp;rsquo;t do any exam prep as I thought, I wouldn&amp;rsquo;t get that far.&lt;/p&gt;
&lt;p&gt;This time I connected directly to my router, bypassing most of the network, firewall and other items on my network that could possibly cause an issue.&lt;/p&gt;
&lt;p&gt;I cleared my desk, took photos of my ID, took pictures of my desk from every orientation, and waited for the technical issues to start.&lt;/p&gt;
&lt;p&gt;I was in a queue waiting for the exam to start.&lt;/p&gt;
&lt;p&gt;A connection issue has occurred you have been sent to the back of the queue. Oh here we go again!&lt;/p&gt;
&lt;p&gt;But no I connected with the invigilator, who asked to confirm my monitors were disconnected and to move my wallet out of reach off my desk.&lt;/p&gt;
&lt;p&gt;And we are off, I am answering questions from the exam.&lt;/p&gt;
&lt;p&gt;I won&amp;rsquo;t go into detail about the questions, but I whizzed through them, most made me think, some I guessed at. I wasn&amp;rsquo;t expecting to pass, I thought maybe half marks or just under due to my familiarity with Azure. (I have been using it for years which must count for something!)&lt;/p&gt;
&lt;p&gt;I was wrong I passed comfortably and now I have my first certification.&lt;/p&gt;
&lt;p&gt;My advice for you if you have been using Azure for a while is to book this exam and see how you do, you may well pass like me. There are plenty of opportunities to get a free exam, attending conferences like Ignite often qualify you for one, look out for challenges and competitions by #AzureFamily people on twitter as they are very encouraging and helpful in your Certification journey.&lt;/p&gt;
&lt;p&gt;And yes I am thinking about what Certificate to do next!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>DotNet on a Raspberry Pi</title>
      <link>https://www.funkysi1701.com/posts/2021/dotnet-on-a-raspberry-pi/</link>
      <pubDate>Mon, 10 May 2021 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2021/dotnet-on-a-raspberry-pi/</guid>
      <description>&lt;p&gt;I have had a Raspberry Pi for a few years and recently I connected it up again, I plugged in the camera and everything worked.&lt;/p&gt;
&lt;p&gt;To start off you can view photos from the camera with the raspistill command. With a bit of clever scripting and the crontab I got the Pi taking pictures every 60 seconds. Even managed to take a nice picture of a robin.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;Alt Text&#34; src=&#34;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e21z7vbamy6w6akhhiwd.jpg&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;However scripting isn&amp;rsquo;t really programming, and I would like to write a bit more code. Dotnet can run everywhere these days and it made sense to see if it would run on a Raspberry Pi.&lt;/p&gt;
&lt;p&gt;@pete_codes has written a nice guide to getting started with dotnet on a Raspberry Pi &lt;a href=&#34;https://www.petecodes.co.uk/install-and-use-microsoft-dot-net-5-with-the-raspberry-pi/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://www.petecodes.co.uk/install-and-use-microsoft-dot-net-5-with-the-raspberry-pi/&lt;/a&gt;
 This guide and the nuget package &lt;a href=&#34;https://www.nuget.org/packages/Unosquare.Raspberry.IO/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://www.nuget.org/packages/Unosquare.Raspberry.IO/&lt;/a&gt;
 was all I needed to get started taking pictures with my Pi.&lt;/p&gt;
&lt;p&gt;My initial goal is to take some wildlife pictures, stick my camera to a window and take pictures of what flies/crawls/jumps past the window.&lt;/p&gt;
&lt;p&gt;The code I have written so far is available on github &lt;a href=&#34;https://github.com/funkysi1701/RaspberryPiDotNet&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://github.com/funkysi1701/RaspberryPiDotNet&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;So far the code takes a picture, uploads this file to Azure Blob Storage (so as not to fill up the Pi with too many image files) and deletes the image locally.&lt;/p&gt;
&lt;p&gt;Run a dotnet publish -c Release and then cron can run dotnet RaspberryPiDotNet.dll (with full paths to the relevant files)&lt;/p&gt;
&lt;p&gt;I then use crontab to execute the code every 60 seconds.&lt;/p&gt;
&lt;p&gt;My code has an appsetting.json file which has a couple of settings that need completing for my code to work.&lt;/p&gt;
&lt;p&gt;Storage: This is the connection string for Azure Blob Storage
LocalPath: This is the path to where the camera will save its photos to, something like /home/pi/ is all you need but feel free to specify what you need.&lt;/p&gt;
&lt;p&gt;Once the photos are in blob storage I plan to display them somewhere, add options to delete what I don&amp;rsquo;t want, maybe do something timelapsey.&lt;/p&gt;
&lt;p&gt;I also don&amp;rsquo;t have a proper release pipeline and this grates on me a bit. I have been doing a mixture of writing code in VS and pushing that to github and then doing git pull on the Pi, and also writing code directly on the Pi. (VS Code can connect via SSH which is pretty cool!)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Charting my Energy usage with the Octopus Energy API</title>
      <link>https://www.funkysi1701.com/posts/2021/charting-my-energy-usage-with-the-octopus-energy-api/</link>
      <pubDate>Sun, 07 Mar 2021 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2021/charting-my-energy-usage-with-the-octopus-energy-api/</guid>
      <description>&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;image&#34; src=&#34;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/63ep8hp6ipyn2l4emiop.png&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Back when I was a kid, I used to record our weekly gas and electricity meter readings in a little notebook. We then typed these reading into a spreadsheet (this was in the pre-Excel days), which allowed plotting as a line graph.&lt;/p&gt;
&lt;h2 id=&#34;how-would-i-go-about-doing-a-similar-thing-today&#34;&gt;How would I go about doing a similar thing today?&lt;a class=&#34;anchor ms-1&#34; href=&#34;#how-would-i-go-about-doing-a-similar-thing-today&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;First off, I have a smart meter that submits meter readings every 30 minutes or so. However, I do not know anyway to get access to these readings directly, short of manually recording them like I did 30 years ago!&lt;/p&gt;
&lt;p&gt;Octopus Energy have a public API which allows you to pull your consumption readings. The smart meter sends your usage to your energy supplier, in my case Octopus, they then process these readings and allow them to be queried with an API they have created. It is not a direct connection to your data, but it is the next best thing.&lt;/p&gt;
&lt;p&gt;Other energy suppliers will hopefully follow this example and allow users access to their consumption data.&lt;/p&gt;
&lt;h2 id=&#34;how-do-i-use-the-api&#34;&gt;How do I use the API?&lt;a class=&#34;anchor ms-1&#34; href=&#34;#how-do-i-use-the-api&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Using the API is straight forward. Octopus supply you with a secret which you use to authenticate against the API with Basic Auth, no password just a username. Then you just need to pass some details of your meters to get an object containing the last few days meter readings.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://developer.octopus.energy/docs/api/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;API Docs&lt;/a&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GET /v1/electricity-meter-points/{mpan}/meters/{serial_number}/consumption/&lt;/li&gt;
&lt;li&gt;GET /v1/gas-meter-points/{mprn}/meters/{serial_number}/consumption/&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;{mpan}/{mprn} of your gas or electricity meter, and {serial_number} is the serial number of the meters.&lt;/p&gt;
&lt;p&gt;Something to be aware of, I initially collected the last days consumption, which worked, however on one day I encountered a gap in the data for electricity. So, I changed to collect and store the last month&amp;rsquo;s data. I can then query this for what I need.&lt;/p&gt;
&lt;p&gt;Usually, the last 24 hours of data is available after midnight of that day. e.g. at midnight 2nd March all the data for 1st March should be available. This is not guaranteed so don&amp;rsquo;t rely on it, however I see no problem with having a few days delay between charting your usage.&lt;/p&gt;
&lt;p&gt;I am still testing this out but so far, I have three charts for gas (and the same for electricity), the first chart covers a 24-hour period, the next covers a day total over 2 weeks, the final chart covers a total for each month (as I write this I have less than a month&amp;rsquo;s worth of data!)&lt;/p&gt;
&lt;p&gt;For the day and 2 weeks charts, I plot a comparison line of the previous period so you can easily compare the current and previous usage. From my limited testing I have already discovered my usage is very similar day to day.&lt;/p&gt;
&lt;p&gt;Another point of interest is that gas consumption is in m^3 and electricity is in kW/h.
&lt;img class=&#34;img-fluid&#34; alt=&#34;image&#34; src=&#34;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r5d35ceh0q5zgc15vos8.png&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;If you are interested in trying the Octopus Energy API, here is a referral &lt;a href=&#34;https://share.octopus.energy/amber-eel-810&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;link&lt;/a&gt;
.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Azure DevOps Release Pipelines Pre and Post Approval</title>
      <link>https://www.funkysi1701.com/posts/2021/azure-devops-release-pipelines-pre-and-post-approval/</link>
      <pubDate>Sun, 14 Feb 2021 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2021/azure-devops-release-pipelines-pre-and-post-approval/</guid>
      <description>&lt;p&gt;Azure DevOps release pipelines have lots of options to do things how you want. One of my favourites is the option for approval.&lt;/p&gt;
&lt;p&gt;There are two ways you can do approvals Pre and Post deployment. Lets look at both.&lt;/p&gt;
&lt;h2 id=&#34;pre-deployment-approval&#34;&gt;Pre Deployment Approval&lt;a class=&#34;anchor ms-1&#34; href=&#34;#pre-deployment-approval&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;image&#34; src=&#34;https://dev-to-uploads.s3.amazonaws.com/i/9k6vo6pfv434u7yq3mt4.png&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Lets imagine you have a simple deployment pipeline that deploys to a test/development environment before deploying to a production environment.&lt;/p&gt;
&lt;p&gt;Pre Deployment Approval happens immediately before the release so in this example, click in the ellipse before the Prod release step.&lt;/p&gt;
&lt;p&gt;You will get a screen like the above, you can select what users need to approve it and how long approval waits before timing out, the default is 30 days, but I tend to use a shorter time out of 3 days.&lt;/p&gt;
&lt;h2 id=&#34;post-deployment-approval&#34;&gt;Post Deployment Approval&lt;a class=&#34;anchor ms-1&#34; href=&#34;#post-deployment-approval&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;image&#34; src=&#34;https://dev-to-uploads.s3.amazonaws.com/i/reiulrhinzqyyon6mrqi.png&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Post Deployment Approval happens immediately after the release so in this example, click in the circle after the Test release step.&lt;/p&gt;
&lt;p&gt;You will get a screen like the above, with the same settings as before.&lt;/p&gt;
&lt;p&gt;That is pretty much all there is to approvals so either option will prompt you to approve before anything gets deployed to your production environment.&lt;/p&gt;
&lt;h2 id=&#34;deployment-hours&#34;&gt;Deployment Hours&lt;a class=&#34;anchor ms-1&#34; href=&#34;#deployment-hours&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To complicate matters I make use of the following setting to define deployment hours.
&lt;img class=&#34;img-fluid&#34; alt=&#34;image&#34; src=&#34;https://dev-to-uploads.s3.amazonaws.com/i/aku2z0dl3m3xkvfvh7wd.png&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;This setting will start the Prod deployment at 3am Mon-Fri.&lt;/p&gt;
&lt;p&gt;If I configure Post Deployment Approval, as soon as my deploy to Test has completed a request for Approval is sent.&lt;/p&gt;
&lt;p&gt;If I configure Pre Deployment Approval, at 3am Mon-Fri a request for Approval is sent (not ideal if you tend to be asleep at 3am)&lt;/p&gt;
&lt;p&gt;So it looks like Post Deployment Approval is more useful for my use case. However if you deny approval either in Pre or Post approval this will mark the deployment as failed and show Red in your list of deployments.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;image&#34; src=&#34;https://dev-to-uploads.s3.amazonaws.com/i/vichyb1srgc1ln85hj0o.png&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;From a casual glance it looks like the deployment to Test is failing, it isn&amp;rsquo;t I am just opting to not continue my deployment to production.&lt;/p&gt;
&lt;h2 id=&#34;my-pipeline&#34;&gt;My Pipeline&lt;a class=&#34;anchor ms-1&#34; href=&#34;#my-pipeline&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;image&#34; src=&#34;https://dev-to-uploads.s3.amazonaws.com/i/9kprp90t59owfmsmqkcp.png&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;This is how I have my pipeline setup. Deployment happens on Test and doesn&amp;rsquo;t have a post approval step.&lt;/p&gt;
&lt;p&gt;After Test an empty stage called Approval runs and that has a post deployment approval, this happens immediately after Test so you get asked straight away for approval.&lt;/p&gt;
&lt;p&gt;Prod does not start as I have my deployment hours configured. Once it is time for deployment to Prod to start it executes.&lt;/p&gt;
&lt;p&gt;Now a casual look at my past releases, you can easily see which have been stopped by approval and which have failed due to whatever issue, and which have run all the way through to Prod.&lt;/p&gt;
&lt;p&gt;And deployments to Prod can only ever run during my defined deployment window.&lt;/p&gt;
&lt;p&gt;I am interested to hear how you have your deployment pipeline setup. Do you make use of Pre or Post Approvals? Do you ensure deployments always happen at specific times?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Goals for 2021</title>
      <link>https://www.funkysi1701.com/posts/2020/goals-for-2021/</link>
      <pubDate>Mon, 28 Dec 2020 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2020/goals-for-2021/</guid>
      <description>&lt;p&gt;I didn&amp;rsquo;t make any goals for 2020, or if I did, I didn&amp;rsquo;t officially announce them. 2020 has been a hard year for all of us, 2021 is going to be better.&lt;/p&gt;
&lt;p&gt;Here are a few ideas for my goals for the year ahead.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Azure certification&lt;/li&gt;
&lt;li&gt;Mentoring&lt;/li&gt;
&lt;li&gt;F#&lt;/li&gt;
&lt;li&gt;Cosmos db/Mongo db&lt;/li&gt;
&lt;li&gt;Give a talk&lt;/li&gt;
&lt;li&gt;Mandlebrot Generator&lt;/li&gt;
&lt;li&gt;Pwned Pass Mobile App&lt;/li&gt;
&lt;li&gt;More time for me&lt;/li&gt;
&lt;/ol&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;I want to get a certificate to show how much I know. The obvious area for this is Azure. I spend a lot of time playing with Azure, building and deploying to the platform I should be able to get certified in this area. I actually had an exam booked in 2020 but it was an in-person exam so was cancelled when Covid hit. I plan to sit the &lt;a href=&#34;https://docs.microsoft.com/en-us/learn/certifications/exams/az-900&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;foundation&lt;/a&gt;
 exam in the first quarter of 2021 and I will take it from there.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I have had a few times recently where I have been reminded that I don&amp;rsquo;t have much experience working with others. Mostly because I work in a one-man development team so there are limited opportunities in the workplace. I have a few ideas to change this, but this is one of my top priorities for 2021.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;amp; 4) My experience is very Microsoft and C# so I want to spend some time exploring and learning tech that is adjacent to this. A functional language like F# sounds like a good compliment to my existing skills and my data skills are also very SQL server so some document database skills would be a good place to spend some time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Doing a talk has been on my list for years. I am terrified of doing one and with everything online now I don&amp;rsquo;t know if that makes things easier or harder. I don&amp;rsquo;t think 2021 is going to be the year for this but maybe I will take baby steps towards this goal.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Twitter recently reminded me about watching a Mandlebrot generate one pixel at a time in the 1980s. I would love to explore the code used to generate them and how fast they currently are to produce.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My Google play store Xamarin forms app that uses the HIBP API has less than 100 users and I am considering closing it down, especially as I pay a monthly fee for API keys. I haven&amp;rsquo;t really decided what to do, maybe I will spend some time improving it, maybe I will close it down, maybe I will build something else.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For many people 2020 has been a hard year, I am one of those&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>Building a Twitter Clone</title>
      <link>https://www.funkysi1701.com/posts/2020/building-a-twitter-clone/</link>
      <pubDate>Tue, 22 Dec 2020 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2020/building-a-twitter-clone/</guid>
      <description>&lt;p&gt;I saw a tweet about building a twitter clone being harder than you would think. So this of course started me thinking how I would go about building something like that.&lt;/p&gt;
&lt;p&gt;Ok so where would I start? First a few assumptions.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Development by a lone developer ie me&lt;/li&gt;
&lt;li&gt;Tech stack will be dotnet and other tech I am familiar with&lt;/li&gt;
&lt;li&gt;Database backend, probably SQL Server but I might use table storage for cost reasons should I try and actually build this. However if I design this well this should be something that could be swapped out as the system grows&lt;/li&gt;
&lt;li&gt;User accounts on the system will be small as I can&amp;rsquo;t imagine anyone ever signing up. Why sign up to a social media platform with no users?&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;i-guess-the-next-question-is-what-is-twitter&#34;&gt;I guess the next question is what is Twitter?&lt;a class=&#34;anchor ms-1&#34; href=&#34;#i-guess-the-next-question-is-what-is-twitter&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A website that allows you to share 280 characters of text with your followers, allows you to follow other users updates and allows other user to follow your updates.&lt;/p&gt;
&lt;p&gt;It also has an API that allow you to do almost everything that you can with the website.&lt;/p&gt;
&lt;p&gt;Then there are of course mobile apps to consider but I am going to assume this is out of scope, however assuming a good enough API then this shouldn&amp;rsquo;t be a problem for future development.&lt;/p&gt;
&lt;h2 id=&#34;first-steps&#34;&gt;First Steps&lt;a class=&#34;anchor ms-1&#34; href=&#34;#first-steps&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To start off with I would concentrate on the API, and then build a web client that makes use of the API.&lt;/p&gt;
&lt;p&gt;So what would my MVP (minimum viable product) be?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;User can authenticate with my API to get a token which allows access to other API endpoints&lt;/li&gt;
&lt;li&gt;User can create a tweet&lt;/li&gt;
&lt;li&gt;User can view own tweets&lt;/li&gt;
&lt;li&gt;User can view tweets of another user&lt;/li&gt;
&lt;li&gt;User can view tweets in their timeline&lt;/li&gt;
&lt;li&gt;User can follow/unfollow other users&lt;/li&gt;
&lt;li&gt;User can search for other users&lt;/li&gt;
&lt;li&gt;User can search for keywords in tweets&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I think that is probably sufficient to build my MVP for the API.&lt;/p&gt;
&lt;p&gt;An interesting side note is that I could use the OAuth Twitter authentication to allow users to login to my twitter clone with the real twitter login details. However this makes no sense to me as we are essentially adding a dependency on the real twitter.&lt;/p&gt;
&lt;p&gt;So what would I use for the frontend? I would start off with a Client Side Blazor frontend. Once I had a proof of concept that worked, I would think about styling and adding the UI elements that are familiar to twitter users.&lt;/p&gt;
&lt;p&gt;The beauty of Client Side Blazor is that I can host cheaply in azure storage and distribute around the world via a CDN.&lt;/p&gt;
&lt;p&gt;Due to the high number of times that follower and following count and other stats are queried I would consider storing these in the database and include a regular job to recalculate them so they don&amp;rsquo;t get out of sync with the data.&lt;/p&gt;
&lt;p&gt;Having said all of this I am very tempted to fire up Visual Studio and see how far I get, and what problems I encounter along the way.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>#005: Twitter Cards</title>
      <link>https://www.funkysi1701.com/posts/2020/005-twitter-cards/</link>
      <pubDate>Sat, 12 Dec 2020 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2020/005-twitter-cards/</guid>
      <description>&lt;p&gt;It has been a bit of a mad week this week. I joined a new team so lots of time learning what&amp;rsquo;s what and also being pulled in two directions as usual demands come through on top of that.&lt;/p&gt;
&lt;p&gt;My blog runs on Blazor and I have been making use of JavaScript interop to update the html headers and update the page title to match the blog post article. This works great, I load the page and check the headers and they were saying what I wanted.&lt;/p&gt;
&lt;p&gt;The problem was I wanted to add tags for &lt;a href=&#34;https://developer.twitter.com/en/docs/twitter-for-websites/cards/guides/getting-started&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;twitter cards&lt;/a&gt;
 This means that when I paste a link to my blog on twitter you get a nice preview and pic of me in the tweet. This was not working at all even though I had the correct headers.&lt;/p&gt;
&lt;p&gt;I eventually figured out that the problem was the fact I was using JavaScript to update my headers after the page had been initially loaded. Twitter was fetching my page before these headers got added and therefore couldn&amp;rsquo;t see the twitter card headers.&lt;/p&gt;
&lt;p&gt;My solution was to use invalid html. Not ideal but it works. I added the required html tags in the body of my page using Blazor/C# instead of using JavaScript to add them into the header. Twitter appears to not be fussy in finding them in the wrong place.&lt;/p&gt;
&lt;p&gt;Twitter provides a validator tool at &lt;a href=&#34;https://cards-dev.twitter.com/validator&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Twitter Card Validator&lt;/a&gt;
 which my website now passes.&lt;/p&gt;
&lt;p&gt;Not much else to say this week, apart from I am missing Visual Studio and C#, I have been mostly using VS Code on Linux and looking at php which isn&amp;rsquo;t as much fun as my usual day job.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Weekly Update #004</title>
      <link>https://www.funkysi1701.com/posts/2020/weekly-update-004/</link>
      <pubDate>Sun, 06 Dec 2020 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2020/weekly-update-004/</guid>
      <description>&lt;p&gt;I use sp_send_dbmail to send results of sql queries by email to business users. Recently an issue was raised that data was being cut off after 255 characters. To fix this I added @query_no_truncate =  1, however this stopped the column headings from being included. No idea why you can&amp;rsquo;t have all the data and column headings but there you have it.&lt;/p&gt;
&lt;p&gt;What I am doing now is running 2 queries, one to get the headings, and one to get the data. In theory you should be able to combine them with a Union however you then have datatype issues for non text columns so I gave up with that idea.&lt;/p&gt;
&lt;p&gt;My results have 60 something columns (don&amp;rsquo;t ask its for a data import into a third party system!) so I am not typing them all out. I can shove query results into a temporary table and then execute to get a list of columns.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; name 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; tempdb.sys.columns 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;WHERE&lt;/span&gt; object_id &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; object_id(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;tempdb..#TempTable&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;However I need my list to be horizontal so I can use as column headers. I can use dynamic SQL and a pivot to flip them round.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;DECLARE&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;cols &lt;span style=&#34;color:#66d9ef&#34;&gt;AS&lt;/span&gt; NVARCHAR(&lt;span style=&#34;color:#66d9ef&#34;&gt;MAX&lt;/span&gt;), &lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;query  &lt;span style=&#34;color:#66d9ef&#34;&gt;AS&lt;/span&gt; NVARCHAR(&lt;span style=&#34;color:#66d9ef&#34;&gt;MAX&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;cols &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; STUFF((&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;,&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; QUOTENAME(name) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; tempdb.sys.columns 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;WHERE&lt;/span&gt; object_id &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; object_id(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;tempdb..#TempTable&amp;#39;&lt;/span&gt;) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;FOR&lt;/span&gt; XML PATH(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;), &lt;span style=&#34;color:#66d9ef&#34;&gt;TYPE&lt;/span&gt;).value(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;.&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;NVARCHAR(MAX)&amp;#39;&lt;/span&gt;),&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SET&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;query &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; N&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;SELECT &amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;cols &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; N&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39; FROM 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    SELECT name 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    FROM tempdb.sys.columns 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    WHERE object_id = object_id(&amp;#39;&amp;#39;tempdb..#TempTable&amp;#39;&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;) x
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;PIVOT 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    MAX(name)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    FOR name IN (&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;cols &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; N&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;) y&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Weekly Update #003</title>
      <link>https://www.funkysi1701.com/posts/2020/weekly-update-003/</link>
      <pubDate>Sat, 28 Nov 2020 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2020/weekly-update-003/</guid>
      <description>&lt;p&gt;Been a quiet week, so wasn&amp;rsquo;t expecting to have much to write on here, however a few things happened worth talking about.&lt;/p&gt;
&lt;h3 id=&#34;my-first-pr&#34;&gt;My First PR&lt;a class=&#34;anchor ms-1&#34; href=&#34;#my-first-pr&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A comment was made to me to do something with the postcodes that are in the system I am developing. Find out what projects have postcodes near each other, and that way work can be grouped together and reduce potential mileage costs of staff that need to visit these projects.&lt;/p&gt;
&lt;p&gt;A quick google search found &lt;a href=&#34;https://postcodes.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://postcodes.io/&lt;/a&gt;
 which has an API that returns nearby postcodes. It also has a C# wrapper &lt;a href=&#34;https://github.com/markembling/MarkEmbling.PostcodesIO&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://github.com/markembling/MarkEmbling.PostcodesIO&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;A comparison of what was being returned from the wrapper and what the API said should be returned revealed that the distance between postcodes wasn&amp;rsquo;t being returned.&lt;/p&gt;
&lt;p&gt;As the code was on GitHub I could easily see how easy or difficult it might be to add the missing bit of information. It was easy! So, I forked the repo and made the change. I published the change to a private NuGet repo in my Azure Dev Ops account. That way I could try my revised package to check it did what I wanted.&lt;/p&gt;
&lt;p&gt;I left a message on the GitHub project letting the owner know I had a potential fix for an issue. The project hadn&amp;rsquo;t been updated in over a year, so the owner may not be interested, or the project may have been abandoned.&lt;/p&gt;
&lt;p&gt;I was in luck just 17 hours after I left a message the project owner said to create a Pull Request, which I did and shortly afterwards my code had been merged in and an updated version of the package existed in the public NuGet feed.&lt;/p&gt;
&lt;p&gt;I have been thinking about contributing to open source for a while. However, I had not seen a project I wanted to contribute to, or a problem that I knew how to fix until now that is.&lt;/p&gt;
&lt;h3 id=&#34;php&#34;&gt;PHP&lt;a class=&#34;anchor ms-1&#34; href=&#34;#php&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This week I had a call asking me if I knew PHP?&lt;/p&gt;
&lt;p&gt;I did, over ten years ago, before I got my first IT job, I spent time learning PHP and MySQL. I created a blog, and I also created a website for my Dad&amp;rsquo;s camera club. The code I created back then was awful. No shared code, all the code was associated with the page, or sorts of bugs occurred and as time went by it became increasingly hard to update. The site was well liked but I eventually lost interest and moved on to learn other things.&lt;/p&gt;
&lt;p&gt;This call led to me talking with the head of IT, and later a couple of the developers who have since granted me access to the codebase of a project.&lt;/p&gt;
&lt;p&gt;I haven&amp;rsquo;t had time to spend a lot of time looking at the code so far, however this is nothing like the PHP I had built before.&lt;/p&gt;
&lt;p&gt;The project makes use of the &lt;a href=&#34;https://laravel.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;laravel&lt;/a&gt;
 framework and the first file I opened had methods and classes, so apart from the syntax you could think you were looking at C#.&lt;/p&gt;
&lt;p&gt;Another thing that interested me was the project used docker containers, it has automated builds as well. Lots of modern programming ideas that I had some ideas about. I am looking forward to learning more about this project and how I might contribute to it.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Weekly Update #002</title>
      <link>https://www.funkysi1701.com/posts/2020/weekly-update-002/</link>
      <pubDate>Sat, 21 Nov 2020 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2020/weekly-update-002/</guid>
      <description>&lt;p&gt;I know Active Directory is fussy about clocks being in sync however not sure how todays issue happened.&lt;/p&gt;
&lt;p&gt;I run my docker compose file from Visual Studio and I get a weird error.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;SecurityTokenNotYetValidException: IDX10222: Lifetime validation failed. The token is not yet valid. ValidFrom: &amp;#39;System.DateTime&amp;#39;, Current time: &amp;#39;System.DateTime&amp;#39;.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I deleted my containers, open and close Visual Studio a few times, nothing helps. Eventually I think to find out what the time is on my container. It has yesterday&amp;rsquo;s date. What has happened here? Surely recreating containers would have caused them to have todays date? I reboot and everything is fine again.&lt;/p&gt;
&lt;p&gt;Turns out that it is a know issue, see &lt;a href=&#34;https://thorsten-hans.com/docker-on-windows-fix-time-synchronization-issue&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://thorsten-hans.com/docker-on-windows-fix-time-synchronization-issue&lt;/a&gt;
 I am using WSL2 and I have now changed back to using Hyper-V and the issue hasn&amp;rsquo;t come back.&lt;/p&gt;
&lt;p&gt;Earlier in the week I spotted my build step was failing.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#f92672&#34;&gt;task&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;NuGetToolInstaller@0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Swapping to the next version of the step is all I needed to do to fix it.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#f92672&#34;&gt;task&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;NuGetToolInstaller@1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;My guess is that support was dropped for this earlier version or there is some other incompatability with .Net 5.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Weekly Update #001</title>
      <link>https://www.funkysi1701.com/posts/2020/weekly-update-001/</link>
      <pubDate>Sat, 14 Nov 2020 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2020/weekly-update-001/</guid>
      <description>&lt;p&gt;One of my favourite podcasts is Troy Hunts weekly update. In it he discusses stuff that he has been working on, plus some personal stuff. I am going to attempt to do something similar. It will probably take me a few of these before we get a look and feel that works.&lt;/p&gt;
&lt;h4 id=&#34;monday&#34;&gt;Monday&lt;a class=&#34;anchor ms-1&#34; href=&#34;#monday&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;A week off work, mainly to use it up before year end, plus want to get a few jobs around the house done.&lt;/p&gt;
&lt;p&gt;I did ask the following question on Twitter.&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;Hey &lt;a href=&#34;https://twitter.com/hashtag/azurefamily?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#azurefamily&lt;/a&gt; and &lt;a href=&#34;https://twitter.com/hashtag/dotnet?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#dotnet&lt;/a&gt; developers how do I get more involved in mentoring?&lt;/p&gt;&amp;mdash; Simon Foster (@funkysi1701) &lt;a href=&#34;https://twitter.com/funkysi1701/status/1325742644014829568?ref_src=twsrc%5Etfw&#34;&gt;November 9, 2020&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;p&gt;As a one person dev team, my biggest weakness is working with others so any ideas of how to change that are great.&lt;/p&gt;
&lt;h4 id=&#34;tuesday&#34;&gt;Tuesday&lt;a class=&#34;anchor ms-1&#34; href=&#34;#tuesday&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Dotnet 5 is out! The latest version of dotnet is released by Microsoft and to celebrate there is &lt;a href=&#34;https://www.dotnetconf.net/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;dotnetconf&lt;/a&gt;
 to listen to. Due to time zones and family commitments, I haven&amp;rsquo;t listened to an awful lot of it but I did see the keynote and loved the 3 Scott&amp;rsquo;s chat.&lt;/p&gt;
&lt;h4 id=&#34;wednesday&#34;&gt;Wednesday&lt;a class=&#34;anchor ms-1&#34; href=&#34;#wednesday&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;My youngest son was 3 today, due to Coronavirus we didn&amp;rsquo;t do much but we celebrated as a family, and he even had a zoom call.&lt;/p&gt;
&lt;h4 id=&#34;thursday&#34;&gt;Thursday&lt;a class=&#34;anchor ms-1&#34; href=&#34;#thursday&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Blazor has a new feature &lt;a href=&#34;https://docs.microsoft.com/en-us/aspnet/core/blazor/components/virtualization?view=aspnetcore-5.0&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Virtualize&lt;/a&gt;
 where a list of items can only load the ones on screen. I have been trying to get this to work on my blog, works great running locally but not working in production yet.&lt;/p&gt;
&lt;p&gt;Think I know what might be happening. I use Cloudflare to do my SSL, as Custom SSL certs for the cheaper Azure Web Apps is not supported. Something in Cloudflare is caching or interfering.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://zimmergren.net/solved-asp-net-core-blazor-web-sites-does-not-work-with-cloudflare-html-minification/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://zimmergren.net/solved-asp-net-core-blazor-web-sites-does-not-work-with-cloudflare-html-minification/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Turning off HTML minification fixed my issue!&lt;/p&gt;
&lt;p&gt;One additional thing I added to my Blog is the &lt;a href=&#34;https://www.funkysi1701.com/config&#34;&gt;/config&lt;/a&gt;
 page which details some of the config settings. I think this probably came from &lt;a href=&#34;https://www.hanselman.com/blog/adding-a-git-commit-hash-and-azure-devops-build-number-and-build-id-to-an-aspnet-website&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://www.hanselman.com/blog/adding-a-git-commit-hash-and-azure-devops-build-number-and-build-id-to-an-aspnet-website&lt;/a&gt;
 but it was a while ago when I first did this on another project.&lt;/p&gt;
&lt;p&gt;At the moment we have .net Version, Commit and Build links.&lt;/p&gt;
&lt;p&gt;The .Net Version is obtained from&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;@System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A few other bits of info can be obtained from System.Runtime.InteropServices.RuntimeInformation which I have included on the page for fun. There are probably security concerns with exposing all this info publicly so something to bear in mind if you try this.&lt;/p&gt;
&lt;p&gt;Build Info is passed to my code by a build step&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yml&#34; data-lang=&#34;yml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- &lt;span style=&#34;color:#f92672&#34;&gt;script&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;(echo $(Build.BuildNumber) &amp;amp;&amp;amp; echo $(Build.BuildId)) &amp;gt; .buildinfo.json&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;displayName&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Emit build number&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;workingDirectory&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;$(Build.SourcesDirectory)/src/WebBlog&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;failOnStderr&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This simply passed the build id and number which are stored as variabled and saves them in a text file.&lt;/p&gt;
&lt;p&gt;I then have a class that reads them and constructs a link.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;using&lt;/span&gt; Microsoft.Extensions.Hosting;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;using&lt;/span&gt; System;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;using&lt;/span&gt; System.IO;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;using&lt;/span&gt; System.Linq;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;using&lt;/span&gt; System.Reflection;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;namespace&lt;/span&gt; WebBlog
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;AppVersionInfo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; _buildFileName = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.buildinfo.json&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;readonly&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; _buildFilePath;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; _buildNumber = &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;.Empty;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; _buildId = &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;.Empty;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; _gitHash = &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;.Empty;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; _gitShortHash = &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;.Empty;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; AppVersionInfo(IHostEnvironment hostEnvironment)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            _buildFilePath = Path.Combine(hostEnvironment.ContentRootPath, _buildFileName);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; BuildNumber
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;get&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;.IsNullOrEmpty(_buildNumber))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (File.Exists(_buildFilePath))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; fileContents = File.ReadLines(_buildFilePath).ToList();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (fileContents.Count &amp;gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            _buildNumber = fileContents[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (fileContents.Count &amp;gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            _buildId = fileContents[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;.IsNullOrEmpty(_buildNumber))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        _buildNumber = DateTime.UtcNow.ToString(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;yyyyMMdd&amp;#34;&lt;/span&gt;) + &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.0&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;.IsNullOrEmpty(_buildId))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        _buildId = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;123456&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; _buildNumber;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; BuildId
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;get&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;.IsNullOrEmpty(_buildId))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; _ = BuildNumber;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; _buildId;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; GitHash
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;get&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;.IsNullOrEmpty(_gitHash))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; version = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;1.0.0+LOCALBUILD&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; appAssembly = &lt;span style=&#34;color:#66d9ef&#34;&gt;typeof&lt;/span&gt;(AppVersionInfo).Assembly;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; infoVerAttr = (AssemblyInformationalVersionAttribute)appAssembly
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        .GetCustomAttributes(&lt;span style=&#34;color:#66d9ef&#34;&gt;typeof&lt;/span&gt;(AssemblyInformationalVersionAttribute)).FirstOrDefault();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (infoVerAttr != &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt; &amp;amp;&amp;amp; infoVerAttr.InformationalVersion.Length &amp;gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        version = infoVerAttr.InformationalVersion;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    _gitHash = version[(version.IndexOf(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;+&amp;#39;&lt;/span&gt;) + &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)..];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; _gitHash;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; ShortGitHash
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;get&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;.IsNullOrEmpty(_gitShortHash))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    _gitShortHash = GitHash.Substring(GitHash.Length - &lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; _gitShortHash;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The BuildId and BuildNumber properties just fetch the details saved into the text file during the build. This can then be passed to build the build link.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://dev.azure.com/{OrgName}/{RepoName}/_build/results?buildId=@appInfo.BuildId&amp;amp;view=results&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    @appInfo.BuildNumber
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;a&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Finally, the GitHash properties need to fetch the hash and shorthash of the commit which is a bit more complex. This is achieved using the following line in your build.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yml&#34; data-lang=&#34;yml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- &lt;span style=&#34;color:#f92672&#34;&gt;task&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;DotNetCoreCLI@2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;displayName&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Publish&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;inputs&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;command&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;publish&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;publishWebProjects&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;arguments&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;--output $(Build.ArtifactStagingDirectory) /p:SourceRevisionId=$(Build.SourceVersion)&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;/p:SourceRevisionId=$(Build.SourceVersion) add the revision hash to [assembly: AssemblyInformationalVersion] during the build which can then be extracted using the gitHash property above, before being passed into the commit link.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://github.com/{OrgName}/{RepoName}/commit/@appInfo.GitHash&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    @appInfo.ShortGitHash
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;a&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Security Headers</title>
      <link>https://www.funkysi1701.com/posts/2020/security-headers/</link>
      <pubDate>Sat, 26 Sep 2020 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2020/security-headers/</guid>
      <description>&lt;p&gt;Have you wondered what info you are leaking via your response headers?, do you want some kind of guide about what headers to set or remove altogether?&lt;/p&gt;
&lt;p&gt;Head on over to &lt;a href=&#34;https://securityheaders.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://securityheaders.com/&lt;/a&gt;
 This is a site created by security expert &lt;a href=&#34;https://scotthelme.co.uk&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Scott Helme&lt;/a&gt;
 that rates a URL based on what response headers it can see.&lt;/p&gt;
&lt;p&gt;I am pleased to say &lt;a href=&#34;https://www.funkysi1701.com&#34;&gt;www.funkysi1701.com&lt;/a&gt;
 is now getting an A.&lt;img class=&#34;img-fluid&#34; alt=&#34;Alt Text&#34; src=&#34;https://dev-to-uploads.s3.amazonaws.com/i/07rwumi94fz141hwessu.PNG&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;So how do you add/remove headers in dotnet core?&lt;/p&gt;
&lt;p&gt;In my configure method in Startup.cs I have the following code block.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;app.Use(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    next =&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; context =&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            context.Response.OnStarting(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                () =&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    context.Response.Headers.Add(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Permissions-Policy&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;microphone=()&amp;#34;&lt;/span&gt;);     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    context.Response.Headers.Remove(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Server&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    context.Response.Headers.Remove(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;X-Powered-By&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    context.Response.Headers.Remove(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;X-AspNet-Version&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; Task.CompletedTask;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; next(context);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     });
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I have only included a few of the headers I am adding as the excellent &lt;a href=&#34;https://securityheaders.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://securityheaders.com/&lt;/a&gt;
 can tell you which headers you should add and what options you might want.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Back to Blogging</title>
      <link>https://www.funkysi1701.com/posts/2020/back-to-blogging/</link>
      <pubDate>Fri, 25 Sep 2020 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2020/back-to-blogging/</guid>
      <description>&lt;p&gt;My last blog post was over six months ago.&lt;/p&gt;
&lt;p&gt;Covid 19 has hit the world, and I will be honest I have found it a challenging time.&lt;/p&gt;
&lt;p&gt;My Blog had gotten into a bit of a mess. It had become fragmented with different versions of the same thing; I will attempt to explain what has become of my blog.&lt;/p&gt;
&lt;p&gt;The original WordPress site can currently be found at &lt;a href=&#34;https://www.pwnedpass.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://www.pwnedpass.com/&lt;/a&gt;
 I would prefer it to be on a sub-domain of funkysi1701.com but for some reason I haven&amp;rsquo;t been able to get that to work, not sure if it is a limitation of my hosting package. I like WordPress, it is very flexible, easy to get blog posts out there. But I want to write content about development and having a site I can tinker with is important to me.&lt;/p&gt;
&lt;p&gt;Most of my WordPress blogs have been imported into dev.to and a few extra have been written on this platform. I like dev.to it is a wonderful place to share content and it has one or two extra features I like.&lt;/p&gt;
&lt;p&gt;dev.to has an integration with Stackbit/Netlify and this became &lt;a href=&#34;https://dev.funkysi1701.com&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://dev.funkysi1701.com&lt;/a&gt;
. I like having a personal site, but having the same content as dev.to. To add content to this site all I need to do is write it on dev.to and some magic will go on behind the scenes and new content will be published.&lt;/p&gt;
&lt;p&gt;However, as a developer I don&amp;rsquo;t like magic, I want to understand what is going on a fiddle with all the settings and make it do what I want.&lt;/p&gt;
&lt;p&gt;dev.to has an API, I can build a site in .Net Core and make API calls to fetch the content I want. I understand APIs, I understand .Net and can customise my site exactly how I want it, plus play about with a .net website. This is what &lt;a href=&#34;https://www.funkysi1701.com&#34;&gt;https://www.funkysi1701.com&lt;/a&gt;
 is now.&lt;/p&gt;
&lt;p&gt;So what have I built so far. I have a Server Side Blazor site running .Net 5. Why Server Side and not Client Side I hear you ask? Well only because I have more experience with Server Side and know how to quickly create a website with that technology, I may change it as time goes by, but we will see.&lt;/p&gt;
&lt;p&gt;I have two pages a list of my blog posts and a page that displays the content. Both of these use the dev.to API. I lied, there is a third page I hacked together to do some page redirection from the WordPress URLs. This is something I will change as time goes on.&lt;/p&gt;
&lt;p&gt;There are lots of improvements I want to do, there are probably also lots of broken images or links as well. Hopefully, this will result in a good platform to blog about as well as on.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Testing for expiring SSL Certificates</title>
      <link>https://www.funkysi1701.com/posts/2020/testing-for-expiring-ssl-certificates/</link>
      <pubDate>Tue, 03 Mar 2020 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2020/testing-for-expiring-ssl-certificates/</guid>
      <description>&lt;p&gt;Let&amp;rsquo;s Encrypt is amazing, you can easily add SSL certificates to any website and automate the renewal process. I have talked &lt;a href=&#34;https://www.funkysi1701.com/posts/let-s-encrypt-is-awesome-3f5j/&#34;&gt;before&lt;/a&gt;
 about how impressive it is.&lt;/p&gt;
&lt;p&gt;Once you start adding SSL certificates to your production sites however you may want to check when they expire so you don&amp;rsquo;t get caught out. You can always open your site in your favourite browser and view the certificate information and expiry date.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;SSL Cert&#34; src=&#34;https://dev-to-uploads.s3.amazonaws.com/i/jb78re4fmm1ofx81f3mu.JPG&#34; loading=&#34;lazy&#34;
  
   /&gt;


However there is a way to automate this check.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;[Fact]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; IsSSLExpiring()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{               
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; handler = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; HttpClientHandler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ServerCertificateCustomValidationCallback = CustomCallback
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; client = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; HttpClient(handler);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  HttpResponseMessage response = client.GetAsync(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://www.example.com&amp;#34;&lt;/span&gt;).GetAwaiter().GetResult();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Assert.True(response.IsSuccessStatusCode);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;bool&lt;/span&gt; CustomCallback(HttpRequestMessage arg1, X509Certificate2 arg2, X509Chain arg3, SslPolicyErrors arg4)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; now = DateTime.UtcNow;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; expire = arg2.NotAfter;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; diff = (expire - now).TotalDays;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Assert.InRange(diff, &lt;span style=&#34;color:#ae81ff&#34;&gt;30&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;1000&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; arg4 == SslPolicyErrors.None;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This code gets the SSL expiry date from &lt;a href=&#34;https://www.example.com&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://www.example.com&lt;/a&gt;
 and will fail the  xunit test if the expiry date is less than 30 days in the future. I then schedule my tests to run regularly on all my environments with a Let&amp;rsquo;s Encrypt Certificate and this gives me advanced warning if a SSL certificate is about to expire.&lt;/p&gt;
&lt;p&gt;The Assert.InRange(diff, 30, 1000) line will fail the test if the expiry date is less than 30 days or greater than 1000, but as the default expiry for Let&amp;rsquo;s Encrypt certificates is three months it will never be greater than 1000 days even with a freshly installed certificate. These values can be tweaked to suit your use case, however 30 days is enough time for me to investigate what is happening.&lt;/p&gt;
&lt;p&gt;To execute my tests I use a scheduled build in Azure DevOps, but anything that regularly can run your tests will do the job.&lt;/p&gt;
&lt;p&gt;The code above is just a simple example to get your started for my purposes I have put all my URLs into config files and just pass these into my tests, so I don&amp;rsquo;t need a custom test for every different URL.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Picard is back!</title>
      <link>https://www.funkysi1701.com/posts/2019/picard-is-back/</link>
      <pubDate>Thu, 08 Aug 2019 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2019/picard-is-back/</guid>
      <description>&lt;p&gt;It has just been announced at the annual Star Trek Las Vegas (&lt;a href=&#34;https://twitter.com/hashtag/STLV&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#STLV&lt;/a&gt;
) convention that Patrick Stewart is going to return to his role as Jean-Luc Picard in a new TV Show.&lt;/p&gt;
&lt;iframe type=&#34;text/html&#34; width=&#34;662&#34; height=&#34;373&#34; src=&#34;https://www.youtube.com/embed/aCKQp1sGVRQ?version=3&amp;amp;rel=1&amp;amp;fs=1&amp;amp;autohide=2&amp;amp;showsearch=0&amp;amp;showinfo=1&amp;amp;iv_load_policy=1&amp;amp;wmode=transparent&#34; allowfullscreen=&#34;true&#34; style=&#34;border:0;&#34;&gt;&lt;/iframe&gt;
&lt;p&gt;Few other details have been announced other than the TV show will take place 20 years after the film Star Trek: Nemesis and will feature the character of Jean-Luc Picard.&lt;/p&gt;
&lt;p&gt;Lets run though a few things I would like to see from this new show.&lt;/p&gt;
&lt;h2 id=&#34;low-on-action&#34;&gt;Low on Action&lt;a class=&#34;anchor ms-1&#34; href=&#34;#low-on-action&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Star Trek: Discovery is a great show and has brought Star Trek back to our TV shows. However it is an action show, it zooms along so fast and with so much action I would appreciate a show that can takes its time a bit more.&lt;/p&gt;
&lt;p&gt;I want a show that can show Picard carefully considering some moral issue and making a decision. Something we were used to seeing on TNG.&lt;/p&gt;
&lt;h2 id=&#34;feature-picards-excellent-speeches&#34;&gt;Feature Picard’s excellent speeches&lt;a class=&#34;anchor ms-1&#34; href=&#34;#feature-picards-excellent-speeches&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;One of the best features I can think of Jean-Luc Picard is his ability to make speeches about one issue or other.&lt;/p&gt;
&lt;p&gt;Lets look at a few examples:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Insurection&lt;/strong&gt; : Picard speaks about the forced relocation of a group of people.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;How many people does it take, Admiral, before it becomes wrong? Hmm? A thousand, fifty thousand, a million? How many people does it take, Admiral?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;First&lt;/strong&gt;  &lt;strong&gt;Contact&lt;/strong&gt; : Picard is hell bent on revenge for what the Borg have done to him and refuses to destroy the Enterprise to save his crew.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“I will not sacrifice the Enterprise. We’ve made too many compromises already. Too many retreats. They invade our space and we fall back. They assimilate entire worlds, and we fall back. Not again! The line must be drawn here, …this far, no further! And I will make them pay for what they’ve done.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Measure of a Man&lt;/strong&gt; : Picard argues for the rights of Data.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“You see, he’s met two of your three criteria for sentience, so what if he meets the third. Consciousness in even the smallest degree. What is he then? I don’t know. Do you? (to Riker) Do you? (to Phillipa) Do you? Well, that’s the question you have to answer. Your Honour, the courtroom is a crucible. In it we burn away irrelevancies until we are left with a pure product, the truth for all time. Now, sooner or later, this man or others like him will succeed in replicating Commander Data. And the decision you reach here today will determine how we will regard this creation of our genius. It will reveal the kind of a people we are, what he is destined to be. It will reach far beyond this courtroom and this one android. It could significantly redefine the boundaries of personal liberty and freedom, expanding them for some, savagely curtailing them for others. Are you prepared to condemn him and all who come after him to servitude and slavery? Your Honour, Starfleet was founded to seek out new life. Well, there it sits. Waiting. You wanted a chance to make law. Well, here it is. Make a good one.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;ask-important-questions&#34;&gt;Ask important questions&lt;a class=&#34;anchor ms-1&#34; href=&#34;#ask-important-questions&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We live in uncertain times. There are lots of pressures on today’s world and we need to acknowledge these. Picard is an excellent character to use to ask important questions of the day.&lt;/p&gt;
&lt;p&gt;What does it mean to be human?&lt;br&gt;
How should we treat people that are different to us?&lt;br&gt;
How should we react to extremism?&lt;/p&gt;
&lt;h2 id=&#34;deal-with-his-age&#34;&gt;Deal with his age&lt;a class=&#34;anchor ms-1&#34; href=&#34;#deal-with-his-age&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In the last episode of TNG a future version of Picard is shown 25 years into the future. This is a similar time period so it will be interesting to compare the two. Have Picard look back on his life and ask questions about his life choices.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;Picard&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2018/08/all-good-things.jpg?w=662&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;h2 id=&#34;be-consistent-with-his-past&#34;&gt;Be consistent with his past&lt;a class=&#34;anchor ms-1&#34; href=&#34;#be-consistent-with-his-past&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Picard is a well known character. So writers please don’t change him. I want a character we know, not a character that looks like Picard but acts in a way contrary to what we would expect.&lt;/p&gt;
&lt;p&gt;Picard has a history we know, he served on the stargazer and of course the Enterprise, he has an artificial heart, he was assimiliated by the Borg. All&lt;/p&gt;
&lt;h2 id=&#34;reference-50-years-of-star-trek&#34;&gt;Reference 50 years of Star Trek&lt;a class=&#34;anchor ms-1&#34; href=&#34;#reference-50-years-of-star-trek&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Discovery and Enterprise are TV shows which have a problem. There is Trek going on after them which imposes a few rules on what can and can’t be done.&lt;/p&gt;
&lt;p&gt;This is a TV Show that will take place after every other Trek TV and Film and can do whatever the creators want. This gives freedom, but it also gives the responsibility to reference what has gone before.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;Picard&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2018/08/download.jpg?w=662&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;The 2009 Star Trek film features the destruction of Romulus and Spock travelling back in time. How about Picard dealing with surviving Romulans helping rebuild their society, continuing the work that Spock started in the TNG episode Unification.&lt;/p&gt;
&lt;p&gt;I look forward to finding out what the Star Trek production team has in store for us. If they have Patrick Stewart convinced I am sure it is going to be good.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Infrastructure as Code - Creating Azure Resources with Terraform</title>
      <link>https://www.funkysi1701.com/posts/2019/infrastructure-as-code-creating-azure-resources-with-terraform/</link>
      <pubDate>Sat, 11 May 2019 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2019/infrastructure-as-code-creating-azure-resources-with-terraform/</guid>
      <description>&lt;p&gt;Terraform is a way to script the creation of Azure Resources. By scripting the creation of your resources you can run them again and again and be certain that everything is configured exactly the same as the script has specified. No more forgetting to tick the tick box, if it’s in your script then it will be deployed with exactly the same configuration.&lt;/p&gt;
&lt;p&gt;The process of executing a terraform script follows this basic process.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;terraform init&lt;/strong&gt; – Initialises the terraform directory
&lt;strong&gt;terraform plan&lt;/strong&gt; – generates and displays what will be executed
&lt;strong&gt;terraform apply&lt;/strong&gt; – applies the terraform script to your Azure subscription
&lt;strong&gt;terraform destroy&lt;/strong&gt; – deletes your Azure resource that were created in the previous step&lt;/p&gt;
&lt;p&gt;Lets look at how you might execute a terraform script from your build or release pipeline.&lt;/p&gt;
&lt;p&gt;I am executing my terraform scripts from my release pipeline and as I don’t want to check binaries into my source code I am going to add a bit of plumbing to get things in the right places. The terraform binary can be obtained from &lt;a href=&#34;https://www.terraform.io/downloads.html&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://www.terraform.io/downloads.html&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;To start with I am executing a Powershell script to download the terraform binary, this is in the form of a zip file, so i need to download and unzip it.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#Download&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$url = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://releases.hashicorp.com/terraform/0.11.13/terraform_0.11.13_windows_amd64.zip&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$output = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;terraform.zip&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(New-Object System.Net.WebClient).DownloadFile($url, $output)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#Unzip&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Add-Type -AssemblyName System.IO.Compression.FileSystem
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#66d9ef&#34;&gt;System.IO.Compression.ZipFile&lt;/span&gt;]::ExtractToDirectory($output, Get-Location)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now that I have the terraform binaries I can just run Azure Cli and execute the terraform commands above.&lt;/p&gt;
&lt;p&gt;Now it is time to look at the the terraform script. This particular script creates a resource group, an app service plan and a webapp.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# Configure the Microsoft Azure Provider
provider &amp;#34;azurerm&amp;#34; {
  subscription_id = &amp;#34;&amp;#34;
  client_id       = &amp;#34;&amp;#34;
  client_secret   = &amp;#34;&amp;#34;
  tenant_id       = &amp;#34;&amp;#34;
}

resource &amp;#34;azurerm_resource_group&amp;#34; &amp;#34;rg&amp;#34; {
        name = &amp;#34;resource-group&amp;#34;
        location = &amp;#34;northeurope&amp;#34;
}

resource &amp;#34;azurerm_app_service_plan&amp;#34; &amp;#34;plan&amp;#34; {
  name                = &amp;#34;planname&amp;#34;
  location            = &amp;#34;${azurerm_resource_group.rg.location}&amp;#34;
  resource_group_name = &amp;#34;${azurerm_resource_group.rg.name}&amp;#34;

  sku {
    tier = &amp;#34;Standard&amp;#34;
    size = &amp;#34;S1&amp;#34;
  }
}

resource &amp;#34;azurerm_app_service&amp;#34; &amp;#34;webapp&amp;#34; {
  name                = &amp;#34;example-app-service&amp;#34;
  location            = &amp;#34;${azurerm_resource_group.rg.location}&amp;#34;
  resource_group_name = &amp;#34;${azurerm_resource_group.rg.name}&amp;#34;
  app_service_plan_id = &amp;#34;${azurerm_app_service_plan.plan.id}&amp;#34;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;There are four guids that you need to fill in from your azure subscription and to find these you need to run a few commands from Azure Cli. Check out
&lt;a href=&#34;https://docs.microsoft.com/en-us/azure/virtual-machines/linux/terraform-install-configure&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://docs.microsoft.com/en-us/azure/virtual-machines/linux/terraform-install-configure&lt;/a&gt;
 for more detail on these commands.&lt;/p&gt;
&lt;p&gt;Run these either from Azure Cloud Shell or from Powershell command prompt after Azure Cli has been installed.&lt;/p&gt;
&lt;p&gt;az login – to login to azure a browser window will open up.&lt;/p&gt;
&lt;p&gt;az account show –query &amp;ldquo;{subscriptionId:id, tenantId:tenantId}&amp;rdquo;
This will show you your subscription id.&lt;/p&gt;
&lt;p&gt;az account set –subscription=&amp;quot;${SUBSCRIPTION_ID}&amp;quot;
Where ${SUBSCRIPTION_ID} is the subscription id you found in the last step.&lt;/p&gt;
&lt;p&gt;az ad sp create-for-rbac –role=&amp;ldquo;Contributor&amp;rdquo; –scopes=&amp;quot;/subscriptions/${SUBSCRIPTION_ID}&amp;quot;
Where ${SUBSCRIPTION_ID} is the subscription id you found in the last step and assumes you have permission to the subscription.&lt;/p&gt;
&lt;p&gt;This last command will about a series of Guids which you need to fill in at the top of your terraform file appId = client_id, password = client_secret, tenant = tenant_id and subscription_id you already have.&lt;/p&gt;
&lt;p&gt;This just gives you a taste of what you can do with terraform. Looking at the &lt;a href=&#34;https://docs.microsoft.com/en-us/azure/terraform/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Azure Terraform docs&lt;/a&gt;
 there are loads of different resources you can create and even a &lt;a href=&#34;https://github.com/terraform-providers/terraform-provider-azurerm&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;github repo&lt;/a&gt;
 with some samples.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Gated Release</title>
      <link>https://www.funkysi1701.com/posts/2019/gated-release/</link>
      <pubDate>Fri, 05 Apr 2019 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2019/gated-release/</guid>
      <description>&lt;p&gt;Automated releases of software are great but how can we add an element of feedback so only good releases go live.&lt;/p&gt;
&lt;p&gt;I have been using Azure DevOps to release my &lt;a href=&#34;https://www.funkysi1701.com/pwned-pass/&#34;&gt;PwnedPass&lt;/a&gt;
 android app to the Google Play Store for a while now. There are options to deploy to the alpha, Beta or Production tracks and even to set % of users to target. For the full range of options check out the Google Play &lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=ms-vsclient.google-play&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;extension&lt;/a&gt;
 for Azure DevOps.&lt;/p&gt;
&lt;p&gt;My release starts by publishing to 10% of users on the production track, my next step makes use of the increase rollout option to increase this %, you can have as many of these additional steps as you want until you reach 100% of your users.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;Image&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2019/04/image.png?fit=662%2C116&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Now if you run this release now it will just run through each of the steps one after the other. Now of course you can add a pre or post approval to your pipeline but this just adds a manual dependency to your release. Whoever does the approving needs to check things are working before approving or worse just approves regardless.&lt;/p&gt;
&lt;p&gt;Azure DevOps has the concept of &lt;a href=&#34;https://docs.microsoft.com/en-us/azure/devops/pipelines/release/deploy-using-approvals?view=azure-devops&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;gated releases&lt;/a&gt;
 which allows you to add automated checks before or after a release happens. These automated checks can be any of the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An Azure Function&lt;/li&gt;
&lt;li&gt;A Rest API call&lt;/li&gt;
&lt;li&gt;Azure Monitor Alert&lt;/li&gt;
&lt;li&gt;Query Work Items&lt;/li&gt;
&lt;li&gt;Security and Compliance Assessment&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We are going to make use of the Azure Monitor Alert, to create an alert from your Application Insights data and only continue the rollout if no failures are detected.&lt;/p&gt;
&lt;p&gt;Open up your application insights resource in the Azure portal and look in alerts. Click add new alert rule.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;Image&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2019/04/image-1.png?fit=662%2C552&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Select your application insights resource in Resource, In Condition choose a condition to check, I chose Failed Requests, so every time a failure is registered in my API I can stop the deployment. The exact criteria you want to use is entirely up to you.&lt;/p&gt;
&lt;p&gt;Create an action group, I just set my alert to send an email to myself but there are other alert actions you may want to try. Give your alert a name and description and click save.&lt;/p&gt;
&lt;p&gt;Now all we need to do is make Azure DevOps make use of this alert. In your release pipeline select the pre-deployment conditions of your second step and open up the Gates section.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;Image&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2019/04/image-2.png?fit=662%2C498&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Choose a suitable time to evaluate, I have been using something long like 12 or 24 hours so if there are problems there is time for it to be noticed. Choose Version 1 of the task (I was not able to get it to work with Version 0)&lt;/p&gt;
&lt;p&gt;Now select your Azure subscription and Resource Group and leave the rest of the settings as they are. Now your Deployment will stop and analyse application insights for any Failed requests and will halt if it finds any.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;Image&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2019/04/image-3.png?fit=662%2C88&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;I am still testing this out but it will take a few days to figure out if this what I want due to the large time scales involved. I feel this is going to be an improvement of manually approving release steps.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Documenting your API</title>
      <link>https://www.funkysi1701.com/posts/2019/documenting-your-api/</link>
      <pubDate>Wed, 27 Mar 2019 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2019/documenting-your-api/</guid>
      <description>&lt;p&gt;So you have created a super API that does something amazing. How do you document it so people will use it?&lt;/p&gt;
&lt;p&gt;One way of easily documenting your API is to install the Swashbuckle package.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Install-Package Swashbuckle.AspNetCore
Install-Package Swashbuckle.AspNetCore.Swagger 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then in you startup.cs add the following lines&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//In ConfigureServices&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;services.AddSwaggerGen(c =&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    c.SwaggerDoc(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;v1&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Info { Title = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;API&amp;#34;&lt;/span&gt;, Version = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;v1&amp;#34;&lt;/span&gt;, Description = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;An API Description&amp;#34;&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    c.IncludeXmlComments(&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;.Format(&lt;span style=&#34;color:#e6db74&#34;&gt;@&amp;#34;{0}\API.xml&amp;#34;&lt;/span&gt;, System.AppDomain.CurrentDomain.BaseDirectory));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//In Configure&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;app.UseSwagger();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;app.UseSwaggerUI(c =&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        c.SwaggerEndpoint(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/swagger/v1/swagger.json&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;API V1&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        c.RoutePrefix = &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;.Empty;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now when you browse to your API you will see the swagger documentation system.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;Image&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2019/03/image-3.png?w=662&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;The RoutePrefix setting controls the path in which swagger will display. I have my docs at the root, but you might want them under the /docs or similar path.&lt;/p&gt;
&lt;p&gt;The IncludeXmlComments setting from the ConfigureServices method allows you to load in any XML comments you have added to methods. For this to work you need to enable a setting to your build.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;Image&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2019/03/image-4.png?w=662&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;The XML documentation file must be ticked and contain a path. Everytime you do a build, a XML file will be generated which contains all the comment blocks you have added to your code.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;Image&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2019/03/image-5.png?w=662&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Swagger will then use this XML documentation file to produce lovely looking documentation without you having to do anything extra.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;Image&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2019/03/image-6.png?fit=662%2C260&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Azure Key Vault</title>
      <link>https://www.funkysi1701.com/posts/2019/azure-key-vault/</link>
      <pubDate>Tue, 19 Mar 2019 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2019/azure-key-vault/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://docs.microsoft.com/en-gb/azure/key-vault/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Azure Key Vault&lt;/a&gt;
 is a secure way of storing your keys, certificates and secrets so your application can access everything it needs to but you don’t have them being stored insecurely anywhere such as in source control.&lt;/p&gt;
&lt;p&gt;I have been wanting to give Azure Key Vault a try for a while now as it can make use of Azure Active Directory to give your web app an identity so it can authenticate itself into the key vault to access secrets. Pretty clever but with a lot of moving parts a bit complex.&lt;/p&gt;
&lt;p&gt;For my example I am just going to connect to my Key Vault and get a secret and display it somewhere on a web page. This is of course not what you want to do as secrets are secret and shouldn’t be displayed just used to authenticate into whatever, however it is an easy way to prove I am connecting to the Key Vault and everything is working.&lt;/p&gt;
&lt;p&gt;Lets look at some code. I have a .net core application and to start with lets install three nuget packages.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Microsoft.Azure.KeyVault
Microsoft.Azure.Services.AppAuthentication
Microsoft.Extensions.Configuration.AzureKeyVault
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I’ve not include version numbers as these will no doubt get updated over time but hopefully it will still work.&lt;/p&gt;
&lt;p&gt;Now in your Program.cs add the following code, replacing [KeyVaultName] with the name of your Key Vault.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Program&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; Main(&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;[] args)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            CreateWebHostBuilder(args).Build().Run();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; IWebHostBuilder CreateWebHostBuilder(&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;[] args) =&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            WebHost.CreateDefaultBuilder(args)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .ConfigureAppConfiguration((context, config) =&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; builtConfig = config.Build();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; azureServiceTokenProvider = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; AzureServiceTokenProvider();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; keyVaultClient = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; KeyVaultClient(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; KeyVaultClient.AuthenticationCallback(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            azureServiceTokenProvider.KeyVaultTokenCallback));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    config.AddAzureKeyVault(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#e6db74&#34;&gt;$&amp;#34;https://[KeyVaultName].vault.azure.net/&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        keyVaultClient,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; DefaultKeyVaultSecretManager());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            })
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            .UseApplicationInsights()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            .UseStartup&amp;lt;Startup&amp;gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now all you need to do is look at your configuration to pull out secrets from your Azure Key Vault. If you have a secret called AppSecret then you can use the following code snippet to retrieve its value, assuming _configuration is an implementation of Microsoft.Extensions.Configuration.IConfiguration.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;_configuration[&amp;#34;AppSecret&amp;#34;];
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now if you do all of this and run from an Azure Web App or run locally it will fail to pull anything from the Key Vault. You need to give your web app an identity and configure your key vault to allow access from that identity.&lt;/p&gt;
&lt;p&gt;Once my code has been deployed to an Azure Web App I get the following error.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;Image&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2019/03/image.png?fit=662%2C292&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Lets look at fixing that, first lets give my web app an Identity. Open up the Azure portal and find the identity section of your web app and turn the setting on.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;Image&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2019/03/image-1.png?fit=662%2C396&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Now you need to grant that identity permission to your key vault. In the portal open up Access Policies in your key vault and click add Policy, select the identity of your web app in the principal box and select the following settings to grant access to your secret.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;Image&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2019/03/image-2.png?resize=206%2C428&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Now you have a website that can pull secrets out of Key Vault but only that unique identity. Anyone who has access to your source code will not have access to your secrets, even if they push your code to a different Azure Web App.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Technology I want to learn more about</title>
      <link>https://www.funkysi1701.com/posts/2019/technology-i-want-to-learn-more-about/</link>
      <pubDate>Tue, 05 Mar 2019 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2019/technology-i-want-to-learn-more-about/</guid>
      <description>&lt;p&gt;While at &lt;a href=&#34;https://www.funkysi1701.com/2019/02/26/microsoft-ignite-the-tour-london&#34;&gt;Microsoft Ignite&lt;/a&gt;
 I heard about a lot of cool tech that I want to know more about. The best way to learn something is use it to solve a problem.&lt;/p&gt;
&lt;p&gt;So what can I build that is both useful and will let me play with some new tech?&lt;/p&gt;
&lt;p&gt;I have a Xamarin Forms app &lt;a href=&#34;https://www.funkysi1701.com/pwned-pass/&#34;&gt;Pwned Pass&lt;/a&gt;
 that has over 500 downloads on &lt;a href=&#34;https://play.google.com/store/apps/details?id=pwnedpasswords.pwnedpasswords&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Google play&lt;/a&gt;
 and over 80 downloads on the &lt;a href=&#34;https://www.microsoft.com/en-gb/p/pwned-pass/9nm2whnztnlt?rtc=1&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Microsoft Store&lt;/a&gt;
. This has given me a small user base that I can use to make use of whatever I build.&lt;/p&gt;
&lt;p&gt;My app makes use of the &lt;a href=&#34;https://haveibeenpwned.com/API/v2&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;HIBP API&lt;/a&gt;
 created by Troy Hunt. I am going to build my own API, initially it will just make calls to the HIBP API. Building this will give me experience of building something with .net Core from design to deployment. I have made a start already on doing this, I have an empty .net core API project which deploys to an Azure web app using the build and release pipelines from Azure DevOps.&lt;/p&gt;
&lt;p&gt;You may be wondering why I am not making use of Azure Functions to build this API. Azure functions is certainly a great technology that is worth learning about. However I have done a little bit with them in the past and I don’t believe I would be able to learn all the things I want to if I used Azure Functions. My primary goal is learning and sharing that learning via this blog. It may well be I move to using Azure Functions later on.&lt;/p&gt;
&lt;p&gt;Another tech I am keen to learn more about is &lt;a href=&#34;https://docs.microsoft.com/en-gb/azure/key-vault/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Azure Key Vault&lt;/a&gt;
. This is a technology that allows the securing of keys, connection strings and certificates. I want my app to securely get keys and security information without any of it having to be committed to source code or shared insecurely.&lt;/p&gt;
&lt;p&gt;Monitoring my app is also a key learning from me. I use application insights already, but I would like to extend my understanding of this so telemetry can be fed back into the build and bad deployments stopped.&lt;/p&gt;
&lt;p&gt;Below is my complete list of learning and tech I want to touch on. It is a long list and I imagine it will get longer as I work through it. I want to regularly blog and share what I have been working on. I currently have a working build and release pipeline but nothing of note to build or release. I know Key Vault needs looking at early as the identity of the website in Azure is key to getting that tech working correctly.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Build API with .net core&lt;/li&gt;
&lt;li&gt;Add build and release pipeline&lt;/li&gt;
&lt;li&gt;Make use of Azure KeyVault for secrets, connection strings etc&lt;/li&gt;
&lt;li&gt;Plugin My Xamarin app to make use of it&lt;/li&gt;
&lt;li&gt;Monitor my API with Application Insights&lt;/li&gt;
&lt;li&gt;Secure it with CSPs and log this into &lt;a href=&#34;https://report-uri.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Report URI&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Consider building a web frontend to my API using a javascript library or framework. Maybe react but this can be decided later.&lt;/li&gt;
&lt;li&gt;Dockerize the API and add the creation of docker images to the build/release pipeline&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>Microsoft Ignite | The Tour – London</title>
      <link>https://www.funkysi1701.com/posts/2019/microsoft-ignite-the-tour-london/</link>
      <pubDate>Tue, 26 Feb 2019 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2019/microsoft-ignite-the-tour-london/</guid>
      <description>&lt;p&gt;I have just spent the first day at the conference Microsoft Ignite | The Tour.
&lt;img class=&#34;img-fluid&#34; alt=&#34;Alt Text&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2019/02/D0UTj08XgAEo1YJ.jpg?fit=662%2C440&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;


The conference was free I just needed to arrange travel and accommodation. Microsoft have really looked after me and all the other guests, breakfast and lunch has been provided, I got a free t-shirt, coffee (or tea) all day plus a beer or glass of wine to end the day. And that’s before you collect any free stuff the vendors are giving away.&lt;/p&gt;
&lt;p&gt;The first session was Designing resilient cloud applications with &lt;a href=&#34;https://twitter.com/CodeMillMatt&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Matt Soucoup&lt;/a&gt;
 and talked about some cloud technologies like Azure key vault and serving static files from blob storage. Unfortunately this had a few technical issues with the demos. I think it was just connectivity with the MongoDB backend but this slightly spoiled the session. As this was the only technical problem I noticed all day I can let it pass.&lt;/p&gt;
&lt;p&gt;Next was a session on Azure DevOps mainly build and release pipelines called Deploying your application faster and safer with &lt;a href=&#34;https://twitter.com/bbenz&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Brian Benz&lt;/a&gt;
. A lot of this I knew but good to reinforce I am doing things correctly.&lt;/p&gt;
&lt;p&gt;Next was a session on Application Insights called Detecting application anomalies with Telemetry with Matt Soucoup.&lt;/p&gt;
&lt;p&gt;Probably the most useful session was on Docker and Kubernetes called Integrate containers and Kubernetes into your Azure DevOps build and release model with &lt;a href=&#34;https://twitter.com/crad77&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Marco De Sanctis&lt;/a&gt;
. Going to spend some time looking through the examples from this session.&lt;/p&gt;
&lt;p&gt;A session on Serverless covered Azure Functions, Azure Logic apps and the other Azure Serverless offerings. Investing in Serverless: less servers, more code with &lt;a href=&#34;https://twitter.com/simona_cotin&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Simona Cotin&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;Lastly was a panel discussion on the changes facing IT Pros and SysAdmins. What is the future of the IT Pro in a DevOps &amp;amp; Cloudy world? with &lt;a href=&#34;https://twitter.com/jenstirrup&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Jennifer Stirrup&lt;/a&gt;
, &lt;a href=&#34;https://twitter.com/bakionur&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Baki Onur Okutucu&lt;/a&gt;
, &lt;a href=&#34;https://twitter.com/AmyKateNicho&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Amy Boyd&lt;/a&gt;
 and &lt;a href=&#34;https://twitter.com/TheOpsMgr&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Stephen Thair&lt;/a&gt;
. Should they learn to code, how should they make sure they keep up.&lt;/p&gt;
&lt;p&gt;Tomorrow I have a loads more sessions, including ones about mental health, Azure pipelines, more Kubernetes stuff and dealing with failure.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Yaml Builds on Azure DevOps</title>
      <link>https://www.funkysi1701.com/posts/2019/yaml-builds-on-azure-devops/</link>
      <pubDate>Thu, 31 Jan 2019 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2019/yaml-builds-on-azure-devops/</guid>
      <description>&lt;p&gt;I have been using Azure DevOps (Or VSTS or VSO etc) for a while now and one of the great features is doing automatic builds with every check-in. This is more commonly known as a CI (continuous integration) build.&lt;/p&gt;
&lt;p&gt;More recently I have started playing about with creating my build using YAML files instead of using the web user interface to create my build.&lt;/p&gt;
&lt;h2 id=&#34;why&#34;&gt;Why?&lt;a class=&#34;anchor ms-1&#34; href=&#34;#why&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You may wonder why go to the effort of learning the YAML syntax when you can just create the build in Azure DevOps and then forget about it.&lt;/p&gt;
&lt;p&gt;Mostly it is because the build changes over time and you shouldn’t just forget about it. If something changes over time then you might want to version control it, or look at a previous version.&lt;/p&gt;
&lt;p&gt;Lets say you create a pull request that replaces a .net 4.7 web service with a .net core web service. If you have a CI build this PR will fail because it won’t build. If you change the build first any other builds going on will fail. What you want in this case is the build to be associated with that branch or PR. Any builds before you merge this change in will continue to work and any after this change will also work.&lt;/p&gt;
&lt;h2 id=&#34;how&#34;&gt;How?&lt;a class=&#34;anchor ms-1&#34; href=&#34;#how&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;How do you get started with YAML builds? Well the first thing is to make sure that YAML builds are turned on, as I write this I believe they are still a feature you can turn on or off. Have a look in Preview features and make sure they are turned on.&lt;/p&gt;
&lt;p&gt;Next look at any of your existing builds and click the View YAML link. This will show you an example YAML file of your existing build. You could just save this as azure-pipelines.yml and checkin to the root of your project. You can also click the add new build pipeline option, this will give you some templates to start you off.&lt;/p&gt;
&lt;p&gt;The YAML file consists of a series of build steps usually called tasks, with a few settings before to configure things like parameters or build agents. Detailed docs about the syntax of the file can be found &lt;a href=&#34;https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=azure-devops&amp;amp;tabs=schema&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;here&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;For my mobile app my YAML files consist of downloading nuget packages, building the solution, building specific projects with desired settings, running powershell or other scripts to set things up and finally publishing the results of the build as artifacts so that they can be used in any releases.&lt;/p&gt;
&lt;h2 id=&#34;secure-it&#34;&gt;Secure It!&lt;a class=&#34;anchor ms-1&#34; href=&#34;#secure-it&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Avoid committing passwords and secure keys into source control. I have found you can upload secure files via Azure DevOps and then add a download secure files step at the start of your build. This allows the secure file to be used during the build but the contents of the file can’t be viewed by anyone with access to the source code.&lt;/p&gt;
&lt;p&gt;I find it often takes a bit of thinking about how to achieve this, but it is usually possible to keep keys and secrets secure.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Pwned Pass Update</title>
      <link>https://www.funkysi1701.com/posts/2019/pwned-pass-update/</link>
      <pubDate>Wed, 23 Jan 2019 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2019/pwned-pass-update/</guid>
      <description>&lt;p&gt;Its been a while since I first released Pwned Pass so lets have a look at where we are now.&lt;/p&gt;
&lt;p&gt;We are very close to 500 Downloads from &lt;a href=&#34;https://play.google.com/store/apps/details?id=pwnedpasswords.pwnedpasswords&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Google Play&lt;/a&gt;
 and we have recently smashed past 100 active installs, peaking at 116 and even now we are still over 100. I have had 9 reviews (6 x 5*, 2 x 1 * and a 4 *) which averages out at 4 *
&lt;img class=&#34;img-fluid&#34; alt=&#34;Alt Text&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2019/01/image.png?w=662&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;


Over Christmas I released a UWP version that can be found in the &lt;a href=&#34;https://www.microsoft.com/store/apps/9NM2WHNZTNLT&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Microsoft Store&lt;/a&gt;
. This has currently had 9 downloads and even had a download to windows mobile (someone out there still likes the platform!)
&lt;img class=&#34;img-fluid&#34; alt=&#34;Alt Text&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2019/01/image-1.png?w=662&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;


I have a fairly smooth deployment process using Azure DevOps. After every check in of code a build runs which compiles the UWP and Android versions. The build also increments the version numbers that is required to deploy to either of the app stores.&lt;/p&gt;
&lt;p&gt;Every successful build of the master branch will kick off a release to the Beta track of Google Play. If I am happy I then release to 10% of the Production track, which can then be increased to 100% (or halted). The release to Microsoft Store happens after the Beta track of Google Play. Only reason for this order is that there isn’t a beta area for UWP apps so I want to quickly test change on android before rolling out for windows.&lt;/p&gt;
&lt;p&gt;All these steps require confirmation by me before proceeding and often don’t get further than the beta track.&lt;/p&gt;
&lt;p&gt;A further development is that I have open sourced the source code to &lt;a href=&#34;&#34;&gt;github&lt;/a&gt;
 do take a look if you are curious or want to contribute. With the purchase by Microsoft there are easy ways to connect github repositories to Azure DevOps. Once I create a Pull Request in github it creates a build in Azure DevOps and all the build and release steps can happen.&lt;/p&gt;
&lt;p&gt;I am still not 100% sure if I want to keep my bug and issue tracking in github or Azure DevOps as both have features for doing so.&lt;/p&gt;
&lt;p&gt;One future improvement I want to make is to automate the creation of screenshots. When I create a new feature and it gets checked in. I would like to automatically created screenshots of the key pages and submit them to the different app stores. Currently I am not sure if this is possible or how to go about it. I have some ideas to experiment with so we will see what I can do.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Lets see what 2019 can do!</title>
      <link>https://www.funkysi1701.com/posts/2019/lets-see-what-2019-can-do/</link>
      <pubDate>Tue, 01 Jan 2019 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2019/lets-see-what-2019-can-do/</guid>
      <description>&lt;p&gt;This is my annual lets make some goals for the new year blog post. So in no particular order.&lt;/p&gt;
&lt;h2 id=&#34;improve-house&#34;&gt;Improve House&lt;a class=&#34;anchor ms-1&#34; href=&#34;#improve-house&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I can’t outdo last years goal of buying a house but I can continue to make efforts to improve it. I was going to put something about decorating or doing something to our bedrooms, however today I spotted a hole in the roof so this may well absorb most of my home improvement budget.&lt;/p&gt;
&lt;h2 id=&#34;connect-with-local-area&#34;&gt;Connect with local area&lt;a class=&#34;anchor ms-1&#34; href=&#34;#connect-with-local-area&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Since we moved in October we haven’t really connected with our local area yet. My only interaction with my neighbours was when my car blocked his drive!&lt;/p&gt;
&lt;p&gt;I am going to make efforts to change this in 2019. I don’t exactly know how yet, but I have some ideas. My son starts nursery and later school this year so could be one way to meet other parents and teachers. I want to connect with a local church, so far this hasn’t happened so need to make more effort with this. There are other local groups that put on child friendly events which would be good to attend.&lt;/p&gt;
&lt;h2 id=&#34;lightning-talk&#34;&gt;Lightning Talk&lt;a class=&#34;anchor ms-1&#34; href=&#34;#lightning-talk&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I failed last year to do this so it is back on my list. I know I must have stuff of value to share so going to try again on this.&lt;/p&gt;
&lt;p&gt;A lightning talk is a very short talk or presentation given at a conference or user group. I am not a natural public speaker so this is a step out of my comfort zone, however I am going to start small and see what happens.&lt;/p&gt;
&lt;p&gt;##Family Holiday
As always we Fosters are going to have a holiday in the summer and have some quality family time. I also want to take the boys to London for a weekend.&lt;/p&gt;
&lt;h2 id=&#34;blogging&#34;&gt;Blogging&lt;a class=&#34;anchor ms-1&#34; href=&#34;#blogging&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This blog has taken a bit of a backseat in 2018 so I want to try and refocus it for 2019. My commitment is for 12 blog posts in 2019, that is one a month. It doesn’t sound like much but I know how easily life can get in the way.&lt;/p&gt;
&lt;p&gt;Having said that my log has had record views this year. 7159 views. However I believe this number to be incorrect and has been inflated by my app development and some of the automated processes taking place.&lt;/p&gt;
&lt;h2 id=&#34;routine&#34;&gt;Routine&lt;a class=&#34;anchor ms-1&#34; href=&#34;#routine&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Last goal is to try a get more of a routine going. With two small boys, one of which is starting school in September a routine is going to be essential and will allow all of us all a chance to get more things done.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Looking back at 2018</title>
      <link>https://www.funkysi1701.com/posts/2018/looking-back-at-2018/</link>
      <pubDate>Thu, 27 Dec 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2018/looking-back-at-2018/</guid>
      <description>&lt;p&gt;As 2018 starts to draw to a close let’s look at some of the highlights from the past year.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;New Home - I started 2018 with the goal of buying my own home and I managed it. At the end of October I actually moved in but it was months of looking at houses, speaking to estate agents, saving, packing and unpacking. There is more I want to do to my home in 2019 so this is only really the beginning.&lt;/li&gt;
&lt;li&gt;New Job - Another goal was to kick my career up a notch and this happened in June. It has been great working as part of a large team and I have learnt loads, there is much more I want to learn and contribute to so 2019 should be great on that front.&lt;/li&gt;
&lt;li&gt;New Car - Not a goal that I achieved as unfortunately in October I was involved in a car accident, no one was seriously hurt but this was a horrible experience to go through. My car was written off which gave me an excuse to buy a new car.&lt;/li&gt;
&lt;li&gt;See more of family was a goal, I am not sure if I really achieved this. However family have been around loads for us during our move and we do live closer so hopefully I can work on this some more.&lt;/li&gt;
&lt;li&gt;Celebrate 5 years of marriage. It hasn&amp;rsquo;t been an easy year for me and the wife due to moving house and all the stress that involved plus with two children she was diagnosed with Postnatal Depression which as a family we are still dealing with. All that said we had a fab weekend away and we so need to do something similar again soon.&lt;/li&gt;
&lt;li&gt;Family. 2018 has included many great times with my two boys. It&amp;rsquo;s been amazing seeing them grow, in September we had a thanksgiving service for them and in July we had our annual holiday.&lt;/li&gt;
&lt;li&gt;Lightning Talk. This is the only thing I mentioned as a goal that didn&amp;rsquo;t happen, it&amp;rsquo;s on my 2019 list so hopefully I can kick myself into action but with everything else I achieved something had to slip.   &lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>Running SQL Server on a Linux Container using Docker for Windows</title>
      <link>https://www.funkysi1701.com/posts/2018/running-sql-server-on-a-linux-container-using-docker-for-windows/</link>
      <pubDate>Mon, 05 Nov 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2018/running-sql-server-on-a-linux-container-using-docker-for-windows/</guid>
      <description>&lt;p&gt;Recently I have been investigating what all the fuss is about Docker and it has been well worth my time as Docker is pretty awesome for automating stuff.&lt;/p&gt;
&lt;p&gt;My development environment has typically required installing SQL Server. SQL is a bit of a beast with lots of options and takes time to setup how you want.&lt;/p&gt;
&lt;p&gt;However since Microsoft have now created a version of SQL Server that runs on Linux you can run SQL Server in a Linux container with only a few commands.&lt;/p&gt;
&lt;p&gt;I am going to assume you already have Docker for windows installed on your development machine. If not head over to &lt;a href=&#34;https://docs.docker.com/docker-for-windows/install/#where-to-go-next&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Docker&lt;/a&gt;
 and find out how.&lt;/p&gt;
&lt;p&gt;The Microsoft guide to setting up SQL Server in a Linux container can be found &lt;a href=&#34;https://docs.microsoft.com/en-us/sql/linux/quickstart-install-connect-docker?view=sql-server-2017&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;here&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;First you need to download the image. In a powershell window run:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;docker pull mcr.microsoft.com/mssql/server:2017-latest
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This downloads the latest sql server image.&lt;/p&gt;
&lt;p&gt;To run this image run the following:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;docker run -e &amp;#34;ACCEPT_EULA=Y&amp;#34; -e &amp;#34;SA_PASSWORD=password&amp;#34;
-p 1433:1433 --name sql
-d mcr.microsoft.com/mssql/server:2017-latest
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;To run a SQL Server image you are required to accept the terms and conditions and set a default sa password. These are added as environment variables with the -e flag.&lt;/p&gt;
&lt;p&gt;You also need to set the ports that your container will run on (1433 is the default SQL port) and give your container a name, in this case &amp;ldquo;sql&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;If you have already installed SQL Server you will not be able to run the container on the same port as your local install. To solve this you can select a different port.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;docker run -e &amp;#34;ACCEPT_EULA=Y&amp;#34; -e &amp;#34;SA_PASSWORD=password&amp;#34; 
-p 1434:1433 --name sql
-d mcr.microsoft.com/mssql/server:2017-latest
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;-p 1434:1433 maps the 1433 port on the container to port 1434 of your local environment.&lt;/p&gt;
&lt;p&gt;Once you have run this command you can connect SQL Server Management Studio (SSMS) to (local) or (local),1434 if you are using a different port using the credentials you provided and execute any SQL you like.&lt;/p&gt;
&lt;p&gt;If your development environment requires windows authentication this of course is not for you, if it doesn’t you are good to go.&lt;/p&gt;
&lt;p&gt;The development environment I have been using has various powershell scripts for setting things up. These assume windows auth. However I have adapted them to take custom credentials.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$credential = Get-Credential $server.ConnectionContext.LoginSecure=$false 
$server.ConnectionContext.set_Login($credential.UserName) 
$server.ConnectionContext.set_SecurePassword($credential.Password)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The Get-Credential command creates a dialog where you can enter SQL credentials, this is then stored in a variable and used in the rest of the script.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How do I restore a backup file to my container?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Run:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;docker exec -it sql mkdir /var/opt/mssql/backup
docker cp database.bak sql:/var/opt/mssql/backup
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This creates a backup folder and copies a backup file from your local environment to the container. You can then use management studio to restore the backup file (or you could write a sql script to do it). One thing to note when restoring databases, make sure the files are restored to Linux locations not windows locations.&lt;/p&gt;
&lt;p&gt;The only issues I have encountered so far are the lack of support for SSIS packages and no windows auth. There are sql server windows images available which I haven’t tried yet which may work better with some of these options.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>2018 The Story So far</title>
      <link>https://www.funkysi1701.com/posts/2018/2018-the-story-so-far/</link>
      <pubDate>Sat, 28 Jul 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2018/2018-the-story-so-far/</guid>
      <description>&lt;p&gt;Remember me? I used to write blog posts but somehow life got in the way. So much has happened this year, lets have a look at my &lt;a href=&#34;https://www.funkysi1701.com/2018/lets-see-what-2018-can-do&#34;&gt;goals&lt;/a&gt;
 for 2018 and see how far we have got with them.&lt;/p&gt;
&lt;h3 id=&#34;buy-a-house&#34;&gt;Buy a house&lt;a class=&#34;anchor ms-1&#34; href=&#34;#buy-a-house&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;My first goal for 2018 was to buy a house. Well so much progress has been made with this goal.&lt;/p&gt;
&lt;p&gt;We looked at a few houses, and have made an offer, had it accepted and are waiting for the last few things to get arranged before we start arranging to move in.&lt;/p&gt;
&lt;p&gt;The location we decided upon was &lt;a href=&#34;https://www.google.co.uk/maps/place/Thorne,&amp;#43;Doncaster/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Thorne&lt;/a&gt;
. This is about an hour from York where most of our friends are and my wife has lived all her life, and also an hour from where my family live. I have tried my best to balance location and size of property and we think our new home is going to be a good balance but only time will tell.&lt;/p&gt;
&lt;p&gt;I have a bit of a mammoth time ahead of me getting everything we own packed up and moved to our new home so wish me luck, but we will get there it is just going to be hard work.&lt;/p&gt;
&lt;h3 id=&#34;new-job&#34;&gt;New Job&lt;a class=&#34;anchor ms-1&#34; href=&#34;#new-job&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In June 2018 I started a new job. This was slightly later than I had hoped but I believe it has been worth the wait.&lt;/p&gt;
&lt;p&gt;My new job has lots of perks. Finish early on a Friday (1pm), On site canteen, Cool air-conditioned office, Flexible working hours, Part of a big development team.&lt;/p&gt;
&lt;p&gt;The main benefit is that I am part of a big development team. I have a huge list of things to learn both in terms of technology and how large development teams function. The team is about to finish the first sprint that I have contributed to. My contributions have been very small. A bug fix here, a tweak of an API there. But the important thing is that I am making a contribution and learning along the way.&lt;/p&gt;
&lt;p&gt;I have also started asking questions about deployment and how this could be automated. Something that interests me, especially with the sysadmin and devops background. I have been tasked with learning &lt;a href=&#34;https://docs.docker.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;docker&lt;/a&gt;
, so expect some blog posts on this topic in the near future.&lt;/p&gt;
&lt;h3 id=&#34;see-more-of-family&#34;&gt;See more of family&lt;a class=&#34;anchor ms-1&#34; href=&#34;#see-more-of-family&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This one I am going to count as a miss. I have seen family a few times this year, but my efforts have been more on the first two items in this list. Hopefully this will change as things settle down.&lt;/p&gt;
&lt;h3 id=&#34;celebrate-5-years-of-marriage&#34;&gt;Celebrate 5 years of Marriage&lt;a class=&#34;anchor ms-1&#34; href=&#34;#celebrate-5-years-of-marriage&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Me and the wife had a great weekend away to celebrate our wedding anniversary.&lt;/p&gt;
&lt;h3 id=&#34;celebrate-my-two-children&#34;&gt;Celebrate my two children&lt;a class=&#34;anchor ms-1&#34; href=&#34;#celebrate-my-two-children&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Not happened yet but it is booked and we just need to arrange a few more details.&lt;/p&gt;
&lt;h3 id=&#34;lightning-talk&#34;&gt;Lightning Talk&lt;a class=&#34;anchor ms-1&#34; href=&#34;#lightning-talk&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I have made no effort to do a talk and this is going to be a goal for 2019 I think. Most of the reason is concentrating on the other areas above, but also because I am not a natural speaker and I don’t like stepping out of my comfort zone. But I will do it, I just need to wait for other things to calm down a bit first.&lt;/p&gt;
&lt;h3 id=&#34;family-holiday&#34;&gt;Family Holiday&lt;a class=&#34;anchor ms-1&#34; href=&#34;#family-holiday&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;We had a great week away at the start of July. The weather was really great (and still is) and we had lots of time doing things as a family.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Casting and Converting between types</title>
      <link>https://www.funkysi1701.com/posts/2018/casting-and-converting-between-types/</link>
      <pubDate>Mon, 07 May 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2018/casting-and-converting-between-types/</guid>
      <description>&lt;p&gt;Recently I was asked how to convert a number to a string. Let&amp;rsquo;s look at a few ways of approaching this problem.&lt;/p&gt;
&lt;p&gt;Most objects in c# have a method called ToString() which displays the string representation of that object. This is because of inheritance, all objects inherit from System.Object which defines ToString().&lt;/p&gt;
&lt;p&gt;Int32 is a struct so it inherits from System.ValueType which also inherits from System.Object&lt;/p&gt;
&lt;p&gt;so in code&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; a = &lt;span style=&#34;color:#ae81ff&#34;&gt;9&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; b = a.ToString();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now let&amp;rsquo;s look at the reverse. However the reverse runs the risk of throwing an error, let&amp;rsquo;s look at why.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; b = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;9&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; c = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;a&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; d = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;two&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;All are valid strings but only one can be converted to a number. Use the TryParse method to convert to a number.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;.TryParse(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;9&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;out&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; e);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;TryParse will not throw an exception if the conversion fails, if it succeeds variable e will contain the result. Note an earlier version of c# required you to define the out parameter before using it with TryParse.&lt;/p&gt;
&lt;p&gt;int.Parse exists to do the same thing however it will throw exceptions if a conversion is not possible. The same is true if you use Convert.ToInt32(&amp;ldquo;two&amp;rdquo;);&lt;/p&gt;
&lt;h2 id=&#34;casting&#34;&gt;Casting&lt;a class=&#34;anchor ms-1&#34; href=&#34;#casting&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Casting is a way to explicitly telling the compiler that a type is actually another type and you are aware data loss will occur.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; x = &lt;span style=&#34;color:#ae81ff&#34;&gt;4.5&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y = (&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;)x;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;However it is not possible to cast a string to a number format as a string can contain any character not just number characters.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Let’s Encrypt is awesome</title>
      <link>https://www.funkysi1701.com/posts/2018/lets-encrypt-is-awesome/</link>
      <pubDate>Mon, 30 Apr 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2018/lets-encrypt-is-awesome/</guid>
      <description>&lt;p&gt;Let’s Encrypt is a free way to get a SSL certificate onto your website and until recently I had never tried it. It is very easy and I think it is awesome.&lt;/p&gt;
&lt;p&gt;IIS is the web server software the Microsoft include with Windows 10 and Windows Server. I have it installed on my laptop and it displays the default IIS page.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2018/04/iis.jpg?resize=768%2C464&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;It is not really a good idea to host websites on your laptop, use a dedicated web server, or host with a hosting company, however the techniques are the same and it gives me something to write about!&lt;/p&gt;
&lt;p&gt;In order to point a domain name at what IIS on my machine was serving up I did the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Do a google search for “whats my IP”, this will return your public IP. Most residential ISPs use dynamic IPs so it may change over time, (which is another reason not to host a website on your laptop!)&lt;/li&gt;
&lt;li&gt;Add an A record on a domain with the IP address you have just got&lt;/li&gt;
&lt;li&gt;Your public IP most likely points at your router not your laptop so enable port forwarding of port 80 and port 443 to the internal IP of your laptop (something like 192.168.0.11 etc)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now comes the fun Let’s Encrypt stuff!&lt;/p&gt;
&lt;p&gt;First you need a Let’s Encrypt client, there are a lot of them out there mostly for linux flavours, however a bit of googling found a windows one. Go to &lt;a href=&#34;https://github.com/PKISharp/win-acme/releases&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://github.com/PKISharp/win-acme/releases&lt;/a&gt;
 and download the zip file and unzip it.&lt;/p&gt;
&lt;p&gt;Run the executable from the zip file and follow the onscreen prompts.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2018/04/letsencrypt.jpg?resize=768%2C480&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Press N to create a new certificate.&lt;/p&gt;
&lt;p&gt;Then press 1 to bind to single website found in your IIS setup&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2018/04/letsencrypt2.jpg?resize=768%2C686&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;And now magically Let’s Encrypt knows what you have setup in IIS.&lt;/p&gt;
&lt;p&gt;Now all you need to do is enter an email address incase a renewal fails and agree to the let’s encrypt terms and you are all setup.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2018/04/letsencrypt3.jpg?resize=768%2C920&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;How awesome and easy is that for getting your websites working with a SSL certificate. If you have IIS configured on a server, give it a try and you can SSL all your things.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>DNS for Developers</title>
      <link>https://www.funkysi1701.com/posts/2018/dns-for-developers/</link>
      <pubDate>Mon, 09 Apr 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2018/dns-for-developers/</guid>
      <description>&lt;p&gt;DNS is the backbone of the internet and as such I believe every developer should know something about the basics and not just leave it for the sysadmin to sort.&lt;/p&gt;
&lt;h3 id=&#34;what-is-dns&#34;&gt;What is DNS?&lt;a class=&#34;anchor ms-1&#34; href=&#34;#what-is-dns&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;DNS or Domain Name System is what translates Domain names to IP addresses and vice versa.&lt;/p&gt;
&lt;h3 id=&#34;wait-what-is-an-ip-address-and-what-are-domain-names&#34;&gt;Wait what is an IP address and what are domain names?&lt;a class=&#34;anchor ms-1&#34; href=&#34;#wait-what-is-an-ip-address-and-what-are-domain-names&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;You do realise this is a developer blog? An IP address is a unique address on the internet and a domain name is a user friendly label for one or more of these.&lt;/p&gt;
&lt;p&gt;An example might be google.com which for me resolves to 216.58.204.14&lt;/p&gt;
&lt;h3 id=&#34;how-it-works&#34;&gt;How it works&lt;a class=&#34;anchor ms-1&#34; href=&#34;#how-it-works&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2018/04/dns-rev-1.gif?resize=360%2C320&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

When your browser makes a request to google.com it makes a request to your ISPs DNS Servers. This resolves google.com to 216.58.204.14&lt;/p&gt;
&lt;p&gt;In more detail your ISPs DNS server will forward the DNS query to another DNS server and will cache the results for a set amount of time. This is the TTL or Time To Live. Next time the ISP DNS Server will be able to reply directly without needing to forward requests.&lt;/p&gt;
&lt;p&gt;This forwarding and caching is what makes making a DNS change not instantaneous. The TTL needs to be reached so that no results are still being fetched from the cache of DNS servers across the globe.&lt;/p&gt;
&lt;h3 id=&#34;dns-records&#34;&gt;DNS Records&lt;a class=&#34;anchor ms-1&#34; href=&#34;#dns-records&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Now we know roughly how DNS works let’s look at the most common type of records&lt;/p&gt;
&lt;h4 id=&#34;a&#34;&gt;A&lt;a class=&#34;anchor ms-1&#34; href=&#34;#a&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;A (Host) records are the most simple records which translate domain names to IPs&lt;/p&gt;
&lt;p&gt;eg &lt;a href=&#34;https://www.google.com&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;www.google.com&lt;/a&gt;
 to 216.58.204.14&lt;/p&gt;
&lt;h4 id=&#34;cname&#34;&gt;CNAME&lt;a class=&#34;anchor ms-1&#34; href=&#34;#cname&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;A CNAME (Canonical Name) record is different to an A record in that it maps a domain name to another domain name when no A record exists.&lt;/p&gt;
&lt;p&gt;eg &lt;a href=&#34;https://www.google.com&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;www.google.com&lt;/a&gt;
 to somethingelse.google.com&lt;/p&gt;
&lt;p&gt;Typically Azure makes use of CNAMEs for many of its services especially adding a custom domain name&lt;/p&gt;
&lt;h4 id=&#34;mx&#34;&gt;MX&lt;a class=&#34;anchor ms-1&#34; href=&#34;#mx&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;MX stands for Mail Exchange and is used for configuring email&lt;/p&gt;
&lt;h4 id=&#34;name-server&#34;&gt;Name Server&lt;a class=&#34;anchor ms-1&#34; href=&#34;#name-server&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Every domain has a number of Name Servers which tells you what servers control the DNS settings for that domain. If you change your Name Servers then the new Name servers will be where you can change your DNS settings.&lt;/p&gt;
&lt;p&gt;If you want to use a service like &lt;a href=&#34;https://dnsimple.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;DNSimple&lt;/a&gt;
 instead of &lt;a href=&#34;https://www.123-reg.co.uk/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;123reg&lt;/a&gt;
 or where ever you registered your domain then all you need to do is change your Name servers.&lt;/p&gt;
&lt;h4 id=&#34;aaaa&#34;&gt;AAAA&lt;a class=&#34;anchor ms-1&#34; href=&#34;#aaaa&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Like A record but for ipv6&lt;/p&gt;
&lt;h3 id=&#34;what-next&#34;&gt;What next?&lt;a class=&#34;anchor ms-1&#34; href=&#34;#what-next&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Want to put some different DNS records into practise? Buy a domain name and publish some content to it. Check out my previous post about &lt;a href=&#34;https://www.funkysi1701.com/creating-dns-records-programmatically&#34;&gt;programmatically adding records&lt;/a&gt;
. Want an SSL certificate? Get a wildcard one and then you can apply it to any subdomain you add to your domain.&lt;/p&gt;
&lt;p&gt;If you have a new website you want to publish consider which of the following is better:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.example.com/newsite&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://www.example.com/newsite&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://newsite.example.com&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://newsite.example.com&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;I much prefer the second option, it looks cleaner, there is no potential conflict with the parent site, no subfolder issues between production and development.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Code Reviews</title>
      <link>https://www.funkysi1701.com/posts/2018/codereviews/</link>
      <pubDate>Mon, 02 Apr 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2018/codereviews/</guid>
      <description>&lt;p&gt;Reviewing code is a great habit to get into. Code reviews help share knowledge between your team members and help catch bugs before they get into production. But how do you get into the habit of reviewing and avoid the we don’t have time to do this mentality?&lt;/p&gt;
&lt;p&gt;Visual Studio Team Services (VSTS) has some great options that can help make code reviews second nature.&lt;/p&gt;
&lt;h4 id=&#34;pull-requests&#34;&gt;Pull Requests&lt;a class=&#34;anchor ms-1&#34; href=&#34;#pull-requests&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;A lot of source control systems have the concept of pull requests. This is where you request others to review your code usually in a branch and if they approve it, merge it into a main branch.&lt;/p&gt;
&lt;p&gt;To create a pull request in VSTS go to the Code section and select Pull Requests. Often VSTS will make a suggestion of what branch to make a pull request for, if you don’t see this just click the New Pull request button.&lt;/p&gt;
&lt;p&gt;Select a branch you want to merge from and a branch that should be merged into (usually you merge into master from a feature branch). Give your pull request a title and description and select who should review your code, this can either be an individual or a group of people. You can also review all the changes that will be reviewed so you can make any last minute changes before it is reviewed.&lt;/p&gt;
&lt;p&gt;Now if you are anything like me you want your code merged in as soon as you have created your pull request and there is nothing stopping you reviewing your own code and clicking approve and merge on your own pull request. However &lt;a href=&#34;https://docs.microsoft.com/en-us/vsts/git/branch-policies?view=vsts&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;branch policies&lt;/a&gt;
 is a way around this problem.&lt;/p&gt;
&lt;h4 id=&#34;branch-policies&#34;&gt;Branch Policies&lt;a class=&#34;anchor ms-1&#34; href=&#34;#branch-policies&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;Branch Policy&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2018/04/save-policy-changes.png?resize=599%2C901&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Branch policies allow you to specify how your code gets merged in.&lt;/p&gt;
&lt;p&gt;Go to the list of branches in VSTS and select branch policy and you will see a whole host of options to customise the merge process. If you do this on the master branch you will not be able to commit any changes to master without it going through a pull request.&lt;/p&gt;
&lt;p&gt;The first option enables you to select how many reviewers are needed on your code. If no one else works on your project best not setting this, but for everyone else setting at least one person to review your code is a great practice.&lt;/p&gt;
&lt;p&gt;Next you can ensure that your pull request is linked to a work item, this helps keep ensure you are actually fixing issues and not just making change for the sake of it.&lt;/p&gt;
&lt;p&gt;Check for comment resolution is a good setting to enable. This ensures that if your reviewer has commented about you needing to change this line here, it ensures that you do.&lt;/p&gt;
&lt;p&gt;Enforce merge strategy allows you to choose between fast forward merge or squash merge.&lt;/p&gt;
&lt;p&gt;Build validation enables the code to be built using a build definition you have configured. This is a great way to check code builds or tests pass before it gets merged in.&lt;/p&gt;
&lt;p&gt;The last two options allow you to specify code reviewers and third party external services.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Android Development Options</title>
      <link>https://www.funkysi1701.com/posts/2018/android-development-options/</link>
      <pubDate>Mon, 26 Mar 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2018/android-development-options/</guid>
      <description>&lt;p&gt;A friend asked me how to get started in Android Development and I thought I might have a go at answering that question here.&lt;/p&gt;
&lt;p&gt;I am by no means an expert in Android development, I do have an app in the play store so I know something.&lt;/p&gt;
&lt;h4 id=&#34;manifest-file&#34;&gt;Manifest File&lt;a class=&#34;anchor ms-1&#34; href=&#34;#manifest-file&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;This is probably the easiest option and also doesn’t actually create an android app so I am not sure if it should be included in this list of not.&lt;/p&gt;
&lt;p&gt;If you have a website and you want to create an app for that you could just create a manifest file and add this to your website.&lt;/p&gt;
&lt;p&gt;Once your website has a manifest file, if you visit your website using a mobile phone or tablet you will get the option to add a shortcut to the home screen. You then have an app like experience in that you can click an icon to launch your website.&lt;/p&gt;
&lt;p&gt;A manifest file is a simple text file which specifies a few settings like the icon size, filename, what page loads when clicked and name of your “app”&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://developers.google.com/web/fundamentals/web-app-manifest/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;More information&lt;/a&gt;
&lt;/p&gt;
&lt;h4 id=&#34;visual-studio&#34;&gt;Visual Studio&lt;a class=&#34;anchor ms-1&#34; href=&#34;#visual-studio&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;This is the option I know most about as is what I have used.&lt;/p&gt;
&lt;p&gt;If you are familiar with Visual Studio you can use the Xamarin Forms software to create your app in C#. Xamarin Forms allows you to easily create cross platform apps that run on Android, IOS and windows phone. So far I have only experimented with Android but it should be relatively easy to extend my code to run on other platforms.&lt;/p&gt;
&lt;p&gt;Xamarin Forms allows you to write one a single codebase that can be compiled to run on the different platforms. Xamarin requires the use of XAML a XML like markup language for designing UI elements.&lt;/p&gt;
&lt;p&gt;More Information on &lt;a href=&#34;https://www.visualstudio.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Visual Studio&lt;/a&gt;
, &lt;a href=&#34;https://www.xamarin.com/forms&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Xamarin Forms&lt;/a&gt;
&lt;/p&gt;
&lt;h4 id=&#34;android-studio&#34;&gt;Android Studio&lt;a class=&#34;anchor ms-1&#34; href=&#34;#android-studio&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;I don’t know much about this option so do correct me if I don’t get the details correct.&lt;/p&gt;
&lt;p&gt;Android Studio can be downloaded from Google this allows you to create java code to run directly on an android device. From what I know this is fairly similar experience to Visual Studio but instead of writing your code in C# you use Android Studio and write it directly in java.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://developer.android.com/studio/index.html&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;More information&lt;/a&gt;
&lt;/p&gt;
&lt;h4 id=&#34;cordova&#34;&gt;Cordova&lt;a class=&#34;anchor ms-1&#34; href=&#34;#cordova&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Cordova allows you to use HTML, CSS and javascript to create cross platform apps. I have no idea why I haven’t heard of this technology until today as it sounds very flexible especially if you know a little bit of javascript.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://cordova.apache.org/docs/en/latest/guide/overview/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;More information&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;To summarize there  are lots of different options available to create an android app. What you choose depends on what you want to build, what language and experience you have and if your app needs to be cross platform.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Tips for Developing Yourself</title>
      <link>https://www.funkysi1701.com/posts/2018/tips-for-developing-yourself/</link>
      <pubDate>Mon, 19 Mar 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2018/tips-for-developing-yourself/</guid>
      <description>&lt;p&gt;For a while I have been mentoring a friend and I thought I might share some top tips I have implemented in my career so far.&lt;/p&gt;
&lt;h5 id=&#34;hard-work&#34;&gt;Hard Work&lt;a class=&#34;anchor ms-1&#34; href=&#34;#hard-work&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;At school I was told: “&lt;em&gt;Only in the dictionary does Success come before Work&lt;/em&gt;“. Yes it is a bit of a corny saying however it has stuck in my head and it’s true. If you want to get anywhere you need to work at it. For many years I just drifted along, but as soon as I knuckled down and worked hard my career started going somewhere.&lt;/p&gt;
&lt;h5 id=&#34;write-a-blog&#34;&gt;Write a Blog&lt;a class=&#34;anchor ms-1&#34; href=&#34;#write-a-blog&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;Writing is an important skill that you need to work at to improve. If you commit to writing one blog post a week this will help to improve this skill. Even after 150+ blog posts I still feel I need to improve. Not only that it will also help others learn something from you and shows a willingness to contribute to the community. If a Hiring Manager reads your blog he can see some of the stuff you know or care about and may help give you the edge over more experienced candidates.&lt;/p&gt;
&lt;h5 id=&#34;soft-skills&#34;&gt;Soft Skills&lt;a class=&#34;anchor ms-1&#34; href=&#34;#soft-skills&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;This is one I need to work on but you should concentrate on the so called “&lt;em&gt;Soft Skills&lt;/em&gt;“. Soft Skills are the skills you have for dealing with others. Are you good at talking to people? Or good at getting requirements out of business owners? If so you have some soft skills, don’t underestimate the value that these bring to a team and keep developing them.&lt;/p&gt;
&lt;h5 id=&#34;build-a-side-project&#34;&gt;Build a Side Project&lt;a class=&#34;anchor ms-1&#34; href=&#34;#build-a-side-project&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;Start building a side project, it doesn’t matter what it is but start building something. I started building a Xamarin app but I have learnt loads of other connected things while doing this, ViewModels, APIs, Build and Deployment processes, Azure Functions. It also gives you ammunition for things to blog about. If you are short of ideas try solving a problem or rebuild something you use.&lt;/p&gt;
&lt;h5 id=&#34;use-your-spare-time&#34;&gt;Use your spare time&lt;a class=&#34;anchor ms-1&#34; href=&#34;#use-your-spare-time&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;During the day there are moments you can reclaim for learning stuff. There are lots of &lt;a href=&#34;https://www.funkysi1701.com/podcasts&#34;&gt;podcast&lt;/a&gt;
 which discuss useful development topics, listen to these while driving to work. Subscribe to &lt;a href=&#34;https://www.funkysi1701.com/pluralsight&#34;&gt;pluralsight&lt;/a&gt;
 and listen to this while washing up. Don’t get too concerned with learning everything, however think how much more you are learning than not listening at all.&lt;/p&gt;
&lt;h5 id=&#34;im-not-ready&#34;&gt;I’m not ready!&lt;a class=&#34;anchor ms-1&#34; href=&#34;#im-not-ready&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;We are never ready to take that next step, it is so easy to make excuses like I need to learn x, or know y. The only way to know if you are ready is to try and to keep trying. Iterate as you go so you keep improving yourself. If you wait before you start trying you will end up waiting forever. If you start trying now you will make some small progress and have a better idea of what you need to do to achieve your goals.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Heroes</title>
      <link>https://www.funkysi1701.com/posts/2018/heroes/</link>
      <pubDate>Fri, 16 Mar 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2018/heroes/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Who was your hero growing up?&lt;/strong&gt; Mine was Stephen Hawking.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;Stephen Hawking&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2018/03/Hawking-ZeroG_web-1.jpg?resize=662%2C268&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What is a hero?&lt;/strong&gt; A lot is said in the media about “Heroes”. Often the sportsperson of the hour is described as a hero. I don’t like this definition and I think there is far more to being a hero than that. One definition I saw describes a hero as &lt;em&gt;A person who is admired for their courage, outstanding achievements, or noble qualities.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why Hawking?&lt;/strong&gt; As a kid I thought I was pretty smart (Not really just above average), I liked Star Trek and science so Hawking was a pretty obvious choice. I remember reading all about Hawking and his life fascinated me. A brilliant man was struck down by motor neurone disease in his early twenties, however this did not stop him and he completed his doctorate and became the famous physicist we all know and love.&lt;/p&gt;
&lt;p&gt;My physics career was fairly short lived ending with an undergraduate course at University of York, however I really enjoyed learning the concepts that he described about space and time and was definitely a driving factor for me to learn as much as I did about Physics.&lt;/p&gt;
&lt;p&gt;How heroic is it to be given 2 years to live and then not only survive but to expand our understanding of the universe without being able to speak or move without the aid of technology?&lt;/p&gt;
&lt;p&gt;I can not imagine what it must be like to not be able to communicate without the use of a computer, but this has been Stephen Hawkings world for over 30 years. His computer system has undergone various upgrades over the years however his synthetic computer voice has continued as he identified with it and prefered it.&lt;/p&gt;
&lt;p&gt;Stephen Hawking had an immense intellect, I would probably describe him as one of the cleverest people on the planet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Who are your heroes?&lt;/strong&gt; What kind of person is your hero, is it a scientist or engineer? The world contains some very clever people who will inspire and excite young people to strive towards something. I am hopeful that my sons can be inspired even if it’s only a small way by someone like Stephen Hawking.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>New version of Pwned Pass</title>
      <link>https://www.funkysi1701.com/posts/2018/new-version-pwned-pass/</link>
      <pubDate>Mon, 05 Mar 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2018/new-version-pwned-pass/</guid>
      <description>&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;Pwned Pass&#34; src=&#34;https://lh3.googleusercontent.com/qZTLiWRfQwS7pT6gExLMTvU1pl8NtTU-kbeoSzD68p1D-EPY3Pg7cz2AN66QJpTTp1c=h900-rw&#34; loading=&#34;lazy&#34;
  
   /&gt;

A new version of Pwned Pass is available from &lt;a href=&#34;https://play.google.com/store/apps/details?id=pwnedpasswords.pwnedpasswords&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Google Play&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;A couple of weeks ago &lt;a href=&#34;https://www.troyhunt.com/ive-just-launched-pwned-passwords-version-2/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Troy Hunt&lt;/a&gt;
 released V2 of Pwned Pass onto his &lt;a href=&#34;https://haveibeenpwned.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;haveibeenpwned&lt;/a&gt;
 website. There are now over half a billion passwords that have appeared in data breaches for you to search.&lt;/p&gt;
&lt;p&gt;This time Troy has included information about how many times a password has appeared in his data. So “password” returns a value of 3,303,003 so is a really, really bad choice of password to use. However the password “windows 10” has only appeared twice so is much better, however I would still recommend avoiding using it.&lt;/p&gt;
&lt;p&gt;One of the great things about the internet is that on the day of release I was tweeting Troy so I could get my android app updated to take advantage of these new features. I even helped him identify an issue with the documentation on his site. He has also kindly add a link to my app onto his website.&lt;/p&gt;
&lt;p&gt;That conversation and link has lead to a massive increase in app downloads. Before I was going steady on about 14 installs, now I have 86 active installs. I am not sure if this will increase anymore but if you are reading this because you downloaded my app, then thank you.&lt;/p&gt;
&lt;p&gt;My app has four main features:&lt;/p&gt;
&lt;p&gt;Password Check – this allows you to search a password and see if it has appeared in a data breach and also the number of times that password has appeared.&lt;/p&gt;
&lt;p&gt;Email Check – this allows you to search your email address and see which data breach it has been involved in.&lt;/p&gt;
&lt;p&gt;List of Data Breaches – this lists the data breaches from haveibeenpwned.com you can also sort by Date Added, Number of accounts and name.&lt;/p&gt;
&lt;p&gt;Calendar of Breaches – this shows a github like chart of what days breaches are added&lt;/p&gt;
&lt;p&gt;If you like my app do let me know. I have received a few ratings on google play it would be great to get a few more. If you want me to add a feature or have ideas of how I could improve it let me know as well.&lt;/p&gt;
&lt;p&gt;To download take a look at &lt;a href=&#34;https://play.google.com/store/apps/details?id=pwnedpasswords.pwnedpasswords&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://play.google.com/store/apps/details?id=pwnedpasswords.pwnedpasswords&lt;/a&gt;
&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Refactoring if statements</title>
      <link>https://www.funkysi1701.com/posts/2018/refactoringifstatements/</link>
      <pubDate>Mon, 26 Feb 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2018/refactoringifstatements/</guid>
      <description>&lt;p&gt;The code base I am working on contains a huge if block. By huge I mean 77 if statements one after the other, each if checks to see what page id you are on and loads different content. This is not easy to maintain and I want to refactor it.&lt;/p&gt;
&lt;p&gt;One option would be to replace the if statements with a switch block. However this is just as unmanageable as the huge if block. Lets look at a better option.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Polymorphism&lt;/strong&gt; is where you create a base class and then create sub classes from it. In my case I created an interface IPage with a single method CreateContent.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;IPage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; CreatePageContent(); 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and then create 77 classes for each page which implemented this single method.&lt;/p&gt;
&lt;p&gt;Now comes the fun bit how do I call the correct page class from my original code?&lt;/p&gt;
&lt;p&gt;I created a dictionary than maps page ids to the class names.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; Dictionary&amp;lt;PageIds, Type&amp;gt; PageIdToClass = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Dictionary&amp;lt;PageIds, Type&amp;gt;() 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    PageIds.HomePage, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;typeof&lt;/span&gt;(HomePage) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    PageIds.ContactPage, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;typeof&lt;/span&gt;(ContactPage) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;//etc &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is the one step I am not 100% happy with as I think it may be possible to remove or simplify this step.&lt;/p&gt;
&lt;p&gt;Now I have a way to map ids to classes I can write a class to do this.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MyPage&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  IPage _repo; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; MyPage(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; pageId) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    PageIds p = (PageIds)pageId; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Type t = PageIdToClass[p]; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ConstructorInfo constructor = t.GetConstructor(&lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Type[] { }); 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    _repo = (IPage)constructor.Invoke(&lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;); 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  } 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; Create() 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; _repo.CreatePageContent(); 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  } 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So in my constructor I take the pageId and pass it to my dictionary to get which subclass to load. I then get its Constructor and invoke it.&lt;/p&gt;
&lt;p&gt;Now I can remove the huge if block and replace it with a single line of code.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; page = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; MyPage(pageId);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On the face of it this change might look like a lot of work for not much gain as we started off with one file and now we have the original file, an interface, 77 subclasses and the MyPage class. However the original file is a lot more manageable and each sub class can be altered independently of each other.&lt;/p&gt;
&lt;p&gt;This is a big step towards making this code more maintainable, there is always more that can be done but that can wait for another day.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Chrome distrusts SSL Certificates</title>
      <link>https://www.funkysi1701.com/posts/2018/ssl-distrusts/</link>
      <pubDate>Mon, 19 Feb 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2018/ssl-distrusts/</guid>
      <description>&lt;p&gt;One of the websites I have been working on has been displaying an error in the console. The error reads as follows.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;The SSL certificate used to load resources from https://example.com will be distrusted in M70. Once distrusted, users will be prevented from loading these resources. See https://g.co/chrome/symantecpkicerts for more information.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;But what does this mean? Well let’s start by looking at the &lt;a href=&#34;https://security.googleblog.com/2017/09/chromes-plan-to-distrust-symantec.html&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;link&lt;/a&gt;
 provided.&lt;/p&gt;
&lt;p&gt;In January 2017 it was revealed that Certificate Authorities run by Symantec which include Thawte, VeriSign, Equifax, GeoTrust, and RapidSSL had been issuing certificates that did not comply with baseline standards.&lt;/p&gt;
&lt;p&gt;Starting with Chrome 66, Google has decided to remove trust for these certificates. Chrome 66 is due for release around 17th April. My error mentions M70 so what does that refer to?&lt;/p&gt;
&lt;p&gt;Chrome 70 which is due to be released in October 2018 will removed the trust for another batch of Symantec certificates.&lt;/p&gt;
&lt;p&gt;If you are getting one of these errors because you are using a certificate that is going to be distrusted what will your site look like in Chrome 66 or Chrome 70?&lt;/p&gt;
&lt;p&gt;Well Chrome 66 is now in the dev channel so we can give it a try.  &lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2018/02/tempsnip.png.jpg?resize=662%2C443&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Not very nice for your users is it? Now is the time to order a new SSL certificate to avoid this happening to your site.&lt;/p&gt;
&lt;p&gt;I first saw this error a few months ago and have been reading up about it and waiting for Chrome 66 to reach the dev channel so I could test what it did to my site. However now that I have Chrome 66 installed I spotted the intranet for the company I work for is also affected. I do not directly work on the intranet so I notified the security team that they may want to look into this.&lt;/p&gt;
&lt;p&gt;Unfortunately the response I received has been that Google needs to fix this before Chrome 66 is released. I am not criticising my employer or the security team, however this isn’t something Google can just “ &lt;strong&gt;fix&lt;/strong&gt; “.&lt;/p&gt;
&lt;p&gt;The certificates issued were issued by a CA that had issues so in order to maintain the trustworthiness of all certificates Google had little choice but to distrust them. Google and security experts need to be making more of a fuss about this and I am joining in on making a fuss by writing this blog. &lt;a href=&#34;https://scotthelme.co.uk/are-you-ready-for-the-symantec-distrust/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Scott Helme&lt;/a&gt;
 estimates that there are about 7000 websites which may be affected by the M66 and M70 distrusts.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Content Security Policies</title>
      <link>https://www.funkysi1701.com/posts/2018/content-security-policies/</link>
      <pubDate>Mon, 12 Feb 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2018/content-security-policies/</guid>
      <description>&lt;p&gt;A content Security Policy or CSP is a HTTP response header that defines what sources of content can be loaded on a web page. It is a way to combat Cross Site Scripting (XSS) attacks.&lt;/p&gt;
&lt;h3 id=&#34;what-is-a-xss-attack-then&#34;&gt;What is a XSS attack then?&lt;a class=&#34;anchor ms-1&#34; href=&#34;#what-is-a-xss-attack-then&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;When you load a webpage it also loads various other resources like images, some css style sheets, various javascript files that you want to run and probably many other things.&lt;/p&gt;
&lt;p&gt;How do you know that you can trust all of these things? If you created them and they live under you control then the answer is probably yes. However these days you will probably want to use resources from across the internet, like youtube videos, google analytics, disqus comments, jquery libraries from a cdn etc and you can’t be sure exactly what they are doing.&lt;/p&gt;
&lt;p&gt;Imagine you had a page which you could add any text into a form which would then be displayed. A malicious user could add evil javascript or get the browser to load evil code from anywhere on the internet.&lt;/p&gt;
&lt;h3 id=&#34;csp-to-the-rescue&#34;&gt;CSP to the rescue!&lt;a class=&#34;anchor ms-1&#34; href=&#34;#csp-to-the-rescue&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A CSP allows the browser to only load from sources that you specify. You could specify that resources from your own site will load but the evil script will not.&lt;/p&gt;
&lt;p&gt;Let’s look at some examples&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Content-Security-Policy: script-src &amp;#39;self&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This allows &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tags to only load from the current webhost. script-src is not the only keyword you can use, let’s look at some of the others.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;script-src&lt;/strong&gt; – control what &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tags will load&lt;br&gt;
&lt;strong&gt;style-src&lt;/strong&gt; – control what css will load&lt;br&gt;
&lt;strong&gt;img-src&lt;/strong&gt; – control what images will load&lt;br&gt;
&lt;strong&gt;frame-src&lt;/strong&gt; – control what frames will load&lt;br&gt;
&lt;strong&gt;font-src&lt;/strong&gt;  – control what fonts will load&lt;br&gt;
&lt;strong&gt;object-src&lt;/strong&gt; – control what object tags will load&lt;br&gt;
&lt;strong&gt;connect-src&lt;/strong&gt; – control what resources a script can connect to&lt;br&gt;
&lt;strong&gt;media-src&lt;/strong&gt; – controls what media (audio/video) will load&lt;br&gt;
&lt;strong&gt;default-src&lt;/strong&gt; – if no specific rule exists then the default directive will run&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Content-Security-Policy: default-src https
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This allows any content to be loaded from any site as long as it comes from a secure (https) site&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Content-Security-Policy: default-src https://example.com
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This allows any content to be loaded from &lt;a href=&#34;https://example.com&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://example.com&lt;/a&gt;
 only.&lt;/p&gt;
&lt;h3 id=&#34;how-do-i-use-this-on-my-site&#34;&gt;How do I use this on my site?&lt;a class=&#34;anchor ms-1&#34; href=&#34;#how-do-i-use-this-on-my-site&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I have added CSPs into my web.config which works great for my .Net Framework code.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt; &amp;lt;system.webServer&amp;gt; &amp;lt;httpProtocol&amp;gt; &amp;lt;customHeaders&amp;gt; &amp;lt;add name=&amp;#34;Content-Security-Policy&amp;#34; value=&amp;#34;default-src https://example.com&amp;#34; /&amp;gt; &amp;lt;/customHeaders&amp;gt; &amp;lt;/httpProtocol&amp;gt; &amp;lt;/system.webServer&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;For .net core it is a bit more complex as you don’t tend to use web.config files, however check out Anthony Chu’s &lt;a href=&#34;https://anthonychu.ca/post/aspnet-core-csp/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;post&lt;/a&gt;
, which has a solution to that problem.&lt;/p&gt;
&lt;h3 id=&#34;report-only&#34;&gt;Report Only&lt;a class=&#34;anchor ms-1&#34; href=&#34;#report-only&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;One last thing about CSPs to mention is the Report Only flag.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Content-Security-Policy-Report-Only
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This does the same as the above but doesn’t enforce anything, so you can fix any problems before you break anything.&lt;/p&gt;
&lt;p&gt;To view your issues just look in the developer tools in your favourite browser. Or you can configure all your reports to be collated in one place with a report-uri directive.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Content-Security-Policy: default-src https://example.com; report-uri https://example.report-uri.com/r/d/csp/reportOnly;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Scott Helme and Troy Hunt have a site called &lt;a href=&#34;https://report-uri.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;report-uri&lt;/a&gt;
 which offer a service for collating and viewing all your CSP violations so check it out if you want to know more about CSPs.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Pluralsight</title>
      <link>https://www.funkysi1701.com/posts/2018/pluralsight/</link>
      <pubDate>Mon, 05 Feb 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2018/pluralsight/</guid>
      <description>&lt;p&gt;Earlier this year I signed up for pluralsight. If you want to sign up to pluralsight as well use this link &lt;a href=&#34;http://referral.pluralsight.com/mQd8BJ4&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;http://referral.pluralsight.com/mQd8BJ4&lt;/a&gt;
 to get money off.&lt;/p&gt;
&lt;p&gt;Pluralsight is a website that sells training videos on a wide variety of technical topics. You sign up for a monthly or annual subscription and you can watch over 6000 courses whenever and where ever you like.&lt;/p&gt;
&lt;p&gt;I am not a big fan of videos as if I am sat in front of a screen I would rather be building something, however I do spend a lot of time listening to podcasts. So I have decided to convert this time to listening to pluralsight videos.&lt;/p&gt;
&lt;p&gt;If we assume that by not seeing the visual portion of the videos you lose out on 75% of the learning (This is just a guesstimate I am not sure what the exact figure is or how you would calculate it). However this is still 25% more learning than if I hadn’t signed up at all.&lt;/p&gt;
&lt;p&gt;Since I signed up I have listened to over 27 hours of technical videos. These have covered topics like C#, Security, Xamarin, MVVM, Interfaces, Getting Involved and Clean architecture. The number one thing I have learnt is that there is a lot that I still don’t understand.&lt;/p&gt;
&lt;p&gt;That said I would like to think that since starting to listen to pluralsight concepts have gone from being unknown unknowns (I don’t know about them and I don’t understand them) to known unknowns (I know about them but don’t yet fully understand them)&lt;/p&gt;
&lt;p&gt;To keep track of your learning pluralsight has some tests which you can complete. I am particularly proud of my score on the Azure test which ranks me as an expert.&lt;/p&gt;
&lt;p&gt;Why not check out what you can learn from pluralsight?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Flexible Architecture with Interfaces</title>
      <link>https://www.funkysi1701.com/posts/2018/flexible-architecture/</link>
      <pubDate>Mon, 29 Jan 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2018/flexible-architecture/</guid>
      <description>&lt;p&gt;I have blogged a few times about &lt;a href=&#34;https://www.funkysi1701.com/posts/2017/interfaces/&#34;&gt;interfaces&lt;/a&gt;
, and how useful they are for producing good quality maintainable code. Let’s look at a problem and the solution I came up with which I am quite proud of.&lt;/p&gt;
&lt;p&gt;As previously mentioned I am in the process of moving &lt;a href=&#34;https://www.funkysi1701.com/2018/01/22/moving-blobs-cloud-suppliers/&#34;&gt;images&lt;/a&gt;
 from AWS to Azure blob storage. Now that the actual files themselves have been moved I need to change the code that references them.&lt;/p&gt;
&lt;p&gt;Now I could find all the code that uses the AWS API and replace it with the Azure API but I am not very good at predicting the future, we may stay on Azure for a while, we may move to AWS or Google Cloud, or we may want to go back to files sitting on a server.&lt;/p&gt;
&lt;p&gt;Lets try and code a solution that is as flexible as possible. As you have probably guessed I am going to create an interface.&lt;/p&gt;
&lt;p&gt;At first I thought about creating an interface called &lt;strong&gt;ICloudStorage&lt;/strong&gt; , however this isn’t flexible enough as what happens if we go back to sticking files on a server so instead I created &lt;strong&gt;IStorage&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I created three classes that implemented IStorage, &lt;strong&gt;AWSStorage&lt;/strong&gt; , &lt;strong&gt;AzureStorage&lt;/strong&gt; and mostly for testing at the moment &lt;strong&gt;FileStorage&lt;/strong&gt;. I then created a class Storage that would call these three classes. Initially I created it like this&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Storage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; IStorage _repo;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; Storage(IStorage repo)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    _repo = repo;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;However this would require I call it like Storage(new AzureStorage()) and I would need to know everywhere in my code which implementation I want to use. This isn’t too bad as when we change from AWS to Azure we would need to do a find and replace throughout the code and replace all AWSStorage and make them AzureStorage.&lt;/p&gt;
&lt;p&gt;However we can do better than that.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Storage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; IStorage _repo;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; Storage()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Type obj = Type.GetType(ConfigurationManager.AppSettings[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;DefaultStorageRepository&amp;#34;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ConstructorInfo constructor = obj.GetConstructor(&lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Type[] { });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    _repo = (IStorage)constructor.Invoke(&lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This code will read from the web.config which implementation to use and that will decide which class to call. This means that to change from AWS to Azure we do not need to redeploy any code, all we need to do is change the web.config.&lt;/p&gt;
&lt;p&gt;Let’s look at the three lines and see if we can understand what is happening.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Type.GetType()&lt;/strong&gt; looks straight forward and gets the type from the web.config&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;obj.GetConstructor()&lt;/strong&gt; This gets the constructor for the type we have just found.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;constructor.Invoke&lt;/strong&gt; This then invokes the constructor and it then gets cast to the interface so can be used by the _repo variable.&lt;/p&gt;
&lt;p&gt;This is all fairly simple and makes sense, however it has produced some very flexible code and allows the code to be extended without recompiling.&lt;/p&gt;
&lt;p&gt;Let’s look at a hypothetical example. We want to add support for Google Cloud Storage. All we need to do is create a class library which implements the IStorage interface, place the compiled binary in the website and update the web.config to reference it. I haven’t tried this hypothetical example so it might be more complex than I think but in theory it should work.&lt;/p&gt;
&lt;p&gt;I am pretty excited at how flexible this code can be, hopefully I will use code like this more often now I understand it.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Moving files into blob storage</title>
      <link>https://www.funkysi1701.com/posts/2018/moving-blobs-cloud-suppliers/</link>
      <pubDate>Mon, 22 Jan 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2018/moving-blobs-cloud-suppliers/</guid>
      <description>&lt;p&gt;We are in the process of moving our companies websites onto the Azure platform. One of the challenges was to move image files out of the website project into blob storage. This week I have moved 150,000 of them.&lt;/p&gt;
&lt;p&gt;One thing I keep banging on about is that your source code should not contain data. If it does every time you do a deployment you need to consider where these images are located and ensure you don’t overwrite or loose any. It also goes without saying that deployments of a few Mb are a lot quicker than deployments of 100s of Mb.&lt;/p&gt;
&lt;p&gt;Azure blob storage also gives you advantages like distributing storage across multiple datacenters which would be impossible with traditional files on a server.&lt;/p&gt;
&lt;p&gt;So now that we have established that this is a good idea lets look at how we could move large amounts of data. In my case all the filenames are stored in a SQL database so the plan of action was to simply loop through the files in the database, download from current storage (either locally or other cloud storage), upload to Azure and tidy up afterwards. Due to the number of images I am going to update the database and mark when a file has been processed so I can do the move over several days.&lt;/p&gt;
&lt;p&gt;This is my code&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; source = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://example.com/images/&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; tmp = Server.MapPath(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;~/tmp/&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (!Directory.Exists(tmp))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; Directory.CreateDirectory(tmp);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; fixturePhotos = db.Images.Where(x =&amp;gt; x.Moved == &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt; || x.Moved == &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;).Take(id);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;foreach&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; photo &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; fixturePhotos)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; path = getFilePath(photo.FileName);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (!Directory.Exists(Server.MapPath(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;~/tmp/&amp;#34;&lt;/span&gt; + path)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Directory.CreateDirectory(Server.MapPath(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;~/tmp/&amp;#34;&lt;/span&gt; + path));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  WebClient WebClient = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; WebClient();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  WebClient.DownloadFile(source + photo.FileName, tmp + photo.FileName);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  FileUploader f = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; FileUploader(tmp + photo.FileName, photo.FileName);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  System.IO.File.Delete(tmp + photo.FileName);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  photo.Moved = &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;catch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  photo.Moved = &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;db.SaveChanges();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (Directory.Exists(tmp))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; Directory.Delete(tmp, &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;First of all I create a tmp folder in the root of my website if it doesn’t exist to store my images temporarily.&lt;/p&gt;
&lt;p&gt;I then use an entity framework model to query the database that haven’t been moved, and I use the take() method to limit how many results I process. (I have been passing in 1000 at a time)&lt;/p&gt;
&lt;p&gt;I then use a foreach loop over all these files to perform the following actions.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create additional subfolders if the filename variable stored in the database isn’t actually a filename but a filepath, note you will have to split filename and filepath which I haven’t included code for here.&lt;/li&gt;
&lt;li&gt;Download file from the original url and save into the temporary folder&lt;/li&gt;
&lt;li&gt;Upload to Azure&lt;/li&gt;
&lt;li&gt;Delete temporary file&lt;/li&gt;
&lt;li&gt;Update database giving a success or fail&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Once the foreach is finished I commit the database changes and delete the temporary folder. I am sure there must be other ways to do this transfer but this was quick and easy to setup and now I have a copy of all the files in Azure storage so I can test out other issues with my website.&lt;/p&gt;
&lt;p&gt;One last tip about how to schedule this code. I called the above code from a MVC controller and then wrote a Azure Function to call this code on a schedule.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Website UI Testing</title>
      <link>https://www.funkysi1701.com/posts/2018/website-ui-testing/</link>
      <pubDate>Mon, 15 Jan 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2018/website-ui-testing/</guid>
      <description>&lt;p&gt;Last week I looked at testing the &lt;a href=&#34;https://dev.to/funkysi1701/mobile-app-ui-testing-jgg-temp-slug-9433902&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;UI of mobile apps&lt;/a&gt;
, this week lets look at how we could do a similar thing for websites.&lt;/p&gt;
&lt;p&gt;Testing the user interface is not an excuse for a lack of &lt;a href=&#34;https://dev.to/funkysi1701/writing-your-first-test-53gi-temp-slug-2645725&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;unit tests&lt;/a&gt;
. Testing the user interface takes longer so for keep creating your small unit tests that can be run after ever build. That said lets look at how you create a UI test.&lt;/p&gt;
&lt;p&gt;Create a Unit Test project as normal. Now install the following nuget packages&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Selenium.WebDriver.ChromeDriverSelenium.WebDriverSelenium.WebDriver.PhantomJS.Xplatform
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I am going to be using Selenium to achieve my website testing and I am going to concentrate on the Chrome browser. However packages exist for other browsers so have a look at the following and I expect there are others as well.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Selenium.WebDriver.IEDriverSelenium.Firefox.WebDriver
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;http://www.seleniumhq.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Selenium&lt;/a&gt;
 started life as a plugin for Firefox to help create automated tests, however the latest version of Firefox is not compatible with the plugin as I write this. I have not had to install any plugins or extensions to my browsers to achieve my testing.&lt;/p&gt;
&lt;p&gt;Enough talk lets write a test. First we create two instance variables to store the baseURL and the driver for the browser you are using.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; baseURL = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://www.example.com/&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; RemoteWebDriver driver;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next we need to set things up for the test to run. This creates an instance of the chrome driver, maximizes the window and sets it to wait 30 seconds before timing out.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;[TestInitialize()]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; MyTestInitialize()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  driver = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; ChromeDriver();    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  driver.Manage().Window.Maximize();    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(&lt;span style=&#34;color:#ae81ff&#34;&gt;30&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now comes the actual test. We navigate to a URL and then compare the title of the page loaded with a know value with a Assert statement like you would find in a unit test.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;[TestMethod]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; CheckBrowserTitle()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  driver.Navigate().GoToUrl(&lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.baseURL);    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Assert.AreEqual(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Home Page&amp;#34;&lt;/span&gt;, driver.Title);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Finally we need to tidy up after ourselves.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;[TestCleanup()]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; MyTestCleanup()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  driver.Quit();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you are used to writing tests you will know that the are usually constructed in three sections Arrange, Act and Assert. The Arrange is done in the initialize method, which makes the actual test much simpler, the first line does the Act and the last line does the Assert.&lt;/p&gt;
&lt;p&gt;Now we have written a simple test lets look at something more complex.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;driver.FindElementByLinkTest(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;click&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This finds any Link on the page which is click. Be careful as the string need to be exactly what appears on screen it may well be easier to specify by id or class or something that doesn’t change as often. By adding .click() on the end of this command Selenium will click on the link and you can navigate to a new page.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What about submitting form data?&lt;/strong&gt; Well you can find the element you want to fill in and add .SendKeys(&amp;ldquo;example text&amp;rdquo;) or .Submit() and this will fill in and submit form data.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What about a screenshot?&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Screenshot ss = driver.GetScreenshot();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ss.SaveAsFile(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;test.jpg&amp;#34;&lt;/span&gt;,System.Drawing.Imaging.ImageFormat.Jpeg);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I have only just started playing around with web UI tests but you can see there is a fair bit you can do.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Mobile App UI Testing</title>
      <link>https://www.funkysi1701.com/posts/2018/mobile-app-ui-testing/</link>
      <pubDate>Mon, 08 Jan 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2018/mobile-app-ui-testing/</guid>
      <description>&lt;p&gt;Since I started creating an android app I have been writing simple UI tests.&lt;/p&gt;
&lt;p&gt;I have been taking advantage of the Visual Studio App Center which allows you to test against hundreds of different devices in the &lt;strong&gt;Test Cloud&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;Xamarin UI tests&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2018/01/01-newproject-vs.png?resize=300%2C182&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

In order to write a UI test create a UI Test App, this makes use of the nuget package Xamarin UI Test. By default you will now have a test called AppLaunches which will take a screenshot of you app after it starts.&lt;/p&gt;
&lt;p&gt;You can now run this test against any device from Visual Studio assuming you have it physically plugged into your machine. However, how do you run against the Test Cloud?&lt;/p&gt;
&lt;p&gt;To run against the Test Cloud you need to first install node.js. Now you can install the appcenter cli with the following command.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;**npm** install -g appcenter-cli
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;To run the tests in the Test Cloud run the following command&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;**appcenter** test run uitest --app &amp;#34;&amp;lt;username&amp;gt;/&amp;lt;appname&amp;gt;&amp;#34; --devices &amp;#34;&amp;lt;username&amp;gt;/&amp;lt;deviceset&amp;gt;&amp;#34; --app-path _pathToFile.apk_ --test-series &amp;#34;master&amp;#34; --locale &amp;#34;en_US&amp;#34; --build-dir _pathToUITestBuildDir_
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;where &lt;username&gt; is your appcenter username, is the name of your app in appcenter and is the group of apps you have created in app center to test against.&lt;/p&gt;
&lt;p&gt;Look at device sets in the test section of the appcenter and click the new device set button. You can then search for any device you like and add it to a set, as I write this there are 244 devices you can test against.&lt;/p&gt;
&lt;p&gt;It is currently not possible within app center to run tests against a new build, however if you build your app in VSTS as well you can create build or release step that runs it. As the Visual Studio app center is still under development I wouldn’t be surprised if it is added at some point.&lt;/p&gt;
&lt;p&gt;In VSTS look for Mobile Center Test in the definitions and you can specify the same variables as specified in the command line above.&lt;/p&gt;
&lt;p&gt;Now how do you actually write a useful UI test? I mentioned above you get a default test which contains the following code, this takes a screenshot of your app. However you don’t have to include this when using the Test Cloud as screenshots are included for free.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;app.Screenshot(&amp;#34;First screen.&amp;#34;);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Lets look at what else is included in app&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;app.Repl();
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This starts an interactive REPL (Read-Eval-Print-Loop) which lets you explore what is on screen in your app and pauses execution. I don’t include this in my tests, however I do make use of it to explore what is on screen and what tests I might make use of.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;app.Tap(c =&amp;gt; c.Marked(&amp;#34;Button&amp;#34;));
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This taps an element on screen called Button. There is also a method called TapCoordinates which would allow you to click anywhere you like.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;app.WaitForElement(c =&amp;gt; c.Marked(&amp;#34;View&amp;#34;));
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;After clicking a button you are probably going to want to wait for the app to load extra data or a new screen. The WaitForElement waits for an element to appear on screen. There are also methods that wait a period of time or wait until an element no longer exists.&lt;/p&gt;
&lt;p&gt;These are the main methods I have used so far, however there is an extensive list including methods for scrolling, swiping, pinching and adjusting the volume buttons. So  you should be able to test all manner of app functionality and if you make use of the Test Clouds will know which devices are causing problems.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Lets see what 2018 can do!</title>
      <link>https://www.funkysi1701.com/posts/2018/lets-see-2018-can/</link>
      <pubDate>Mon, 01 Jan 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2018/lets-see-2018-can/</guid>
      <description>&lt;p&gt;It is 2018 so it must be time to think about what my plans and goals are for the new year.&lt;/p&gt;
&lt;h3 id=&#34;buy-a-house&#34;&gt;Buy a house&lt;a class=&#34;anchor ms-1&#34; href=&#34;#buy-a-house&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;House&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/12/LEGO-Classic-10703-Creative-Building-Box-Yellow-House.jpg?resize=300%2C300&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;This a huge goal for me. For many years I was content with renting and thought owning my own home wasn’t for me, but then I went and started a family and my career started going in the right direction and my thoughts about this have changed.&lt;/p&gt;
&lt;p&gt;It is going to take a lot of work to make this goal happen in 2018. First I need to save enough money for the deposit, which is far from easy with a wife and two children. Second I need to get our current place sorted ready to physically move which again won’t be easy. Third I need to make a decision which will affect where I live for the next 25 years. At the moment I am torn between the size of property and its physical location, I need to balance both of these and meet the requirements from the rest of the family.&lt;/p&gt;
&lt;p&gt;I do think this is an achievable goal so wish me luck.&lt;/p&gt;
&lt;h3 id=&#34;progress-in-my-career&#34;&gt;Progress in my career&lt;a class=&#34;anchor ms-1&#34; href=&#34;#progress-in-my-career&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I need to be careful how I phrase this in case past, current or future employers are reading. I have been working hard at my current role for over a year and I am starting to wonder what is next for me. I am not entirely sure what form this is going to take yet, I have a few ideas on the go and hopefully I can reveal more soon.&lt;/p&gt;
&lt;p&gt;Another one that is very achievable, as long as I have it in the back of my mind as the year goes on progress should be made.&lt;/p&gt;
&lt;h3 id=&#34;see-more-of-family&#34;&gt;See more of family&lt;a class=&#34;anchor ms-1&#34; href=&#34;#see-more-of-family&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I recently missed a family celebration due to the expansion of my own family and it reminded me that there are aunts, uncles and cousins that I haven’t seen in years and it would be nice to reconnect. Also as my own boys get older and are learning to interact it would be great if they could get to know my own family better.&lt;/p&gt;
&lt;p&gt;I don’t have a clear idea how to achieve this one as it takes two but I am going to make more of an effort.&lt;/p&gt;
&lt;h3 id=&#34;celebrate-5-years-of-marriage&#34;&gt;Celebrate 5 years of marriage&lt;a class=&#34;anchor ms-1&#34; href=&#34;#celebrate-5-years-of-marriage&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Wow how has it been five years since we got married? At some point in 2018 I will take time out from the usual and spend it with the wife away from the boys. I won’t give away more details as I want that to be a surprise.&lt;/p&gt;
&lt;h3 id=&#34;celebrate-the-birth-of-my-two-sons&#34;&gt;Celebrate the birth of my two sons&lt;a class=&#34;anchor ms-1&#34; href=&#34;#celebrate-the-birth-of-my-two-sons&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;Celebrate James and Edward&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/07/james5.jpg?resize=300%2C225&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;I don’t want to get my boys christened as I would like them to make up their own minds when they are old enough, however I do want to celebrate all that they are with a thanksgiving service. Not sure when we are going to sort this, however it is my hope that it will be soon.&lt;/p&gt;
&lt;h3 id=&#34;family-holiday&#34;&gt;Family holiday&lt;a class=&#34;anchor ms-1&#34; href=&#34;#family-holiday&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Not much of a goal but in the summer I will take time out to spend a week away with the family. In previous years we have done scotland, wales and northumberland. This year I am thinking of somewhere not too far away as Edward is still small, but maybe near where I grew up.&lt;/p&gt;
&lt;h3 id=&#34;lightning-talk&#34;&gt;Lightning Talk&lt;a class=&#34;anchor ms-1&#34; href=&#34;#lightning-talk&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A lightning talk is a very short talk or presentation given at a conference or user group. Friends of mine are having lots of success talking about what they know about and I think it might be time for me to have a go. I am not a natural public speaker so this is a step out of my comfort zone, however I am going to start small and see what happens. At the moment I don’t know what my subject or topic is going to be, my suspicion is that it will be devops related as that interest me more but watch this space.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Looking back at 2017</title>
      <link>https://www.funkysi1701.com/posts/2017/looking-back-at-2017/</link>
      <pubDate>Thu, 28 Dec 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/looking-back-at-2017/</guid>
      <description>&lt;p&gt;As 2017 starts to draw to a close let’s look at some of the highlights from the past year.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;Edward&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/07/DSC_0376-e1510563039193-225x300.jpg?resize=225%2C300&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Edward&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In November I became a father again and celebrated the arrival of Edward into the world. Before the birth I was worried how well my first son James would adapt to the new arrival but I am happy to say I didn’t need to,  he mostly ignores the new arrival.&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;Star Trek&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In September the latest Star Trek TV series Discovery arrived on Netflix. I have been very positive so far about the show, I am still positive however there are things that annoy me about the new show, however I am keen to see the next episode each week so they are definitely doing something right.&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;Office move&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In May I helped my employer move to brand new &lt;a href=&#34;https://funkysi1701.com/office-move&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;offices&lt;/a&gt;
. This was a lot of hard work, but everything went as planned and our new home is great.&lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;Side projects &lt;img class=&#34;img-fluid&#34; alt=&#34;Google Play&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/08/googleplay.jpg?resize=300%2C300&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I blogged in February about having a side project but it wasn’t until later in the year that this solidified into what I am working on now. It started as a way to understand &lt;a href=&#34;https://funkysi1701.com/interfaces&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;interfaces&lt;/a&gt;
this then led to learning Xamarin and creating an android app to help promote this blog. Troy Hunt expanded his HIBP API to include passwords that have been in data breaches, I then started working on &lt;a href=&#34;https://funkysi1701.com/pwned-pass--available-from-the-play-store&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;pwned passwords&lt;/a&gt;
 which is a simple android frontend for this.&lt;/p&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;Learning R&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In Feb I also experimented with a new programming language &lt;a href=&#34;https://funkysi1701.com/learning-r&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;R&lt;/a&gt;
. It started with a problem about converting exchange rates and ended with a SQL stored procedure that executed some R code, I still want to learn lots more but it was a good example of the sorts of thing you can build with R.&lt;/p&gt;
&lt;ol start=&#34;6&#34;&gt;
&lt;li&gt;DNS programmatically&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;One of my most successful blogs was about how you can create &lt;a href=&#34;https://dev.to/funkysi1701/creating-dns-records-programmatically-26lp&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;dns&lt;/a&gt;
records within your application eg sites that have yourname.domain in the url. It was a great chance to look at how dns works and learn more about what azure can do to manage this. I want to expand on this and build something.&lt;/p&gt;
&lt;p&gt;So that was 2017, for some ideas about what 2018 might have in store for me look out for my next blog post.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Getting started with Azure Table Storage</title>
      <link>https://www.funkysi1701.com/posts/2017/azure-table-storage/</link>
      <pubDate>Sun, 17 Dec 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/azure-table-storage/</guid>
      <description>&lt;p&gt;Azure Table storage is cheap way to store data, however it has some drawbacks that you should be aware of.&lt;/p&gt;
&lt;p&gt;Azure Table storage is a simple way to store NoSQL data with key/attribute pairs. I am very familiar with storing data in SQL databases and would still choose SQL over Table storage, however Table storage is significantly cheaper so could be worth investigating depending on your project.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.troyhunt.com/working-with-154-million-records-on/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Troy Hunt&lt;/a&gt;
 makes use of Table storage for his Have I been pwned? website so there are projects out there that make use of it to great affect.&lt;/p&gt;
&lt;p&gt;To work with Table storage you need to use a nuget package &lt;strong&gt;WindowsAzure.Storage&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Install-Package WindowsAzure.Storage&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To load data from a Table in Azure Table storage I use the following code&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CloudTable table = tableClient.GetTableReference(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tablename&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TableOperation retrieveOperation = TableOperation.Retrieve&amp;lt;Entity&amp;gt;(PartitionKey, Rowkey);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;table.CreateIfNotExists();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TableResult retrievedResult = table.Execute(retrieveOperation);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Example eg = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Example();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (retrievedResult.Result != &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; eg.ID = ((Entity)retrievedResult.Result).Id;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; eg.Date = ((Entity)retrievedResult.Result).Date;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; eg;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You need to create a class (called Entity in the example above) derived from TableEntity which defines the Partitionkey and Rowkey, plus and other columns you want to store in table storage. The row key and partition key uniquely identify the data in the table, think of this as the primary key of the table if you are used to SQL. This class must also contain a parameterless constructor.&lt;/p&gt;
&lt;p&gt;This is the only way to retrieve data, using the partitionkey and rowkey. If you want to retrieve a specific piece of data you would need to retrieve all rows and then search them for what you need. For me this is not a big problem as I only have 150 rows but if you have millions of rows you may need to think carefully how to use this.&lt;/p&gt;
&lt;p&gt;To save data I use a very similar piece of code&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CloudStorageAccount storageAccount = CloudStorageAccount.Parse(path);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CloudTable table = tableClient.GetTableReference(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tablename&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Entity post = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Entity(ID, DateTime.Now); 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TableOperation insertOperation = TableOperation.InsertOrReplace(post);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;table.CreateIfNotExists();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;table.Execute(insertOperation);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I create a Entity object and then pass this as a parameter into the InsertOrReplace method.&lt;/p&gt;
&lt;p&gt;To delete data it is also very similar, you create an entity object and pass this as a parameter to the Delete method.&lt;/p&gt;
&lt;p&gt;When debugging my table storage code I found the &lt;a href=&#34;https://azure.microsoft.com/en-gb/features/storage-explorer/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Azure Storage Explorer&lt;/a&gt;
 very useful for seeing what data actually existed in the table and what might be throwing an error, usually something wrong with my Entity.&lt;/p&gt;
&lt;p&gt;I mentioned earlier that Table Storage was cheaper than SQL Azure. Well for my simple playing about with things I have found my monthly charge of £10+ has been reduced to £1+ If I were to build anything that is more than just me learning about how it works I would probably continue to use SQL but for the cost of learning new tech it is well worth giving table storage a try.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How to get Zero Code Changes outside of Source Control</title>
      <link>https://www.funkysi1701.com/posts/2017/get-zero-code-changes-outside-source-control/</link>
      <pubDate>Mon, 13 Nov 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/get-zero-code-changes-outside-source-control/</guid>
      <description>&lt;p&gt;Source control is bread and butter for web developers, however not so much for SQL developers and other business people. One of my goals for the coming year is to get the whole of my team using source control processes.&lt;/p&gt;
&lt;p&gt;One of the arguments against using source control is there will always be a few exceptions where it won’t be used. Lets look at a few scenarios to help make the case for source control.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scenario One&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Web Dev 1 makes a change in production to fix an issue and doesn’t use source control. Web Dev 2 is working on a new feature and makes use of source control. He is given the sign-off to deploy his new feature and in the process undoes Web Dev 1’s fix.&lt;/p&gt;
&lt;p&gt;Management blames Web Dev 2 as they “broke” stuff during the deployment. Web Dev 2 doesn’t understand what happened and Web Dev 1 is oblivious to the entire scenario despite in reality being part of the problem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scenario Two&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A SQL Dev works all night to fix a problem. He deploy to production and doesn’t notice a missed where clause due to lack of sleep.&lt;/p&gt;
&lt;p&gt;—&lt;/p&gt;
&lt;p&gt;Let’s look at these two scenarios done with the whole team buying into source control.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scenario One&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Web Dev 1 makes a change in production to fix an issue and also commits to source control. This takes him an extra 5 minutes (if that!) Web Dev 2 is working on a new feature and makes use of source control. He is given the sign-off to deploy his new feature and in the process merges Web Dev 1’s fix before he deploys to production.&lt;/p&gt;
&lt;p&gt;Management is happy with Web Dev 1, nothing is broken and new functionality has made the website better not worse.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scenario Two&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A SQL Dev works all night to fix a problem. He deploy to production and doesn’t notice a missed where clause due to lack of sleep, he also commits to source control this takes him an extra 5 minutes (if that!).&lt;/p&gt;
&lt;p&gt;In the morning a colleague looks through the commits made during the night and queries the missing where clause. A fix is made in source control and deployed, management and the client are unaware that a problem was created and fixed.&lt;/p&gt;
&lt;p&gt;—&lt;/p&gt;
&lt;p&gt;These are simple scenarios but I cannot think of any situation where the outcome would be better to not use source control. These examples assume no continuous deployment, adding this to the system before every team has bought into source control would cause bugs and issues all over the place.&lt;/p&gt;
&lt;p&gt;However with a team that is 100% behind source control continuous deployment can achieve an amazing productivity boost. After every commit code could be automatically tested, reviewed by other members of the team and deployed to test environments for further analysis. Only tested code that has been reviewed can get anywhere near production environments.&lt;/p&gt;
&lt;p&gt;Having said all this there are ways especially on the SQL side to mitigate loosing changes while you work on training individuals and convincing management. Before any code is deployed to production do a schema compare. If you only see changes you have made you can proceed, if you don’t shout at your team.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Advantages&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Code Reviews&lt;br&gt;
Team awareness of what is being changed&lt;br&gt;
History of changes&lt;br&gt;
Smoother Deployments&lt;br&gt;
Automation&lt;br&gt;
Better Teamwork&lt;br&gt;
Diff changes between different versions&lt;br&gt;
Many more&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Disadvantages&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Time to learn tools&lt;br&gt;
Remember to commit changes&lt;br&gt;
Technologies that use binary files harder to version control&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>SQL with Visual Studio Code</title>
      <link>https://www.funkysi1701.com/posts/2017/sql-with-visual-studio-code/</link>
      <pubDate>Mon, 06 Nov 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/sql-with-visual-studio-code/</guid>
      <description>&lt;p&gt;Writing SQL queries is typically done with SQL Management Studio (SSMS). However this tool is a bit of a beast so let’s look at how you could use Visual Studio Code instead.&lt;/p&gt;
&lt;p&gt;Visual Studio Code is a free text editor but it is so much more than just a text editor. VS Code can be downloaded from &lt;a href=&#34;https://code.visualstudio.com/Download&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://code.visualstudio.com/Download&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;To work with SQL Server download the mssql extension. Press  &lt;strong&gt;CTRL+SHIFT+P&lt;/strong&gt; and then Select  &lt;strong&gt;Install Extension&lt;/strong&gt;  and type  &lt;strong&gt;mssql&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Intellisense in Visual Studio Code is brilliant, better than SSMS. Lets look at how to get it all set up.&lt;/p&gt;
&lt;p&gt;Create a new file and set the language type to SQL (Press  &lt;strong&gt;CTRL+K,M&lt;/strong&gt; )&lt;/p&gt;
&lt;p&gt;Open the command palette, &lt;strong&gt;CTRL+SHIFT+P&lt;/strong&gt; and type SQL to show the mssql commands. Select the Connect command.&lt;/p&gt;
&lt;p&gt;Then select &lt;strong&gt;Create Connection Profile&lt;/strong&gt; , this creates a profile to connect with your SQL Server. Follow the prompts to get it all setup.&lt;/p&gt;
&lt;p&gt;Look in the bottom right corner of the status bar and you should see you are connected.&lt;/p&gt;
&lt;p&gt;Now if you type sql you will see a long list of SQL code snippets that you could use.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;SQL Code snippets&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/11/vscode-sql-snippets.png?resize=662%2C348&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Choose a snippet to create, and edit it as required. When you are happy press  **CTRL+SHIFT+E ** to execute.&lt;/p&gt;
&lt;p&gt;This is basically all there is to it. However this is an incredibly powerful way of working, the intellisense instantly tells you what database objects you can use in your query and there is a wealth of different snippets you can use.&lt;/p&gt;
&lt;p&gt;When returning data you get a similar view to SSMS but you can save as Excel, CSV or JSON.&lt;/p&gt;
&lt;p&gt;SSMS is a very graphical way of doing things, you can double click a table and see its columns or indexes. VS Code relies on TSQL commands but you have access to exactly the same information.&lt;/p&gt;
&lt;p&gt;For more information about VS Code and the mssql extension check out &lt;a href=&#34;https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-develop-use-vscode&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-develop-use-vscode&lt;/a&gt;
&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interfaces are cool!</title>
      <link>https://www.funkysi1701.com/posts/2017/interfaces-are-cool/</link>
      <pubDate>Tue, 31 Oct 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/interfaces-are-cool/</guid>
      <description>&lt;p&gt;A while back I &lt;a href=&#34;https://www.funkysi1701.com/posts/interfaces/&#34;&gt;blogged&lt;/a&gt;
 about learning about interfaces as I didn’t really understand the value of them. I do now.&lt;/p&gt;
&lt;p&gt;I created an application that used interfaces so I could learn how it worked. I created a Logger Interface and created multiple classes that implemented that interface so I could swap out the different implementations easily. I created a SQL Logger and a File Logger and my code could be written and be completely unaware of which implementation it was using.&lt;/p&gt;
&lt;p&gt;This application uses SQL Azure and so I have a monthly bill to pay. Wouldn’t it be cool if I could reduce this bill? How about using the cheaper table storage instead?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Easy!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Create a new class that implements my interface and all I need to do is write the three methods defined in my interface and I can swap from SQL Azure to table storage.&lt;/p&gt;
&lt;p&gt;Another benefit to interfaces is testing. Say I have an interface called inotification for sending notifications, I can have several implementations of this email, twitter, slack etc&lt;/p&gt;
&lt;p&gt;None of these implementations should be used in unit tests, as you don’t want a tweet being sent every time you run your tests. Why not create an implementation that simply returns something for each method call and doesn’t actually do anything. I can then run my tests with my fake implementation which tests my code logic but not the implementation I have chosen (this can be tested later on with integration tests or user testing if required).&lt;/p&gt;
&lt;p&gt;This is pretty much all I have to say about interfaces. I just like how I can swap different implementations.&lt;/p&gt;
&lt;p&gt;It does take a bit of work to get the interface setup. I found that when writing the second implementation the interface would need to change slightly, mostly as it was badly designed to begin with. I think for beginners there may be some value to writing multiple implementations of an interface so you can be sure your interface is good, however I am sure with experience this will not be required.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Creating DNS records programmatically</title>
      <link>https://www.funkysi1701.com/posts/2017/creating-dns-records-programmatically/</link>
      <pubDate>Mon, 16 Oct 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/creating-dns-records-programmatically/</guid>
      <description>&lt;p&gt;DNS is the backbone of the internet. It converts domain names into IP addresses. But how can we do clever things with it?&lt;/p&gt;
&lt;p&gt;Making DNS changes has always been a pain. You have to remember what company you registered your domain name with, then locate the login details for their website, login and fill in some web form and wait for the changes to replicate across the internet.&lt;/p&gt;
&lt;p&gt;There are various websites that assign you a custom subdomain name like name.domain.com, obviously they must do this programmatically, they don’t have a guy following the above process.&lt;/p&gt;
&lt;p&gt;Lets see how we could do this.&lt;/p&gt;
&lt;p&gt;My first thought was to make use of the DNSimple API. &lt;a href=&#34;https://developer.dnsimple.com/v2/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://developer.dnsimple.com/v2/&lt;/a&gt;
 The API allows all sort of DNS changes to be made, however this is a paid service so let’s look at other options.&lt;/p&gt;
&lt;p&gt;Azure now has a DNS section. You can go to the portal, add a DNS zone, and then add as many A, CNAME and MX records as you need. This is of course no better than doing it manually.&lt;/p&gt;
&lt;p&gt;Azure offers a &lt;a href=&#34;https://docs.microsoft.com/en-us/azure/dns/dns-sdk&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;SDK&lt;/a&gt;
 and an example Visual Studio project. Lets look at how it works.&lt;/p&gt;
&lt;p&gt;First you need to setup some credentials to use your Azure subscription. The easiest way to do this is with powershell.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Login&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;–&lt;/span&gt;AzureRmAccount
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$sp = New-AzureRmADServicePrincipal &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;–&lt;/span&gt;DisplayName exampleapp &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;–&lt;/span&gt;Password &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{provide-password}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Sleep &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;New-AzureRmRoleAssignment &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;–&lt;/span&gt;RoleDefinitionName Contributor &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;–&lt;/span&gt;ServicePrincipalName $sp.ApplicationId
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will create a AD Service Principal which has access to your Azure subscription.&lt;/p&gt;
&lt;p&gt;You need to get the following IDs from the Azure portal.&lt;/p&gt;
&lt;p&gt;subscriptionId for your subscription&lt;br&gt;
tenantId or the Azure AD Directory ID&lt;br&gt;
applicationId of the service principal created above&lt;br&gt;
password you entered into the powershell script above&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; serviceCreds = &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; ApplicationTokenProvider.LoginSilentAsync(tenantId, clientId, secret);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; dnsClient = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; DnsManagementClient(serviceCreds);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dnsClient.SubscriptionId = subscriptionId;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; recordSetParams = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; RecordSet();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;recordSetParams.TTL = &lt;span style=&#34;color:#ae81ff&#34;&gt;3600&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;recordSetParams.ARecords = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; List&amp;lt;ARecord&amp;gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;recordSetParams.ARecords.Add(&lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; ARecord(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;1.2.3.4&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; recordSet = &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; dnsClient.RecordSets.CreateOrUpdateAsync(resourceGroupName, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;funkysi1701.com&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;test&amp;#34;&lt;/span&gt;, RecordType.A, recordSetParams);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The above code connects to Azure and creates an A record for test.funkysi1701.com that points at the ip address 1.2.3.4.&lt;/p&gt;
&lt;p&gt;Other DNS records can be created in a similar way.&lt;/p&gt;
&lt;p&gt;The above example creates a new RecordSet but you can use the following to delete or get existing records.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; recordSet = dnsClient.RecordSets.Get(resourceGroupName, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;funkysi1701.com&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;test&amp;#34;&lt;/span&gt;, RecordType.A);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dnsClient.RecordSets.Delete(resourceGroupName, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;funkysi1701.com&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;test&amp;#34;&lt;/span&gt;, RecordType.A);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now I have found out that I can write a console app to edit my DNS records I need to change the nameservers for all my domains so I can take advantage of this new feature.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Discovery – My thoughts so far</title>
      <link>https://www.funkysi1701.com/posts/2017/discovery-my-thoughts-so-far/</link>
      <pubDate>Tue, 10 Oct 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/discovery-my-thoughts-so-far/</guid>
      <description>&lt;p&gt;I tried to resist but I am going to have to write about the new Star Trek series Discovery. Warning this post is going to include SPOILERS. If you read on you have been warned.&lt;/p&gt;
&lt;p&gt;I watched the first two episodes of the brand new Star Trek TV show. As I am an international viewer I used Netflix, if you are from the US you need to use CBS All Access. &lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/05/DAD0hTKUAAAUkTP.jpg?resize=662%2C366&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;I have heard a lot of complaining that the show is not free to watch. CBS is making Star Trek Discovery to make money, if they don’t make money they will stop making it. Its as simple as that.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.netflix.com&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Netflix&lt;/a&gt;
costs £5.99 per month and &lt;a href=&#34;https://www.cbs.com/all-access/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;CBS All Access&lt;/a&gt;
 costs $5.99 per month. I don’t believe this is a lot of money. The 5.99 above allows you to watch any of the 726 Star Trek episodes at any time of day whenever you want as many times as you want, plus you have access to all the other movies or TV shows available. I don’t think this is too much to ask.&lt;/p&gt;
&lt;p&gt;Back to Discovery. I loved it! It felt like Star Trek. I had feared it might only share the name and would be an action filled TV show that had little in common with what he had seen before. I was wrong this is definitely a show that can proudly call itself Star Trek.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Klingons&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When it was first announced that the Klingons would feature in the new show I was a bit “meh”. We had done lots with the Klingons before and they had never been my favourite alien race. &lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/09/star-trek-discovery-klingons-1002567-1280x0.jpg?resize=300%2C165&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;The look of the Klingons was also going to be changed, I have to admit this didn’t bother me. Klingons have had their look updated before. In 1966 Klingons had dark faces and smooth foreheads, in 1979 the forehead ridges were added as the first Star Trek movie was made, and now Discovery has removed all hair from Klingons. I can explain it away as productional changes, I don’t need an on screen explanation like we had on Enterprise (or even DS9).&lt;/p&gt;
&lt;p&gt;What I have seen so far is a menacing alien race that fits with what we have seen before with lots of references to honor, Kahless and speaking Klingon. I must admit reading all the subtitles is getting a bit tiresome, but that is a minor issue.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conflict&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Historically Star Trek has not featured conflict between the main starfleet characters due to the idea that humanity has evolved beyond this. DS9 got round this by having Odo and Kira who are not starfleet characters so can have a little bit of conflict. Discovery has completely abandoned this idea.&lt;/p&gt;
&lt;p&gt;In the pilot episode, the Michael Burnham commits mutiny on her captain, even attacking her with a vulcan nerve pinch. In the third episode we finally meet the discovery crew. Gone are the TNG days where the ships crew are like a family, I am not sure I can think of a single character that would call another character “friend”. We are in a time of war so this would be expected, however I do hope we see deepening friendships form between characters.&lt;/p&gt;
&lt;p&gt;I am OK with the change to feature more conflict. I must admit the darkness of the third episode, did stop to make me think a bit, however by the fourth episode I was won over.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cast&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The story is concentrated around Michael Burnham, so I do worry that other characters won’t get a look in. However from what I have seen Michael Burnham is a great character. She is a strong female character, with a intriguing back story relating to Sarek and possibly also Spock.&lt;/p&gt;
&lt;p&gt;Saru the alien character on the show, played by the very tall Doug Jones is great. From the trailers he was all about sensing death, but there is far more to him than that. I am looking forward to learn more about him and his threat ganglia.&lt;/p&gt;
&lt;p&gt;As the show has gone on we have started to learn about the other characters like Captain Lorca, Tilly and Paul Stamets.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Title Sequence&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I don’t like the opening title sequence, it feels very cheap like a draft version which hasn’t been finished yet. I was looking forward to a title sequence that would show off the USS Discovery, maybe like TNG where it warps around our own solar system. What we see is some of the tech that features in Star Trek which is nice but I want more. The theme tune while great that it features parts from the classic theme doesn’t stand on its own. I can hum all the other TV shows themes, and now after 4 episodes would struggle to do that.&lt;/p&gt;
&lt;p&gt;However I expect that after a while I will grow to like this more.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Overall&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I like Discovery and I will keep watching it. I want to find out what happens to the characters. There are no annoying characters like other shows have had. There is character development, none of the characters are going to finish where they started. I want more friendship between characters, but I expect that will come, I want more exploring and doing Star Trek stuff, but most of all I want more episodes, roll on next weeks show.&lt;/p&gt;
&lt;p&gt;Other things I noticed&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sound effects on the bridge are awesome, it makes me feel at home&lt;/li&gt;
&lt;li&gt;The USS Discovery doesn’t feature in the first two episodes despite being the title of the show.&lt;/li&gt;
&lt;li&gt;Others have noted that Captain Georgiou has books on her shelf which feature classic episode titles&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Star Trek is back with Discovery</title>
      <link>https://www.funkysi1701.com/posts/2017/star-trek-is-back-with-discovery/</link>
      <pubDate>Fri, 22 Sep 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/star-trek-is-back-with-discovery/</guid>
      <description>&lt;p&gt;In &lt;a href=&#34;https://www.funkysi1701.com/posts/star-trek-is-back-in-2017&#34;&gt;November 2015&lt;/a&gt;
 it was announced that a new Star Trek series was going to be launched. It has been a long wait with multiple delays but Star Trek Discovery is finally here.&lt;/p&gt;
&lt;p&gt;Star Trek Discovery launches in the US on 24th September and in the UK on 25th September.&lt;/p&gt;
&lt;iframe src=&#34;https://www.youtube.com/embed/UoV3kc05Nwc?rel=0&#34; width=&#34;560&#34; height=&#34;315&#34; frameborder=&#34;0&#34; allowfullscreen=&#34;allowfullscreen&#34;&gt;&lt;/iframe&gt;
&lt;p&gt;Lets have a look back how we got here.&lt;/p&gt;
&lt;p&gt;Star Trek was created by Gene Roddenberry in the 1960s. He imagined a show where we would explore the galaxy while also exploring the human condition. He described it as a wagon train to the stars. However it was cancelled after 79 episodes and three seasons due to budget cuts and low viewers.&lt;/p&gt;
&lt;p&gt;After cancellation its popularity boomed in reruns. In the mid 1970s an animated series was created. But demand for Star Trek continued until a new Star Trek show was commissioned called Phase Two.&lt;/p&gt;
&lt;p&gt;In 1977 Star Wars came out, and the phase two idea was cancelled and turned into a movie. In 1979 we got Star Trek The Motion Picture. It went massively over budget and failed to really capture the Star Trek spirit.&lt;/p&gt;
&lt;p&gt;A much cheaper sequel was created in 1982 Star Trek II: The Wrath of Khan with Roddenberry taking more of a back seat. A film widely considered to be one of the best trek films. Four more feature films starring the original cast were made.&lt;/p&gt;
&lt;p&gt;However in 1987 Gene Roddenberry teamed up with Rick Berman and The Next Generation was created with a brand new cast. The series ran for seven seasons set roughly a century after the adventures of Kirk and Spock.&lt;/p&gt;
&lt;p&gt;Popularity of Star Trek soured and this led Rick Berman to help create the spin off series Deep Space 9, Voyager and lastly Enterprise along with four feature films continuing the adventures of the TNG cast. When Enterprise was cancelled in 2005, Star Trek appeared to be dead after 18 years on TV.&lt;/p&gt;
&lt;p&gt;However in 2009 movie creator JJ Abrams recast the classic crew for the big screen. The film was big on action, but took place in an alternative timeline allowing for familiar characters to have new adventures without interfering with events depicted in the TV shows.&lt;/p&gt;
&lt;p&gt;Two sequels to this film have been produced and are bringing Star Trek back into popularity. This has given rise to Discovery. Star Trek is returning to the TV screen and it is going to be great.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;Discovery&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/09/gqojtfz1dhmxoiri7g8p.png?resize=662%2C372&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Azure Friday</title>
      <link>https://www.funkysi1701.com/posts/2017/azure-friday/</link>
      <pubDate>Mon, 18 Sep 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/azure-friday/</guid>
      <description>&lt;p&gt;I think Azure is great, but there is loads to it so I can never know about all of its features. There is a video series hosted by Scott Hanselman called &lt;a href=&#34;https://channel9.msdn.com/Shows/Azure-Friday&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Azure Fridays&lt;/a&gt;
 which I have started to watch in an effort to keep more up to date about some of its cool features.&lt;/p&gt;
&lt;iframe src=&#34;https://docs.microsoft.com/en-us/shows/azure-friday/debug-net-apps-in-production-snapshot-debugger-in-application-insights/player&#34; width=&#34;960&#34; height=&#34;540&#34; frameborder=&#34;0&#34; allowfullscreen=&#34;allowfullscreen&#34;&gt;&lt;/iframe&gt;
&lt;p&gt;I watched this video recently and it is all about application insights and new ways you can debug your web applications by creating snapshots. I am a big fan of application insights so adding extra ways to debug my apps is a big win for me. Once I get this feature working in my code I will no doubt blog about it.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Azure Functions</title>
      <link>https://www.funkysi1701.com/posts/2017/azure-functions/</link>
      <pubDate>Tue, 12 Sep 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/azure-functions/</guid>
      <description>&lt;p&gt;I recently blogged about using &lt;a href=&#34;https://www.funkysi1701.com/posts/using-azure-webjobs-to-automate-stuff&#34;&gt;Azure Web Jobs&lt;/a&gt;
, Azure Function is another way of doing the same thing, lets look at how they work.&lt;/p&gt;
&lt;p&gt;(Sorry its been a while since I blogged but I suspect an erratic schedule will continue for the next few months.)&lt;/p&gt;
&lt;p&gt;To create an Azure Function go to the Azure portal and click add new and search for &amp;ldquo;Function App&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Give your app a name and select the usual resource group and location settings.&lt;/p&gt;
&lt;p&gt;Now when you open Function Apps you should see your new app.&lt;/p&gt;
&lt;p&gt;I want my Function App to run on a schedule so I clicked the + next to functions and selected TimerTrigger. I am a c# programmer so I selected this option as well.&lt;/p&gt;
&lt;p&gt;Give your function a name and specify using the usual cron notation how often it should run. I want mine to run at 9.30pm each night so use 0 30 21 * * *&lt;/p&gt;
&lt;p&gt;Now comes the code bit. By default you get a window with the following code in it&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;using&lt;/span&gt; System;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; Run(TimerInfo myTimer, TraceWriter log)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; log.Info(&lt;span style=&#34;color:#e6db74&#34;&gt;$&amp;#34;C# Timer trigger function executed at: {DateTime.Now}&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It is entirely up to you what you get your function to do. In my case I just wanted to call a URL on a schedule so I created some code that used httpclient.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;using&lt;/span&gt; System;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;using&lt;/span&gt; System.Net.Http;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; Task Run(TimerInfo myTimer, TraceWriter log)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; log.Info(&lt;span style=&#34;color:#e6db74&#34;&gt;$&amp;#34;Buffer 0 function executed at: {DateTime.Now}&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; HttpClient client = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; HttpClient();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; result = &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; client.GetAsync(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;URL&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; resultContent = &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; result.Content.ReadAsStringAsync();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; log.Info(resultContent);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Once you have created your app and it has run you can use the monitor section to view success and failures.&lt;/p&gt;
&lt;p&gt;There is loads more you can do with Azure Function but this is a good place to start.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Pwned Pass – Available from the Play Store</title>
      <link>https://www.funkysi1701.com/posts/2017/pwned-pass-available-from-the-play-store/</link>
      <pubDate>Mon, 14 Aug 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/pwned-pass-available-from-the-play-store/</guid>
      <description>&lt;p&gt;Pwned Pass is now available from the &lt;a href=&#34;https://play.google.com/store/apps/details?id=pwnedpasswords.pwnedpasswords&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Google Play Store&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;Pwned Pass&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/08/Screenshot_20170813-205152.png?resize=169%2C300&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Pwned Pass is a simple android app that allows you to type in a password and tells you if it has been used in a data breach.&lt;/p&gt;
&lt;p&gt;Troy Hunt of &lt;a href=&#34;https://haveibeenpwned.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Have I Been Pwned?&lt;/a&gt;
 recently added a new API to his website which allows you to search his extensive database of pwned passwords, 306 million of them. I have simply created a Android frontend to this API.&lt;/p&gt;
&lt;p&gt;The API itself takes a SHA1 hash of the password and either returns a HTTP 200 if the password is found or a HTTP 404 if the password does not exist in the HIBP database. For more details of how Troy Hunt created this check out his &lt;a href=&#34;https://www.troyhunt.com/introducing-306-million-freely-downloadable-pwned-passwords/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;blog post&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;My app simply generates a SHA1 hash of anything that is typed in and then passes this to Troy Hunt’s API. I then get the HTTP return code so I know if the password exists or not.&lt;/p&gt;
&lt;p&gt;It should be noted that:  &lt;strong&gt;Do not send any password you actively use to a third-party service – even this one!&lt;/strong&gt; I don’t log anything that you type into my app and all I am then doing is passing a SHA1 hash over SSL to HIBP. However you shouldn’t trust my word alone.&lt;/p&gt;
&lt;p&gt;The app itself is written in Visual Studio with Xamarin Forms in a similar fashion to the app I talked about &lt;a href=&#34;https://www.funkysi1701.com/posts/android-app-development-and-the-visual-studio-mobile-centre&#34;&gt;last week&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;As I am using Xamarin Forms there is the potential that I may develop iPhone or UWP versions of this code in the future. With that in mind I have made use of interfaces for the android specific parts of the code.&lt;/p&gt;
&lt;p&gt;I also make use of the &lt;a href=&#34;https://www.nuget.org/packages/modernhttpclient/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;modernhttpclient&lt;/a&gt;
nuget package due to problems I encountered with httpclient and SSL. This is due to limitations of what libraries are available in mono and what has been implemented, I suspect there are better ways to solve this but that is all part of the fun.&lt;/p&gt;
&lt;p&gt;Please do have a look at Pwned Pass and let me know what you think. Especially if it doesn’t work or throws errors. I would like to spend time making this app as good as I can make it.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Android App Development and the Visual Studio Mobile Centre</title>
      <link>https://www.funkysi1701.com/posts/2017/android-app-development-and-the-visual-studio-mobile-centre/</link>
      <pubDate>Mon, 07 Aug 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/android-app-development-and-the-visual-studio-mobile-centre/</guid>
      <description>&lt;p&gt;For the past week or so I have been playing around with Xamarin and creating an android app.&lt;/p&gt;
&lt;p&gt;Well I now have an app in the Google Play Store. Check out &lt;a href=&#34;https://play.google.com/store/apps/dev?id=6148298088834956775&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://play.google.com/store/apps/dev?id=6148298088834956775&lt;/a&gt;
. &lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/08/Screenshot_20170806-190053.png?resize=169%2C300&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Before you rush and download the app I must warn you that it doesn’t do much yet. It displays some content that is on my website and there are a few links to allow sharing of content. I have some ideas to display content from my blog and allow sharing. I also have some other ideas for apps that might actually be useful to people that are not me. If you have ideas or feature requests do let me know.&lt;/p&gt;
&lt;p&gt;Ok how did I go about creating this app and getting it in the app store?&lt;/p&gt;
&lt;p&gt;Xamarin is now part of Visual Studio so step one is install all the Xamarin features to Visual Studio and build an app.&lt;/p&gt;
&lt;p&gt;Next I wanted to monitor my app. Now I know Application Insights doesn’t support apps so what tools are out there? HockeyApp is something I had heard of but they are in the process of being replaced with &lt;a href=&#34;https://appcenter.ms/apps&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Visual Studio Mobile Centre&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;It was relatively easy to hook up my app to Visual Studio Mobile Centre. First install the required nuget packages. Then add using statements and the following line to your MainActivity.cs file (these instructions are available on the Mobile Centre)&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;using&lt;/span&gt; Microsoft.Azure.Mobile;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;using&lt;/span&gt; Microsoft.Azure.Mobile.Analytics;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;using&lt;/span&gt; Microsoft.Azure.Mobile.Crashes;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;using&lt;/span&gt; Microsoft.Azure.Mobile.Distribute;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;using&lt;/span&gt; Microsoft.Azure.Mobile.Push;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;MobileCenter.Start(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;[Unique ID]&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#66d9ef&#34;&gt;typeof&lt;/span&gt;(Analytics), &lt;span style=&#34;color:#66d9ef&#34;&gt;typeof&lt;/span&gt;(Crashes), &lt;span style=&#34;color:#66d9ef&#34;&gt;typeof&lt;/span&gt;(Distribute), &lt;span style=&#34;color:#66d9ef&#34;&gt;typeof&lt;/span&gt;(Push));
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now you can connect the Mobile Centre to your source code (VSTS in my case) and get it to run a build for every commit.&lt;/p&gt;
&lt;p&gt;One complexity of the build is that you need to supply a keystore file (basically a certificate to digitally sign your app). I found the best way to do this was to use Visual Studio to create the file.&lt;/p&gt;
&lt;p&gt;In VS2017 there is a option called Archive Manager under the tools menu. In here click the distribute button and select Ad-hoc. In the signing identity section you can create a keystore file. Enter a few details and a keystore file will be created in AppData\Local\Xamarin\Mono for Android\Keystore[keystore name][keystore name.keystore]&lt;/p&gt;
&lt;p&gt;Once you have added the keystore file to your build you can enable the distribute option. Now you will get an email after every build with a link to install your app.&lt;/p&gt;
&lt;p&gt;Every time your app crashes the details will be logged in the crashes section for you to explore and fix the issues.&lt;/p&gt;
&lt;p&gt;The Analytics section allows you to explore how your app is being used. You can also add Analytics.TrackEvent(&amp;ldquo;Feature X&amp;rdquo;) to measure the usage of different features.&lt;/p&gt;
&lt;p&gt;There are more things you can do which I will explore more at another time along with how to get your app into the Google Play Store.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Creating your own nuget packages with VSTS</title>
      <link>https://www.funkysi1701.com/posts/2017/creating-nuget-packages/</link>
      <pubDate>Mon, 31 Jul 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/creating-nuget-packages/</guid>
      <description>&lt;p&gt;For a while I have found myself writing the same bits of code for different web projects. This annoys me as it goes against the DRY principle (don’t repeat yourself).&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;Nuget&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/07/nuget.png?resize=300%2C91&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

One possible solution is to write your own nuget packages. You can then add this piece of code to any project you work on.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.nuget.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;nuget.org&lt;/a&gt;
 is the public nuget feed where any developer can download nuget packages. You could publish your nuget package here, but your might want to restrict access so better to create a private nuget feed.&lt;/p&gt;
&lt;p&gt;Lets look at how we create a nuget feed in Visual Studio. First thing you need to do is install the &lt;a href=&#34;https://marketplace.visualstudio.com/items?itemName=ms.feed&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Package Management&lt;/a&gt;
 extension to Visual Studio Team Services (its free for less than 5 users), this will add a packages section under the build menu.&lt;/p&gt;
&lt;p&gt;Before you can start using this new feature you need to add a Package Management License in the users hub.&lt;/p&gt;
&lt;p&gt;Once that is done you can create a feed. You need to give your feed a name, decide if only members of the current project or everyone in your account should have access to read and contribute to.&lt;/p&gt;
&lt;p&gt;Now you have a feed you could use the nuget package command to create a nupkg file and then nuget push command to add it to your feed. A better way is to get Visual Studio Team Services to do all the hard work.&lt;/p&gt;
&lt;p&gt;Create a new project in Visual Studio Team Service to house your nuget package. In the build section add an empty build definition. Choose a build agent, I am using the Hosted VS2017. Then add the following steps nuget restore, Visual Studio Build, nuget pack and nuget push.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;nuget restore – this step is only needed if your code depends on other packages. If it depends on other packages that are only in your feed you must specify your feed in the feeds and authentication section.&lt;/li&gt;
&lt;li&gt;Visual Studio Build – this builds your code like you would in Visual Studio. The only config I made to this step was to specify Release in configuration.&lt;/li&gt;
&lt;li&gt;nuget pack – this creates the nupkg file from your built project. In configuration to package specify the same as you specified in the previous step (in my case Release)&lt;/li&gt;
&lt;li&gt;nuget push – this publishes to your feed, so of course you need to specify your feed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One last thing to configure is to enable the continuous integration option in triggers. This means whenever you push code all these steps will run and you have a new version of your nuget package.&lt;/p&gt;
&lt;p&gt;In Visual Studio you need to create a *.nuspec file, this contains all the meta data about your nuget package. Let look at an example.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34;?&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;package&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;metadata&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;id&amp;gt;&lt;/span&gt;$id$&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.0.2&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Nuget&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;authors&amp;gt;&lt;/span&gt;Simon Foster&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/authors&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;owners&amp;gt;&lt;/span&gt;Simon Foster&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/owners&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;requireLicenseAcceptance&amp;gt;&lt;/span&gt;false&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/requireLicenseAcceptance&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;description&amp;gt;&lt;/span&gt;An example of a nuget package.&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/description&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;releaseNotes&amp;gt;&lt;/span&gt;Release Notes&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/releaseNotes&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;copyright&amp;gt;&lt;/span&gt;Copyright 2017&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/copyright&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;projectUrl&amp;gt;&lt;/span&gt;https://[yourVSaccount].visualstudio.com/nuget/&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/projectUrl&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/metadata&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/package&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;One last thing to mention is version numbers. You can either change the version number in your *.nuspec file everytime you push changes. This will create stable packages like 1.0, 1.1, 1.2 etc&lt;/p&gt;
&lt;p&gt;However you can use the automatic version number setting in the nuget pack build step. However I have found this only ever creates pre-release packages and I haven’t found a way to upgrade a package from pre-release to stable.&lt;/p&gt;
&lt;p&gt;This is a really neat way to reuse your code in multiple projects. I have only been looking at this for a few days and I have already extracted code to do with emails, creating excel downloads and database related methods. I suspect that doing this will also have a side benefit of forcing me to create code with fewer dependencies so more code can be turned into a nuget package.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Async and Await</title>
      <link>https://www.funkysi1701.com/posts/2017/async-and-await/</link>
      <pubDate>Mon, 24 Jul 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/async-and-await/</guid>
      <description>&lt;p&gt;For a while the Async and Await commands in c# have confused me.&lt;/p&gt;
&lt;p&gt;Like most things the best way to learn about something is to use it in a real world example. I am currently adding an email alert feature to a website. This is an ideal example of something that would benefit from Asynchronous programming. There is no need for the webpage to wait to send 1000s of emails, lets just send a call to get started and allow the browser to carry on as normal.&lt;/p&gt;
&lt;p&gt;This is my first try at using async and await so feel free to suggest best practises in the comments.&lt;/p&gt;
&lt;p&gt;Lets start with a Send method in my EmailController.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; ActionResult Send(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; id, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; pageId, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; userID)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (!Authorize.checkPageIsAuthorised(userID, (Authorize.PageIds)pageId))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; Redirect(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/login&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   Task&amp;lt;&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;&amp;gt; t = SendNotifications(id,userID);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; Redirect(Request.UrlReferrer.ToString());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This simply checks to see if you have permission to the page. If not redirects to the login page otherwise it makes a method call and redirects back to the page it came from.&lt;/p&gt;
&lt;p&gt;Lets have a look at that method call in more detail.&lt;/p&gt;
&lt;p&gt;Task&lt;string&gt; t = SendNotification(id, userid);&lt;/p&gt;
&lt;p&gt;SendNotification doesn’t return a normal string it returns a Task&lt;string&gt;, so lets look at how we are creating this.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; Task&amp;lt;&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;&amp;gt; SendNotifications(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; id,&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; type,&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; userid)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;//logic ommitted&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; ef.SendEmail(model, emailHtmlBody);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;OK&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The return type is set to Task but it has the aysnc keyword appended to it. It also makes a call with the await keyword.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; Task SendEmail(EmailModel model,&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; emailHtmlBody)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;//logic removed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; smtp.SendMailAsync(message);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So that is it. My first bit of code that uses Async and Await. My controller calls a method asynchronously which then calls another method asynchronously which sends emails asynchronously.&lt;/p&gt;
&lt;p&gt;Async – This enables the Await keyword to be used in the method&lt;/p&gt;
&lt;p&gt;Await – This is where things get asynchronous. The await keyword allows the code to wait asynchronously for the long running code to complete.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How good is your SSL?</title>
      <link>https://www.funkysi1701.com/posts/2017/how-good-is-your-ssl/</link>
      <pubDate>Mon, 17 Jul 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/how-good-is-your-ssl/</guid>
      <description>&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;Troy Hunt SSL expert&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/07/Troy-Hunt-Profile-Photo.jpg?resize=150%2C150&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;I recently watched Troy Hunt’s &lt;a href=&#34;https://www.pluralsight.com/courses/https-every-developer-must-know&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;What Every Developer Must Know about HTTPS&lt;/a&gt;
 course on Pluralsight. Its very good and really make you think about SSL certificates and how to correctly implement them.&lt;/p&gt;
&lt;p&gt;One thing in particular Troy mentions is the website &lt;a href=&#34;https://www.ssllabs.com/ssltest/index.html&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;SSL Labs&lt;/a&gt;
. This website allows you to test a websites implementation of SSL. A grade of A to F is assigned with A being the best and F being the worst.&lt;/p&gt;
&lt;p&gt;Troy Hunt has a &lt;a href=&#34;https://www.troyhunt.com/do-you-really-want-bank-grade-security/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;blog&lt;/a&gt;
 post where he discusses how Australian Banks score. Lets look at a few UK banks.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Bank&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;SSL Certificate&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Grade&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Home Page Under SSL&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;HSBC&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://www.hsbc.co.uk&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;www.hsbc.co.uk&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;Y&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nationwide&lt;/td&gt;
&lt;td&gt;onlinebanking.nationwide.co.uk&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;N&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NatWest&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://www.nwolb.com&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;www.nwolb.com&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;N&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Barclaycard&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://www.barclaycard.co.uk&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;www.barclaycard.co.uk&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;A-&lt;/td&gt;
&lt;td&gt;Y&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Barclays&lt;/td&gt;
&lt;td&gt;bank.barclays.co.uk&lt;/td&gt;
&lt;td&gt;A-&lt;/td&gt;
&lt;td&gt;N&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lloyds Bank&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://www.lloydsbank.com&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;www.lloydsbank.com&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;N&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Royal Bank of Scotland&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://www.rbsdigital.com&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;www.rbsdigital.com&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;N&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Standard Chartered&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://www.sc.com&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;www.sc.com&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;Y&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Virgin Money&lt;/td&gt;
&lt;td&gt;uk.virginmoney.com&lt;/td&gt;
&lt;td&gt;A+&lt;/td&gt;
&lt;td&gt;Y&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Santander&lt;/td&gt;
&lt;td&gt;retail.santander.co.uk&lt;/td&gt;
&lt;td&gt;A-&lt;/td&gt;
&lt;td&gt;N&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;On the whole the ratings are all quite good with all being in the range A-C. However I have also indicated if they have SSL on the home page. Only 4 out 10 website listed above have the home page load under SSL.&lt;/p&gt;
&lt;p&gt;Why does this matter as long as the login is under SSL? Any page that loads over http is potentially at risk from a man in the middle attack. A fake malicious home page could contain links to any page and trick users into entering personal information.&lt;/p&gt;
&lt;p&gt;If you want to test a bank or other website not listed here. Go to &lt;a href=&#34;https://www.ssllabs.com/ssltest/index.html&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://www.ssllabs.com/ssltest/index.html&lt;/a&gt;
 and type the address that is on the SSL certificate in to the search. The good news is that this site scores a A.&lt;/p&gt;
&lt;p&gt;Troy mentions that there is rapid growth in the adoption of SSL, there is also rapid growth in improving ratings. One of these banks went from a C to an A during the course of writing this blog.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Writing your first test</title>
      <link>https://www.funkysi1701.com/posts/2017/writing-your-first-test/</link>
      <pubDate>Mon, 10 Jul 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/writing-your-first-test/</guid>
      <description>&lt;p&gt;Whenever I write a new test I have to think how best to do it. Hopefully I can summarise a few tips here to help get started.&lt;/p&gt;
&lt;h3 id=&#34;arrange-act-assert&#34;&gt;Arrange Act Assert&lt;a class=&#34;anchor ms-1&#34; href=&#34;#arrange-act-assert&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The first thing I think about when writing a test is Arrange, Act, Assert. Arrange, Act, Assert is a pattern for writing the tests.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Arrange&lt;/strong&gt; – This gets things in order ready to execute the test.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Act&lt;/strong&gt; – This executes the method you want to test.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Assert&lt;/strong&gt; – This compares the value produced in the Act step with a known value typically with a method similar to the following&lt;/p&gt;
&lt;p&gt;Assert.AreEqual(expected value, actual value)&lt;/p&gt;
&lt;p&gt;Say for example you wanted to test a method called ReturnsTrue() which does nothing but returns a value of true. This method is in a class called ReturnsTrueClass&lt;/p&gt;
&lt;p&gt;The Arrange step in this example would be.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ReturnsTrueClass t = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; ReturnsTrueClass();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The Act step in this example would be.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; result = t.ReturnTrue();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The Assert step in this example would be.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Assert.AreEqual(&lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;, result);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is a stupidly simple example but hopefully you get the idea of how you can build all your tests with these three steps.&lt;/p&gt;
&lt;p&gt;Recently I saw a tweet complaining that someone has mixed up expected and actual in the Assert statement.&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;There is a minor but special hell reserved for those who mix up the expected and actual parameters in Assert.Equals&lt;/p&gt;&amp;mdash; Keith Williams (@zogface) &lt;a href=&#34;https://twitter.com/zogface/status/882737770095149056?ref_src=twsrc%5Etfw&#34;&gt;July 5, 2017&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;p&gt;At first glance this probably isn’t the worst mistake to make as if your tests are all passing actual and expected are the same.&lt;/p&gt;
&lt;p&gt;However tests will fail, that is the whole point of them, you can then fix bits of code. If you have mixed up actual and expected it adds extra time to debugging and figuring out what values are produced from your code and what you are expecting it to produce. It may be your test uses a mocking framework and somewhere in there, there is an issue, with mixed up expected/actual you may assume a problem in your code rather than the test.&lt;/p&gt;
&lt;p&gt;Also, how do you make such an error? When I type Assert.AreEquals() in Visual Studio, Visual Studio tells me what each parameter does, it takes a matter of seconds to do this, just by hovering over the code.&lt;/p&gt;
&lt;p&gt;One last tip to say about tests. Write your tests to test the behaviour of your application.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Uploading Files to AWS</title>
      <link>https://www.funkysi1701.com/posts/2017/uploading-files-to-aws/</link>
      <pubDate>Mon, 03 Jul 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/uploading-files-to-aws/</guid>
      <description>&lt;p&gt;I am a fan of Azure but today I have been looking at AWS. Specifically how to upload and download files.&lt;/p&gt;
&lt;p&gt;AWS S3 stores files in Buckets. I already had an AWS S3 account setup with a Bucket. I am going to assume you have got a bucket setup and concentrate on the code to get files in and out.&lt;/p&gt;
&lt;p&gt;First step is to use nuget to install the AWS packages. In nuget the packages you want are called AWSSDK.Core and AWSSDK.S3.&lt;/p&gt;
&lt;p&gt;The using statements you want to use are called Amazon.S3 and Amazon.S3.Transfer, not sure why this doesn’t match nuget, this difference caught me out a couple of times.&lt;/p&gt;
&lt;p&gt;Now to the code that uploads files&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c#&#34; data-lang=&#34;c#&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;AmazonS3Client AWSclient = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; AmazonS3Client(accessKeyID, secretAccessKeyID, Amazon.RegionEndpoint.EUWest1);  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TransferUtility fileTransferUtility = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; TransferUtility(AWSclient);  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;using&lt;/span&gt; (FileStream streamWriter = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; FileStream(path, FileMode.Open))  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  TransferUtilityUploadRequest fileTransferUtilityRequest = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; TransferUtilityUploadRequest  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    BucketName = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;flawlessimages&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    InputStream = streamWriter,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Key = fileName  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  };  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  fileTransferUtility.Upload(fileTransferUtilityRequest);  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Lets break it down and look at what it does.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c#&#34; data-lang=&#34;c#&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;AmazonS3Client AWSclient = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; AmazonS3Client(accessKeyID, secretAccessKeyID, Amazon.RegionEndpoint.EUWest1);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This creates an instance of AmazonS3Client, we are passing the Access Key and Secret Access Key both of which can be found from your Amazon S3 account My Security Credentials section. Amazon.RegionEndpoint.EUWest1 specifies the amazon data centres that your bucket is located in.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c#&#34; data-lang=&#34;c#&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TransferUtility fileTransferUtility = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; TransferUtility(AWSclient);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This creates an instance of TransfterUtility using the AmazonS3Client instance we created in the previous step.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c#&#34; data-lang=&#34;c#&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;using&lt;/span&gt; (FileStream streamWriter = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; FileStream(path, FileMode.Open))  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This opens up a filestream from a files path and specifies that the file should be opened.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c#&#34; data-lang=&#34;c#&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TransferUtilityUploadRequest fileTransferUtilityRequest = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; TransferUtilityUploadRequest  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  BucketName = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;flawlessimages&amp;#34;&lt;/span&gt;,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  InputStream = streamWriter,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Key = fileName  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fileTransferUtility.Upload(fileTransferUtilityRequest);  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This last step specifies which bucket to upload to, what input stream to upload and the Key to use. Key is just AWS way of referring to files, more commonly referred to as the filename.&lt;/p&gt;
&lt;p&gt;This is all you need to do to upload a file to your Bucket. The file will be located at &lt;a href=&#34;https://s3-eu-west-1.amazonaws.com/[bucketname]/[filename]&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://s3-eu-west-1.amazonaws.com/[bucketname]/[filename]&lt;/a&gt;
, however by default it will not be downloadable until you set Read permission to everyone, once you do that anyone who has the link will be able to download your file.&lt;/p&gt;
&lt;p&gt;This is the same permission level as any file you have on your webserver, however AWS has a better way.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c#&#34; data-lang=&#34;c#&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;using&lt;/span&gt; (s3Client = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; AmazonS3Client(accessKeyID, secretAccessKeyID, Amazon.RegionEndpoint.USEast1))  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  GetPreSignedUrlRequest request1 = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; GetPreSignedUrlRequest  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    BucketName = bucketName,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Key = filename,  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Expires = DateTime.Now.AddMinutes(&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;)  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  };  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  urlString = s3Client.GetPreSignedURL(request1);  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here we are generating a url to download the file, but we are specifying that it is only valid for 5 minutes. This means that if you share the url it will only work for 5 minutes, after that AWS will give an access denied message.&lt;/p&gt;
&lt;p&gt;This is much better security than you have on a typical web server, and easy to implement, every time a user clicks on a download link you generate a new presigned url and send the download to the browser, as long as this process doesn’t take longer than 5 minutes the user will never know.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Using Azure WebJobs to Automate Stuff</title>
      <link>https://www.funkysi1701.com/posts/2017/using-azure-webjobs-to-automate-stuff/</link>
      <pubDate>Mon, 26 Jun 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/using-azure-webjobs-to-automate-stuff/</guid>
      <description>&lt;p&gt;I keep hearing about Azure WebJobs but I have never used them. Time to change this.&lt;/p&gt;
&lt;p&gt;WebJobs are a feature of Azure App Service that can run a script at a specific time. In my case I would like to hit a specific url of my website at the same time every day.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;WebJobs&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/06/addkeepalivewebjob.png?resize=313%2C615&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

To the right you can see an example of the WebJobs form on the Azure portal that you need to fill in.&lt;/p&gt;
&lt;p&gt;You need to supply a name for your webjob.&lt;/p&gt;
&lt;p&gt;You need to upload the script that will run in my case I used a powershell script. My script consisted of which basically just loads the url specified.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$progressPreference = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;silentlyContinue&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$result = Invoke-WebRequest -Uri (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://www.google.com&amp;#34;&lt;/span&gt;) -Method Get -UseBasicParsing;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Type refers to if your job will be triggered or run continuously, I want it to be triggered.&lt;/p&gt;
&lt;p&gt;Triggers refers to if you want it to be scheduled or manual, something that you can run on an ad hoc basis. I of course want scheduled.&lt;/p&gt;
&lt;p&gt;If you are familiar with the linux CRON then the next box will make sense to you for everyone else I will try and make sense of it. The box consists of 6 numbers which can either have a value or a *. The numbers correspond to the following {second} {minute} {hour} {day} {month} {day of the week}.&lt;/p&gt;
&lt;p&gt;A hourly job would be expressed as 0 0 * * * *, ie every day of week, every month, every day, every hour and only when minute and second equals zero. For more help with this check out the &lt;a href=&#34;https://docs.microsoft.com/en-us/azure/app-service-web/web-sites-create-web-jobs#CreateScheduledCRON&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;MSDN docs&lt;/a&gt;
 about it. I want to use 0 30 21 * * * to run daily at 9.30pm.&lt;/p&gt;
&lt;p&gt;That’s it everything setup, now time to wait and see if it works.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Oh no!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It failed to run at the specified time.&lt;/p&gt;
&lt;p&gt;The reason for this is the scheduler requires the feature Always On to be turned on which is not available in the free App Service. Before you reach for your wallets, I found a solution on this &lt;a href=&#34;https://tomssl.com/2016/12/20/how-to-get-azure-webjobs-to-run-indefinitely-for-free/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;blog post&lt;/a&gt;
 that allows them to run on the free tier.&lt;/p&gt;
&lt;p&gt;The thinking behind this solution is you need to keep the website alive throughout the day so Tom has created a script that does this. His script can be found on his blog or on his &lt;a href=&#34;https://github.com/TomChantler/Self-KeepAlive&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;github page&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;Set this script up to run every 5 minutes (0 */5 * * * *) like the example above.&lt;/p&gt;
&lt;p&gt;The nextthing you need to do is create a Custom connection string in the Application Settings blade called SecretThing. Tom’s script references this to access the website and keep it alive. The password you need to put in SecretThing can be found in you publish profile (downloaded from the Overview blade in the Azure portal). For more details and a better explanation check out &lt;a href=&#34;https://tomssl.com/2016/12/20/how-to-get-azure-webjobs-to-run-indefinitely-for-free/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Tom’s blog&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;One last thing to mention about WebJobs is that you can see details about when they have run at https://[YourWebAppName].scm.azurewebsites.net/azurejobs/#/jobs and this can be a great place to help debug your scripts.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Fiddler and APIs</title>
      <link>https://www.funkysi1701.com/posts/2017/fiddler-and-apis/</link>
      <pubDate>Mon, 19 Jun 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/fiddler-and-apis/</guid>
      <description>&lt;p&gt;A while ago I blogged about &lt;a href=&#34;https://www.funkysi1701.com/2017/04/17/automation-promotion/&#34;&gt;promoting&lt;/a&gt;
 my blog with Buffer. At the time I made use of the nuget package &lt;a href=&#34;https://www.nuget.org/packages/BufferAPI/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;BufferAPI&lt;/a&gt;
 but lets look at some improvements I can make.&lt;/p&gt;
&lt;p&gt;The BufferAPI package worked great from my console app, but when I tried to use it from a Controller in an MVC app I never got it to work. Lets look at the API docs and see if I can rewrite it.&lt;/p&gt;
&lt;p&gt;There are two main types of API calls GET which gets data from the server and POST which posts data to the server. These come from the types of HTTP requests.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;Alt Text&#34; src=&#34;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6wozrfdoqvtjaoxs7j1v.jpg&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;I quickly figured out how to use the GET API call to authenticate using &lt;a href=&#34;https://api.bufferapp.com/1/profiles.json?access_token=XXXX&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://api.bufferapp.com/1/profiles.json?access_token=XXXX&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;However POST was defeating me. That was until I remembered &lt;a href=&#34;http://www.telerik.com/fiddler&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Fiddler&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;I had heard Troy Hunt (and others) talk of using Fiddler to examine what data is being passed among websites. Troy uses it to do a man in the middle test to see what information can be stolen.&lt;/p&gt;
&lt;p&gt;It is really easy to setup, install Fiddler, click yes to a few security warnings and you can see what information is being passed from your code to remote APIs.&lt;/p&gt;
&lt;p&gt;Once I had Fiddler installed I could compare what information is being passed between a successful API call using the BufferAPI nuget package and an unsuccessful API call using my code.&lt;/p&gt;
&lt;p&gt;Fiddler also showed that passing my authentication token in a POST request is much better. Despite both GET and POST being encrypted when using HTTPS, anything at either end that logs URLs will have a log of your username and password.&lt;/p&gt;
&lt;p&gt;If you have not tried Fiddler, give it a try especially if you are doing things with API calls.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How do I add Power BI data to a webpage?</title>
      <link>https://www.funkysi1701.com/posts/2017/how-do-i-add-power-bi-data-to-a-webpage/</link>
      <pubDate>Mon, 12 Jun 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/how-do-i-add-power-bi-data-to-a-webpage/</guid>
      <description>&lt;p&gt;Last week I talked about &lt;a href=&#34;https://www.funkysi1701.com/2017/06/05/businessintelligence/&#34;&gt;Power BI&lt;/a&gt;
, what it is and some of the different services you can use with it. This week lets add some of that data to a simple web page.&lt;/p&gt;
&lt;p&gt;For this example I am going to add the google analytics data from this website to this page.&lt;/p&gt;
&lt;p&gt;First login to your Power BI &lt;a href=&#34;https://app.powerbi.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://app.powerbi.com/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Click the get data link at the bottom left.&lt;/p&gt;
&lt;p&gt;Click My Organisation to bring up the app search box.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;Alt Text&#34; src=&#34;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/46c1lyxy053xcq66fowf.jpg&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Click the Apps tab and search for “google” in the search box, you should then see Google Analytics, click into this and then click the get it now button.&lt;/p&gt;
&lt;p&gt;Log into your google account. If you  have multiple google accounts I found it worked best to sign out of all of them or run this in an incognito window.&lt;/p&gt;
&lt;p&gt;Once you are signed in you should see a list of the different google analytics data you have, select the one you want to use and click import.&lt;/p&gt;
&lt;p&gt;Power BI will then go away and start loading the data.&lt;/p&gt;
&lt;p&gt;Once loaded go to Reports and select the Google Analytics that has been loaded. If you have more than one, it is a good idea to rename each one eg Corporate Site Google Analytics, Blog Google Analytics so you won’t get mixed up.&lt;/p&gt;
&lt;p&gt;In the file menu select Publish to web and agree that you are OK for this to be made public.&lt;/p&gt;
&lt;p&gt;You will then be given a piece of HTML code that starts with &amp;lt;iframe copy this onto your web page. Reload your webpage and you should see something similar to mine below.&lt;/p&gt;
&lt;p&gt;It should be noted that while you can but the webpage containing the iframe behind a login page, the data could still be accessed if you knew the url contained within the iframe, this is why the link can be emailed and continue to work.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>What the heck is Business Intelligence?</title>
      <link>https://www.funkysi1701.com/posts/2017/businessintelligence/</link>
      <pubDate>Mon, 05 Jun 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/businessintelligence/</guid>
      <description>&lt;p&gt;The term &lt;strong&gt;Business Intelligence (BI)&lt;/strong&gt; refers to technologies, applications and practices for the collection, integration, analysis, and presentation of business information. The purpose of Business Intelligence is to support better business decision making. Essentially, Business Intelligence systems are data-driven Decision Support Systems (DSS). Business Intelligence is sometimes used interchangeably with briefing books, report and query tools and executive information systems.&lt;/p&gt;
&lt;h3 id=&#34;what-is-power-bi&#34;&gt;What is Power BI?&lt;a class=&#34;anchor ms-1&#34; href=&#34;#what-is-power-bi&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Power BI&lt;/strong&gt; is a business analytics service provided by Microsoft. It provides interactive visualisations with self-service business intelligence capabilities, where end users can create reports and dashboards by themselves, without having to depend on any information technology staff or database administrator.&lt;/p&gt;
&lt;p&gt;Microsoft describe it as follows: &lt;strong&gt;Power BI&lt;/strong&gt; is a suite of business analytics tools that deliver insights throughout your organisation. Connect to hundreds of data sources, simplify data prep, and drive ad hoc analysis. Produce beautiful reports, then publish them for your organisation to consume on the web and across mobile devices. Everyone can create personalised dashboards with a unique, 360-degree view of their business. And scale across the enterprise, with governance and security built-in.&lt;/p&gt;
&lt;h3 id=&#34;what-can-you-do-with-it&#34;&gt;What can you do with it?&lt;a class=&#34;anchor ms-1&#34; href=&#34;#what-can-you-do-with-it&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;One of the first thing you can do with Power Bi is connect some of the apps that you use.&lt;/p&gt;
&lt;p&gt;To sign up to use Power BI go to &lt;a href=&#34;https://powerbi.microsoft.com/en-us/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://powerbi.microsoft.com/en-us/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Once you are signed in click the get data link in the bottom left corner and browse through the apps you can use.&lt;/p&gt;
&lt;p&gt;If your website uses google analytics you can connect it up to Power BI and see some cool analytics. The below map was generated from some google analytics data, you can see that this website has had users across the globe, with UK and USA getting a lot of hits. &lt;img class=&#34;img-fluid&#34; alt=&#34;Business Intelligence from Google Analytics&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/06/Capture.jpg?resize=662%2C349&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Another thing you can do is connect Azure Application Insights. This provides some similar data to google analytics about who is visiting your site.&lt;/p&gt;
&lt;p&gt;If your code is hosted in Visual Studio Team Services you can get some cool analytics from your commit history. &lt;img class=&#34;img-fluid&#34; alt=&#34;Business Intelligence from VSTS&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/06/Capture-1.jpg?resize=662%2C177&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;There is a huge long list of apps you can connect to power BI so you can start getting all sorts of analysis very easily. I am hopefully going to talk another time about getting custom data into Power BI.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Have I Been Pwned?</title>
      <link>https://www.funkysi1701.com/posts/2017/have-i-been-pwned/</link>
      <pubDate>Mon, 29 May 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/have-i-been-pwned/</guid>
      <description>&lt;p&gt;Have you heard of the website &lt;a href=&#34;https://haveibeenpwned.com&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://haveibeenpwned.com&lt;/a&gt;
?&lt;/p&gt;
&lt;p&gt;Well you should have. Have I Been Pwned is a website created by security expert Troy Hunt that keeps track of data breaches and allows you to search and find ones that affect you. As I write this &lt;a href=&#34;https://www.troyhunt.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Troy Hunt&lt;/a&gt;
 has tracked 3,752,984,562 pwned accounts from 216 pwned websites.&lt;/p&gt;
&lt;h3 id=&#34;what-does-pwned-mean&#34;&gt;What does “pwned” mean?&lt;a class=&#34;anchor ms-1&#34; href=&#34;#what-does-pwned-mean&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;pwn means to compromise or control, specifically another computer (server or PC), website, gateway device, or application. (as defined on wikipedia)&lt;/p&gt;
&lt;p&gt;Originally, pwn and its variants were pronounced /ˈoʊn/ in the same way as the verb own, the tail of the p being “silent”.&lt;/p&gt;
&lt;p&gt;In terms of this site Troy Hunt defines it as:&lt;/p&gt;
&lt;p&gt;&lt;quote&gt;A &amp;ldquo;breach&amp;rdquo; is an incident where a hacker illegally obtains data from a vulnerable system, usually by exploiting weaknesses in the software. All the data in the site comes from website breaches which have been made publicly available.&lt;/quote&gt;&lt;/p&gt;
&lt;h3 id=&#34;what-can-i-do&#34;&gt;What can I do?&lt;a class=&#34;anchor ms-1&#34; href=&#34;#what-can-i-do&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;As an individual you can search for your email address in Have I Been Pwned, I am in 7 data breaches.&lt;/p&gt;
&lt;p&gt;As a person responsible for an email domain you can search and find which of your users are in a data breach.&lt;/p&gt;
&lt;p&gt;You can also sign up to get notified of any future data breaches you might get caught up in.&lt;/p&gt;
&lt;p&gt;If you are in a data breach change your password. If you use the same password across multiple sites or services change them as well. Consider using a &lt;a href=&#34;https://www.troyhunt.com/only-secure-password-is-one-you-cant/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;password manager&lt;/a&gt;
 so you can have unique complex passwords for every services you use and not have to worry about forgetting them.&lt;/p&gt;
&lt;p&gt;If you look after a website or service then follow Troy Hunt. Think about security, is your site vulnerable to SQL injection, do you store passwords with reversible encryption?&lt;/p&gt;
&lt;h3 id=&#34;how-worried-should-i-be&#34;&gt;How worried should I be?&lt;a class=&#34;anchor ms-1&#34; href=&#34;#how-worried-should-i-be&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Data breaches are happening more and more often. Its not showing any sign of slowing down, in fact I expect there to be lots more in the years to come. However there are things you can do to mitigate the damage of being in a breach.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use a password manager&lt;/li&gt;
&lt;li&gt;Don’t share passwords between sites&lt;/li&gt;
&lt;li&gt;Regularly change your passwords&lt;/li&gt;
&lt;li&gt;Think of passwords as pass phrases and include spaces between the different words&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Consider what information a company has about you. How worried would you be if this became public knowledge? Consider if you want this online, weigh up the benefits etc&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Star Trek Discovery – thoughts on new trailer</title>
      <link>https://www.funkysi1701.com/posts/2017/star-trek-discovery/</link>
      <pubDate>Mon, 22 May 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/star-trek-discovery/</guid>
      <description>&lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/UoV3kc05Nwc&#34; title=&#34;YouTube video player&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;I am really excited a new Star Trek Discovery trailer has just been released, if you haven’t seen it yet, watch it now.&lt;/p&gt;
&lt;p&gt;The rumour mill has been going crazy about Star Trek Discovery but now we have a trailer with actual footage to analyse. In my opinion all the concerns about changes in the production team have gone out the window, this looks to be a polished Star Trek show that can sit alongside our favourites.&lt;/p&gt;
&lt;h3 id=&#34;the-ship&#34;&gt;The Ship&lt;a class=&#34;anchor ms-1&#34; href=&#34;#the-ship&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;When images first surfaced of the ship I wasn’t keen, however all the shots of the ship look great. I assume this must be the USS Discovery, although it is hard to tell anything from a two minute advert.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/05/DAD0hTKUAAAUkTP.jpg?w=1199&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;h3 id=&#34;the-bridge&#34;&gt;The Bridge&lt;a class=&#34;anchor ms-1&#34; href=&#34;#the-bridge&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The Bridge looks recognisable as a Star Trek bridge, but also looks fresh and new. I think it feels very JJ Verse. I like it.&lt;/p&gt;
&lt;h3 id=&#34;the-uniforms&#34;&gt;The Uniforms&lt;a class=&#34;anchor ms-1&#34; href=&#34;#the-uniforms&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The uniforms look like a mid step between what we saw on Enterprise and what we know as the Classic Trek look. I can’t see any Blue, Red, Gold to signify departments, but it looked like Gold and Silver could well signify something. Really hard to tell at this stage, but I like what I can see.&lt;/p&gt;
&lt;h3 id=&#34;characters&#34;&gt;Characters&lt;a class=&#34;anchor ms-1&#34; href=&#34;#characters&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The show feels like it is going to be gritty and real. With characters you can really get behind. I liked what I saw of the captain and lead character. The alien character intrigued me, hopefully his line about death will be explored. It feels like there is a strong link between Vulcans and Sarek with the shows lead (played by Sonequa Martin-Green) Not sure how I feel about this yet, depends on what they do with it. I don’t want them to just redo what they have done with Spock, but again lets wait and see.&lt;/p&gt;
&lt;h3 id=&#34;klingons&#34;&gt;Klingons&lt;a class=&#34;anchor ms-1&#34; href=&#34;#klingons&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;OK I am not sure I like the strong emphasis on the Klingons. I think we have spent a lot of time learning about Klingons, so when I heard the casting news about Klingons I was not excited. The Klingons also have a new look, which doesn’t bother me that much as the Klingons have changed their look before. But lets wait and see what happens.&lt;/p&gt;
&lt;h3 id=&#34;star-trek-is-back&#34;&gt;Star Trek is back&lt;a class=&#34;anchor ms-1&#34; href=&#34;#star-trek-is-back&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;After over a decade with no Star Trek on TV, it is finally coming back. I am beyond excited about this. There are lots of things I want from this new show but this advert has definitely rekindled my excitement and hope that we are going to get something good.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Windows Update – don’t turn it off!</title>
      <link>https://www.funkysi1701.com/posts/2017/windows-update-dont-turn-off/</link>
      <pubDate>Mon, 15 May 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/windows-update-dont-turn-off/</guid>
      <description>&lt;p&gt;No blog post this week. However why not check out Troy Hunts blog article about &lt;a href=&#34;https://www.troyhunt.com/dont-tell-people-to-turn-off-windows-update-just-dont/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Windows Update&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/05/ximage7.png.pagespeed.gpjpjwpjwsjsrjrprwricpmd.ic_.OmA4sQpZUA.png?w=464&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;I am probably fairly unique in that I like installing updates whether it be on my phone, my PC or for one of my favourite programs. One of my tasks when I used to work in a sysadmin role was ensuring all windows updates got installed on all servers and client machines. It was a never ending task, as soon as you got almost all updates done, it would be update Tuesday and a new set of updates would be released.&lt;/p&gt;
&lt;p&gt;I can think of a couple of times an update got installed that caused a problem and needed to be rolled back. However I have no way of measuring how often it fixed a problem or improved the security of the OS or other software. If you compare the annoyance of waiting for updates to install against having a computer (or worse a server) be hacked or otherwise compromised I think it is fairly clear what you need to do.&lt;/p&gt;
&lt;p&gt;As someone who works in IT I feel it is my duty to share the importance of keeping your devices updated. Don’t turn automatic updates off or disable it. It is there to help you and keep your computer safe and secure.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>HighCharts</title>
      <link>https://www.funkysi1701.com/posts/2017/highcharts/</link>
      <pubDate>Mon, 08 May 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/highcharts/</guid>
      <description>&lt;p&gt;High Charts is a javascript library that allows graphs and charts to easily be added to web pages.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/05/chart.jpeg?resize=768%2C512&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;A chart like this can easily be added with a few lines of html and javascript.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;script&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;src&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://code.highcharts.com/highcharts.js&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;script&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;src&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://code.highcharts.com/modules/exporting.js&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;container&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This adds the highcharts library and a container for the chart to be displayed in.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Highcharts&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;chart&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;container&amp;#39;&lt;/span&gt;, {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;title&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;text&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Solar Employment Growth by Sector, 2010-2016&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;subtitle&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;text&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Source: thesolarfoundation.com&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;yAxis&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;title&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;text&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Number of Employees&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;legend&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;layout&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;vertical&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;align&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;right&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;verticalAlign&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;middle&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;plotOptions&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;series&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;pointStart&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2010&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;series&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; [{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Installation&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; [&lt;span style=&#34;color:#ae81ff&#34;&gt;43934&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;52503&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;57177&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;69658&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;97031&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;119931&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;137133&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;154175&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }, {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Manufacturing&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; [&lt;span style=&#34;color:#ae81ff&#34;&gt;24916&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;24064&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;29742&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;29851&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;32490&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;30282&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;38121&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;40434&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }, {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Sales &amp;amp; Distribution&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; [&lt;span style=&#34;color:#ae81ff&#34;&gt;11744&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;17722&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;16005&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;19771&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;20185&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;24377&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;32147&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;39387&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }, {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Project Development&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; [&lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;7988&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;12169&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;15112&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;22452&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;34400&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;34227&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }, {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Other&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; [&lt;span style=&#34;color:#ae81ff&#34;&gt;12908&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;5948&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;8105&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;11248&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;8989&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;11816&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;18274&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;18111&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This adds the data and sets up various options for the charts. More details about the different charts and options you can set can be found at &lt;a href=&#34;https://www.highcharts.com&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://www.highcharts.com&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;I am quite a fan of the different gauges that you can put on your site, as you can add a bit of animation and make the needles bounce around. &lt;a href=&#34;https://www.highcharts.com/demo/gauge-solid&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://www.highcharts.com/demo/gauge-solid&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/05/chart-1.jpeg?resize=750%2C250&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;As most of the data I deal with lives in a SQL Server database, I have been spending quite a bit of time writing Stored Procedures and functions to mould the data so I can easily pass data from the database to javascript.&lt;/p&gt;
&lt;p&gt;Highcharts are very flexible with lots of different options that allow you to display charts of almost any data you have, these charts are also exportable as PNG, JPEG, CSVs etc&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Office Move</title>
      <link>https://www.funkysi1701.com/posts/2017/office-move/</link>
      <pubDate>Mon, 01 May 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/office-move/</guid>
      <description>&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;New Rack&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/04/20170422_191127-e1493403982560-169x300.jpg?resize=169%2C300&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

For the past few weeks my software developing has been taking a back seat as I planned and coordinated the IT requirements of an office move.&lt;/p&gt;
&lt;p&gt;The company I work for has been working out of a converted barn, but as the company has grown we have outgrown the building and for quite a while it has been a real squeeze to get everyone in. We now have a shiny new offices with plenty of room for growth.&lt;/p&gt;
&lt;p&gt;It was at the start of the year when I first started getting involved with the new office. At that time building work was about to begin. The office had concrete floors so in order to get network and power points in the floor, channels would have to be cut into the concrete for the floor boxes and cable runs.&lt;/p&gt;
&lt;p&gt;At the old office our servers were in a cabinet in the corner of the room which meant they could be quite loud especially when the fans were going full pelt. Our American owners were supplying brand new IT equipment and we would have a dedicated server room.&lt;/p&gt;
&lt;p&gt;Soon a weekly conference call was setup so we could coordinate with the IT people in America and the various different contractors that would help deliver our new office.&lt;/p&gt;
&lt;p&gt;One thing I was particularly proud of was YDS. York Data Services (YDS) is an ISP I have worked with in the past at a previous job and I was able to continue my relationship with them and they were contacted and became our primary internet supplier.&lt;/p&gt;
&lt;p&gt;Unfortunately most ISPs have to deal with BTOpenreach who have a bit of a monopoly on getting phone lines or leased lines installed. The initial estimate we were given was two weeks after we were due to move in. It was looking like we would move in and two weeks later we would get an internet connection. We were in the process of getting quotes for a temporary internet connection when BT contacted us and could get us connected up. &lt;img class=&#34;img-fluid&#34; alt=&#34;New Office&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/05/18121045_1302238519862436_8711390769620542649_o.jpg?resize=300%2C225&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Soon afterwards a huge cabinet and two pallets full of equipment was delivered. Two days later a team was dispatched to rack everything up. On the rack we had the following equipment: 4 x UPS, 4 x Network Switches, 2 x Routers (for 2 x Leased Lines from different providers, the secondary connection has not been installed yet), 2 x Palo Alto Firewall devices, 2 x New Servers.&lt;/p&gt;
&lt;p&gt;Just prior to our move we had a rack full of equipment but no patch cables, nothing connected up and I was beginning to get concerned that we would not be ready in time.&lt;/p&gt;
&lt;p&gt;Thankfully a team was dispatched to help out over the weekend of the move, with the patch cables being delivered only hours beforehand. I worked closely with them and we worked late into the night. By the end of the Friday night our domain controller had been moved and its IP address updated. DHCP scopes had been setup for the new network. Once that was done we could get the WiFi points connected up (These had already been fitted to the ceiling).&lt;/p&gt;
&lt;p&gt;The following day we moved our existing servers and updated their IP addresses and got everything patched up. Furniture started arriving so desks could start being setup and phones connected up. Everything was slotting into place, and for the first time our new office was starting to look like an office.&lt;/p&gt;
&lt;p&gt;By the time it got to Monday the only problem was the phone number had not transferred as requested (something else to blame on BT) All staff could either connect via an Ethernet cable or connect to our brand new WiFi network and had access to all the IT services they had at the old office. Another minor issue was the NAS we used for backups had to be reset as it couldn’t communicate with the domain so no one could login, luckily this didn’t affect the data on it.&lt;/p&gt;
&lt;p&gt;From my perspective the move was a massive success considering how complex and how many different people had been involved.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>GitHub history</title>
      <link>https://www.funkysi1701.com/posts/2017/github-history/</link>
      <pubDate>Mon, 24 Apr 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/github-history/</guid>
      <description>&lt;p&gt;I created my GitHub account in August 2010, lets look at what I have done with it.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/04/git10.jpg?resize=768%2C173&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;In 2010 I started by committing the code for an old php website I had created. Then in December I committed some other php sites.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/04/git11.jpg?resize=768%2C171&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Between 12 December 2010 and 29 September 2011 I must have created some automated process which is why there is a commit every day. Looking at the diff it appears to be related to tracking visitors to a site. I assume back then I hadn’t heard of the .gitignore file!&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/04/git14.jpg?resize=768%2C174&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Nothing for a few years until 2014, when I started compiling a code samples collection, this is bits of code that I want to show off, I have added to this since 2015 so I really should go back to this as my skills have developed a bit since then.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/04/git15.jpg?resize=768%2C173&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;In 2015 I really started to think of myself as a developer, I added repositories for Raspberry Pi, and a few C# ideas I had. I ended the year taking part in Advent of Code&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/04/git16.jpg?resize=768%2C173&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;What did I do last year? Well I started going to York Code Dojo and this meant lots of forks from their code examples and also my first pull request. I also did a fair bit of looking at other repositories trying to find a good open source project to contribute to, still not found one for me yet. Lastly I ended 2016 with a bit of Advent of Code.&lt;/p&gt;
&lt;p&gt;Not sure how enthralling a blog post this is, but fascinating to see the different commit histories.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Automation of the Promotion of my Blog</title>
      <link>https://www.funkysi1701.com/posts/2017/automation-promotion/</link>
      <pubDate>Mon, 17 Apr 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/automation-promotion/</guid>
      <description>&lt;p&gt;I would like to automate the promotion of this blog. Currently to promote this blog on social media I use a few different services.
&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/04/img-buffer-illustration-hub-960@2x.png?w=1780&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Buffer (&lt;a href=&#34;https://buffer.com&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;buffer.com&lt;/a&gt;
) is a service that allows you to schedule updates to the main social media channels (Facebook, Twitter, LinkedIn and Google+)&lt;/p&gt;
&lt;p&gt;IFTTT or If This Then That (&lt;a href=&#34;https://ifttt.com&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;ifttt.com&lt;/a&gt;
) is a service that allows you to connect different online services. You can send an email when a specific event occurs in your calendar for example.&lt;/p&gt;
&lt;p&gt;I have been using a combination of these services to share to social media some of my past blog posts. I then add to my calendar details of my blog posts. Then I use IFTTT to add the event to Buffer, and then buffer tweets on a schedule.&lt;/p&gt;
&lt;p&gt;This works great however it is a manual process to add my posts to my calendar. I have been using a spreadsheet to help me generate an ics calendar file which I import into my google calendar. There must be a better way of doing this.&lt;/p&gt;
&lt;p&gt;I have written some code that reads the RSS feed of my blog and then shares that to Buffer using the Buffer API. The code I am creating is far from finished however I am trying to use the concepts of clean code to make it as flexible as possible.&lt;/p&gt;
&lt;p&gt;I have an interface called ISocial which my buffer code implements, but it would be easy to add a class that implements the same interface but uses the twitter or facebook APIs. My code reads from a specific WordPress RSS feed, but it should be easy enough to adapt to read from a SQL database or any other data source.&lt;/p&gt;
&lt;p&gt;I am currently unsure what kind of interface to use for this application. I could create a web page that controls the functionality, or maybe just a windows application, or maybe both of these are complicating things and all I need is just a console application that could be added as a scheduled task.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Blame</title>
      <link>https://www.funkysi1701.com/posts/2017/blame/</link>
      <pubDate>Mon, 10 Apr 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/blame/</guid>
      <description>&lt;p&gt;I recently came home from a busy day of work to my wife blaming me for allowing our 18 month old son to reach some paint and get it all over the carpet. She was concentrating on the fact that he could reach the paint not on the fact that she had brilliantly got the paint out of the carpet.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/04/blame-shifting.jpg?resize=300%2C300&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;My instinct on being blamed is to deny it, or start throwing blame back at her. It is possible I put the paint in his reach, it is also possible it was someone else.&lt;/p&gt;
&lt;p&gt;It is very easy to blame someone else. For example, looking through the git history to find out who changed a specific file is only a few clicks.&lt;/p&gt;
&lt;p&gt;But is it ever productive to blame someone? Is it not better to focus our energy on fixing the issue at hand?&lt;/p&gt;
&lt;p&gt;In the world of business it is easy to go from blaming other people until you have a blame culture. When you have a blame culture everyone starts looking out for themselves so it’s not them that gets the blame and productivity will suffer.&lt;/p&gt;
&lt;p&gt;I think it is more important to put in place​ processes to minimise issues happening again. If a deployment causes downtime, don’t ask who’s fault is it and sack them. Instead what can we do to reduce the chance of it happening again?&lt;/p&gt;
&lt;p&gt;As someone who has an interest in DevOps, I often break things and don’t want to get blamed for that, I do want to improve my processes so I am not always breaking the same things.&lt;/p&gt;
&lt;p&gt;What do you think about Blame? Is what can we do differently always better than who did this?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interfaces</title>
      <link>https://www.funkysi1701.com/posts/2017/interfaces/</link>
      <pubDate>Mon, 27 Mar 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/interfaces/</guid>
      <description>&lt;p&gt;I am trying to understand interfaces and when to use them in my code.&lt;/p&gt;
&lt;p&gt;An interface defines a contract and any class that implements that interface agrees to fulfil that contract.&lt;/p&gt;
&lt;p&gt;Lets look at an example as this tends to be how I learn best.&lt;/p&gt;
&lt;p&gt;Most applications require some sort of data to work from so lets start by defining IData which can load data.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;IData&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Blog LoadData(&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; Connectionstring);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;My interface defines one method LoadData and outputs an object called Blog (I will explain why in a minute)&lt;/p&gt;
&lt;p&gt;A common data source is a SQL database so we could define a SQL class that implements IData.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;SQL&lt;/span&gt; : IData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; Blog LoadData(&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; Connectionstring) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Blog blog = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Blog(); 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;using&lt;/span&gt; (SqlConnection con = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; SqlConnection(Connectionstring)) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      con.Open(); 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;//etc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We could also get data from an RSS feed of a blog (hence why I called the object Blog earlier)&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;XML&lt;/span&gt; : IData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{ 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; Blog LoadData(&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; Connectionstring) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    XmlDocument myXmlDocument = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; XmlDocument(); 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    myXmlDocument.Load(Connectionstring); 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Blog blog = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Blog(); 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;foreach&lt;/span&gt; (XmlNode RootNode &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; myXmlDocument.ChildNodes) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;//etc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Both classes implement IData and have a method called LoadData which has a string parameter and outputs a blog object. The string parameter is either a connection string to a SQL database or the URL of the rss feed. Not sure if there is a better way of doing this bit, maybe the name of the string needs making more generic.&lt;/p&gt;
&lt;p&gt;Now we have some classes that implement an interface what can we do with them. Lets write a class called GetData which gets data but doesn’t care if it comes form the rss feed or a SQL database.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;GetData&lt;/span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; IData _repo;         
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; GetData(IData repo) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    _repo = repo; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }         
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; Blog LoadData(&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; Connectionstring)        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {            
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; original = _repo.LoadData(Connectionstring);            
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; original;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When we call GetData we can either pass in XML or SQL as the class is not tied to either implementation. We could even write other classes that implement IData for testing purposes.&lt;/p&gt;
&lt;p&gt;My full code can be found on &lt;a href=&#34;https://github.com/funkysi1701/InterfaceExample&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;github&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;The advantages of writing code in this way include code that is easier to extend, easier to test and easier to maintain. This is only the start of my understanding and I am sure this is going to be a topic I come back to in the next few weeks.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>SOLID and other programming terms</title>
      <link>https://www.funkysi1701.com/posts/2017/solid-programming-terms/</link>
      <pubDate>Mon, 20 Mar 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/solid-programming-terms/</guid>
      <description>&lt;p&gt;This week I have been looking at improving my understanding of a few programming terms, like SOLID and I will try and define them so I can look back here when I get confused.&lt;/p&gt;
&lt;h3 id=&#34;mvc&#34;&gt;MVC&lt;a class=&#34;anchor ms-1&#34; href=&#34;#mvc&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I have previously blogged about &lt;a href=&#34;https://www.funkysi1701.com/2016/03/17/model-view-controller-mvc/&#34;&gt;MVC&lt;/a&gt;
, but my understanding was not 100% correct so I will refine this here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Model&lt;/strong&gt; – Now this is where my understanding was not quite correct. I thought the model was the actual source data, eg an XML file, SQL database etc. The model is the business logic so this is a processed version of the source data. MVC does not care where data is stored it can be flat files, SQL, XML or anything really.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;View&lt;/strong&gt; – This displays data to the user and typically is the HTML/CSS markup. Only display related logic would get included in the view.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Controller&lt;/strong&gt; – This is another place I had got a bit confused. I had thought all the logic lived here. This is incorrect controllers are only concerned with getting data between Model and View.&lt;/p&gt;
&lt;h3 id=&#34;solid&#34;&gt;SOLID&lt;a class=&#34;anchor ms-1&#34; href=&#34;#solid&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;SOLID are five principles of object oriented programming and design.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;S&lt;/strong&gt; is for Single Responsibility Principle. A class or piece of code should be responsible for doing one thing.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/03/SingleResponsibilityPrinciple2_71060858.jpg?resize=300%2C240&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;O&lt;/strong&gt; is for Open/Closed Principle. Code should be open for extensions but closed for modifications. Often this refers to the way you can implement an interface and add extra functionality.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/03/ocp.jpg?resize=300%2C240&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;L&lt;/strong&gt; is for Liskov Substitution Principle. Objects in a program can be replaced with subtypes of that object with out changing functionality.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/03/LiskovSubtitutionPrinciple_52BB5162.jpg?resize=300%2C240&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I&lt;/strong&gt; is for Interface Segregation Principle. Large interfaces should be split down into small interfaces so that clients only know about methods that are of interest.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/03/isp.jpg?resize=300%2C240&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;D&lt;/strong&gt; is for Dependency Inversion Principle. High and Low level modules should depend on abstractions.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/03/dip.jpg?resize=300%2C240&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;I need to look into SOLID some more but here are some &lt;a href=&#34;https://www.codeproject.com/Articles/703634/SOLID-architecture-principles-using-simple-Csharp&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;examples&lt;/a&gt;
.&lt;/p&gt;
&lt;h3 id=&#34;dry&#34;&gt;DRY&lt;a class=&#34;anchor ms-1&#34; href=&#34;#dry&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;DRY is simply Don’t Repeat Yourself. It is often easy to spot when a function call will help you not have to use the same bit of code in different places. I am often spotting places where I can put this into action.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Test Driven Development or TDD</title>
      <link>https://www.funkysi1701.com/posts/2017/test-driven-development-tdd/</link>
      <pubDate>Mon, 13 Mar 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/test-driven-development-tdd/</guid>
      <description>&lt;p&gt;A few weeks back I attended a talk at &lt;a href=&#34;http://www.agileyorkshire.org/event-announcements/tuesfebruary21st-drolivershawtestdrivendevelopmentthemostmisusedterminsoftwaredevelopmentandkeithwilliamsdependenciesinjectionandabstractionforfunandprofit&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Agile Yorkshire&lt;/a&gt;
 about Test Driven Development or TDD by Dr Oliver Shaw. I was impressed at how easy Oliver made it look, so as I have never tried it I thought I should give it a try.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/03/tdd_flow.gif?resize=287%2C300&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Test Driven Development or TDD is a way of development which starts with writing a Unit Test. First you write a failing test, then you write the code to make it pass, then you refactor your code. This can be remembered by thinking of &lt;strong&gt;Red, Green, Refactor&lt;/strong&gt;. Red being the failing test, Green being getting the test to pass, and Refactor being the refactoring.&lt;/p&gt;
&lt;p&gt;During the demonstration Oliver used a language called scala and a system that automatically reran all the tests after every change. I code with Visual Studio in C# is there a way I can get my tests to run automatically as well?&lt;/p&gt;
&lt;p&gt;A bit of googling and configuring I can answer this as Yes.&lt;/p&gt;
&lt;p&gt;The nuget package called &lt;a href=&#34;https://testergiles.herokuapp.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Giles&lt;/a&gt;
 is a watcher which will rerun your tests similar to how Oliver did it with his scalar environment. Fans of Buffy the Vampire Slayer will get the joke of why a watcher is called Giles. I couldn’t get this to work with MSTest but works fine with NUnit. There is a powershell script giles.ps1 which you need to run and will update every so often with how many tests have passed or failed. However you may not see this if you are coding in Visual Studio but there is a way to get a notification.&lt;/p&gt;
&lt;p&gt;If you install the application Growl you can get notifications from Giles which pop up and then disappear. So whatever you have on screen you can find out almost instantly if you have broken tests.&lt;/p&gt;
&lt;p&gt;Another thing that I wanted to configure is a way of viewing code coverage and which methods are tested and which aren’t. If you are familiar with VSTS after a build it gives you a percentage score for test coverage. I don’t find this overly useful as it doesn’t tell you what is covered and what isn’t. Also what if you want to use Github, how do you calculate the code coverage then?&lt;/p&gt;
&lt;p&gt;The nuget packages &lt;a href=&#34;https://www.nuget.org/packages/OpenCover/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;OpenCover&lt;/a&gt;
 and &lt;a href=&#34;https://www.nuget.org/packages/ReportGenerator/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;ReportGenerator&lt;/a&gt;
 allow a html report of code coverage to be produced. I created a batch script that can be run whenever you require this information.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[path]\OpenCover.Console.exe -target:&amp;#34;[path]\nunit3-console.exe&amp;#34; -targetargs:&amp;#34;[path]\Test.dll&amp;#34; -output:&amp;#34;[path]\coverage.xml&amp;#34; -register:user

[path]\ReportGenerator.exe &amp;#34;-reports:[path]\coverage.xml&amp;#34; &amp;#34;-targetdir:[path]&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The commands are fairly straightforward, the only tricky bit is sorting out all the filepaths to the different programs.&lt;/p&gt;
&lt;p&gt;Now that I have all this plumbing setup time to give TDD a try and see what I can build.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Github Vs Bitbucket Vs Visual Studio Team Services</title>
      <link>https://www.funkysi1701.com/posts/2017/github-vs-bitbucket-vs-vsts/</link>
      <pubDate>Mon, 06 Mar 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/github-vs-bitbucket-vs-vsts/</guid>
      <description>&lt;p&gt;As a developer using source control and git is bread and butter of what we do. Github is probably the most popular and widely known hosting service for source control but I have also used Bitbucket and Visual Studio Team Services. Lets have a look at each one and what they offer. Note while I have included prices I have only tried out the free versions.&lt;/p&gt;
&lt;h3 id=&#34;github&#34;&gt;Github&lt;a class=&#34;anchor ms-1&#34; href=&#34;#github&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/03/github-octocat.png?resize=300%2C158&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;URL: &lt;a href=&#34;https://github.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://github.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Private Repositories: Not Available for free&lt;/li&gt;
&lt;li&gt;Public Repositories: Unlimited&lt;/li&gt;
&lt;li&gt;Team Size: Unlimited&lt;/li&gt;
&lt;li&gt;Prices: $7 per month for unlimited private repositories, $25 per month for 5 users then $9 per month per user&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is probably the most widely used service for hosting code. Over 13 million repositories of code. This is an ideal solution if you want your code to be publicly viewable, but take care not to publish passwords, private keys or your companies trade secrets. Every developer should have a Github account for displaying bits of code they are proud of.&lt;/p&gt;
&lt;p&gt;There are a number of externally built APIs that link into Github for doing extra features, like building, code coverage etc&lt;/p&gt;
&lt;h3 id=&#34;bitbucket&#34;&gt;Bitbucket&lt;a class=&#34;anchor ms-1&#34; href=&#34;#bitbucket&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/03/d8TRzzL.png?resize=150%2C150&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;URL: &lt;a href=&#34;https://bitbucket.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://bitbucket.org/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Private Repositories: Unlimited&lt;/li&gt;
&lt;li&gt;Public Repositories: Unlimited&lt;/li&gt;
&lt;li&gt;Team Size: Less than 5&lt;/li&gt;
&lt;li&gt;Prices: $10 per month for 10 Users, $100 per month for 100 Users, $200 per month for Unlimited Users&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At my last job we used Bitbucket extensively for all our projects. All the code was private so only the team could access it, however before I left we were approaching the 5 user limit (but looking at these prices cost seems very reasonable)&lt;/p&gt;
&lt;h3 id=&#34;visual-studio-team-services&#34;&gt;Visual Studio Team Services&lt;a class=&#34;anchor ms-1&#34; href=&#34;#visual-studio-team-services&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2016/11/Visual-Studio-Team-Services.png?resize=300%2C136&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;URL: &lt;a href=&#34;https://www.visualstudio.com/team-services/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://www.visualstudio.com/team-services/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Private Repositories: Unlimited&lt;/li&gt;
&lt;li&gt;Public Repositories: Not Available&lt;/li&gt;
&lt;li&gt;Team Size: Less than 5&lt;/li&gt;
&lt;li&gt;Prices: $30 per month for 10 users, and other features paid for via Azure Invoices&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Visual Studio Team Services or VSTS is Microsoft’s version control solution and I have only just started using it, however what I have seen I like. There are lots of options for building your code so VSTS is more than just hosting your code it is verging on a Continuous Integration/Delivery solution. Being a Microsoft product there are numerous links to Azure and it is easy to deploy stuff to that platform.&lt;/p&gt;
&lt;p&gt;All three have options for tracking issues but VSTS have options to add Stakeholder users which would allow none developers to add and keep track of issues and progress with them.&lt;/p&gt;
&lt;p&gt;If I want to run tests, look at code coverage VSTS is probably the solution I would go for, if I want something that is public I would go for Github. What do you think which of these is your favourite?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Learning R</title>
      <link>https://www.funkysi1701.com/posts/2017/learning-r/</link>
      <pubDate>Mon, 27 Feb 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/learning-r/</guid>
      <description>&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;R&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/02/Exchange-Rate-Calculator.jpg?resize=300%2C202&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

Today I spent some time learning the R language.&lt;/p&gt;
&lt;p&gt;The problem I was trying to solve was to convert local prices of some items into Euros. I had been using a fixed exchange rate for all data, but as exchange rates fluctuate so much this is incorrect.&lt;/p&gt;
&lt;p&gt;My first though was to find a free API that I could query to get the values I wanted. The first API I found didn’t cover all the currencies, the next one I found I burnt through the free allowance in one pass.&lt;/p&gt;
&lt;p&gt;A colleague of mine mentioned using R to solve this, he sent me some links and I set out to write my first piece of R code.&lt;/p&gt;
&lt;p&gt;My finished code can be found on &lt;a href=&#34;https://github.com/funkysi1701/ExchangeRate/blob/master/script.R&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;github&lt;/a&gt;
 and I will attempt to explain some of it.&lt;/p&gt;
&lt;p&gt;R defines functions fairly simply&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-r&#34; data-lang=&#34;r&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nameoffunction &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;function&lt;/span&gt;(arg1, arg2)  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  arg1 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; arg2  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I have created a function that takes 2 parameters date and currency. I know I have about 10 different currencies that I want to get currencies for and I want to loop through each day so I will need to pass in a date.&lt;/p&gt;
&lt;p&gt;The source of my exchange rate information is the &lt;a href=&#34;https://www.xe.com&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;www.xe.com&lt;/a&gt;
 website, its historical exchange rate page passes currency and date into the query string so I should be able to build up a string containing all the different elements.&lt;/p&gt;
&lt;p&gt;All programming language can concatenate strings and R is no different. R uses paste()&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-r&#34; data-lang=&#34;r&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;var &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;paste&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hello&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;World&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;However R has an annoying feature in this function. I would expect that var in the above example would contain &amp;ldquo;HelloWorld&amp;rdquo;, it doesn’t it contains &amp;ldquo;Hello World&amp;rdquo;. Why it automatically adds a space I don’t know?&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-r&#34; data-lang=&#34;r&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;var &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;paste&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hello&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;World&amp;#34;&lt;/span&gt;, sep&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I am not entirely sure what all of the code does but I can take a good guess.&lt;/p&gt;
&lt;p&gt;read_html() I would guess loads a html page, html_nodes() finds all the html tags of a certain type on the page, in my case &amp;lt;table&amp;gt;, html_table() reads the first table it finds.&lt;/p&gt;
&lt;p&gt;table1[2] selects the second column, and head() selects a specific number of rows. I want the first row and second column so I combine these two as head(table1[2],1)&lt;/p&gt;
&lt;p&gt;Now that I have found my exchange rate what do I do with it? R can read and write to SQL Server so why not store this info in a SQL lookup table. I can then use this data in a stored procedure when I process my data.&lt;/p&gt;
&lt;p&gt;To query sql you can use sqlQuery(), it has two parameters, a sql connection and a TSQL command (eg a SELECT, INSERT, UPDATE statement)&lt;/p&gt;
&lt;p&gt;I use a while loop to loop through every day between 1st October 2016 and today and look up the exchange rate for each currency.&lt;/p&gt;
&lt;p&gt;For now I am manually running this R script, however there are ways to run R directly from SQL Server which I may well investigate. I could then have a SQL job to run this on a schedule, maybe once a day to get the latest exchange rates. I also would like to do something a bit cleverer like only getting exchange rates for the days that I need them by querying existing database tables.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Side Project – Connect 4</title>
      <link>https://www.funkysi1701.com/posts/2017/side-project-connect-4/</link>
      <pubDate>Mon, 06 Feb 2017 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2017/side-project-connect-4/</guid>
      <description>&lt;p&gt;Hello?&lt;/p&gt;
&lt;p&gt;You have probably like me almost forgotten about this blog. Life has got in the way over the last few months, but lets see if I can restart my blogging habit.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2017/02/Connect4.png?w=639&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;In 2017 I want to start a side project for a few reasons. I want to improve my coding skills and look at things I wouldn’t normally during my day job.&lt;/p&gt;
&lt;p&gt;I have been trying to decide what to build. The actual project doesn’t matter too much, it is the techniques I use during build that matters the most. I would like something that I can start off as a windows app and then extend onto the web or mobile apps.&lt;/p&gt;
&lt;p&gt;I started off thinking about a Rubik’s cube app, however my initial coding has lead me to believe it is probably too complex for my first app.&lt;/p&gt;
&lt;p&gt;Last year I spent an evening looking at Connect 4 during a &lt;a href=&#34;https://yorkcodedojo.github.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;York Code Dojo&lt;/a&gt;
 session. I think this should be complex enough that I can code some logic to efficiently solve the game, however not too complex I get defeated before building too much.&lt;/p&gt;
&lt;p&gt;So far I have built a console app that displays via Console.Write() commands, a grid to represent the game, with 0 meaning empty, 1 red and 2 yellow etc. I am currently working on the logic to solve the game, once I have that in a good state I can extend into a winforms app, into a web (MVC most likely) app and finally a mobile app (I have no knowledge about how to do this yet, but something I would like to try one day).&lt;/p&gt;
&lt;p&gt;Over the last few days I listened to .NetRocks where they discussed &lt;a href=&#34;https://www.dotnetrocks.com/?show=1396&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Progressive Web Apps&lt;/a&gt;
. This sounds like a great challenge for me to aim for. A progressive Web App is a website that automatically detects various properties to give you an app that runs well whatever the state of your internet connection and whatever browser you are in.&lt;/p&gt;
&lt;p&gt;I have lots to learn but I can split it down into small sections and I can build something that demonstrates some of my skills.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>What should be in Source Control?</title>
      <link>https://www.funkysi1701.com/posts/2016/what-should-be-in-source-control/</link>
      <pubDate>Thu, 24 Nov 2016 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2016/what-should-be-in-source-control/</guid>
      <description>&lt;p&gt;I am currently working on source code that is over 5Gb in size. This is mostly due to a poorly thought out folder structure, there are code files, images and Excel files all jumbled together. I think a clear distinction should be made between source code and data.&lt;/p&gt;
&lt;h3 id=&#34;source-code&#34;&gt;Source Code&lt;a class=&#34;anchor ms-1&#34; href=&#34;#source-code&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I will define source code as anything that is written in order to compile and run the project. If it is a webpage it will be all the HTML, CSS and Javascript or any file used to produce these. I would also include any configuration files and files used to build/deploy the website or project. Anything that is compiled from your source files can safely be ignored.&lt;/p&gt;
&lt;h3 id=&#34;data&#34;&gt;Data&lt;a class=&#34;anchor ms-1&#34; href=&#34;#data&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I would define data as anything that is added to the project during its life. So if you have an upload option, anything that is uploaded I would describe as data. The site should still function without (or very little) data.&lt;/p&gt;
&lt;h3 id=&#34;images&#34;&gt;Images&lt;a class=&#34;anchor ms-1&#34; href=&#34;#images&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Images can fit into both groups. Any icons or images attached to the functionality of the project I would class as source code. However anything that is uploaded should be classed as Data.&lt;/p&gt;
&lt;h3 id=&#34;databases&#34;&gt;Databases&lt;a class=&#34;anchor ms-1&#34; href=&#34;#databases&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The database should also be classed as both. The data, anything that is inside a database table should normally be classed as data. Stored Procedures, Functions and Views are all Source Code and would benefit from version control.&lt;/p&gt;
&lt;h3 id=&#34;source-control--backup&#34;&gt;Source Control != Backup&lt;a class=&#34;anchor ms-1&#34; href=&#34;#source-control--backup&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Source control is not an excuse not to backup things. Don’t just commit files to source control so you know you can restore them if you need to. Files in general in source control are there so you can see how they changed over time as the code base changed. Files in you backup are a snapshot of what the application was at a point in time and will include ALL the data.&lt;/p&gt;
&lt;p&gt;One last point before I end. If you are hosting on a Cloud Computing platform like Azure it gives you an easy way to distinguish between Data and Code.&lt;/p&gt;
&lt;p&gt;Anything in your&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Web App = Code&lt;/li&gt;
&lt;li&gt;Blob Storage = Data&lt;/li&gt;
&lt;li&gt;SQL = Data/Code&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each project is unique and there will always be exceptions to these suggestions but I think this is a good goal to have. What do you think?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Getting control of a codebase</title>
      <link>https://www.funkysi1701.com/posts/2016/getting-control-of-a-codebase/</link>
      <pubDate>Thu, 17 Nov 2016 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2016/getting-control-of-a-codebase/</guid>
      <description>&lt;p&gt;So recently I started working on a new codebase. I will be honest when I first saw it, it was a mess. Here are a few of the things I did to try and regain control.&lt;/p&gt;
&lt;p&gt;I was given access to the source code on Visual Studio Team Services. However this consisted of a single commit 3 months ago. When I looked at what was running on the production server it was clear that changes were being made live with no regard for source control.&lt;/p&gt;
&lt;p&gt;The first thing I did was commit everything that was running live into source control.&lt;/p&gt;
&lt;p&gt;Next I created a SQL Server Data Tools (SSDT) project to keep track of all the database objects. Previously there was a folder with some stored procedures in it, but these did not match with what was currently running.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/12/sql-server-2012-management-studio-splash-screen.png?resize=300%2C204&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;I now had in source control the current state of the website and the database, so I knew I could get things back to this state if I made some bad changes.&lt;/p&gt;
&lt;p&gt;Lets start by looking at the website code I had. There was no solution file, the only way to look at the website was to setup my local IIS to run what was in the website folder. I could then use Visual Studio to &amp;ldquo;open&amp;rdquo; my local IIS website and attach to process to debug it.&lt;/p&gt;
&lt;p&gt;Next I Looked at Default.aspx to see how the website worked. The majority of the website code was stored in the database stored procedures. After the tag there was a &amp;lt;% %&amp;gt; which contained a Response.Write(RunSP.RunStoredProcedure(Parameter1, Parameter2, &amp;hellip;) command, which executed a stored procedure and the results of the stored procedure was the html code including any javascript that the webpage needed to display. I will be honest I have never seen any code like it. My guess is that the developer was secretly a DBA and wanted to make any web page changes by just changing how the stored procedures work.&lt;/p&gt;
&lt;p&gt;This meant that the website is not going to do anything without a backup of the database running, and meant my SSDT project was going to be vital. However the database was in a bad state, it consisted of a fair few broken objects and SSDT would not build.&lt;/p&gt;
&lt;p&gt;Using find I went through each of the broken database objects to find where in the code they were being used. Luckily most were referenced in commented out code, so I just removed all the broken database objects. The database could now be built. However there was a dependency on the users table of another database. (This was the developers solution to sharing logins between websites) As I was using SSDT I added a database dependency, problem solved for now.&lt;/p&gt;
&lt;p&gt;Next I tried publishing my database. SQL CMD encountered a parsing error.  The reason for this was my SPs contained javascript eg $(document), SQL CMD uses $(DatabaseName) as variables for different database so it was getting itself confused.&lt;/p&gt;
&lt;p&gt;My solution was to use Find and Replace to replace all the $ with &amp;rsquo; + CHAR(36) + &#39;&lt;/p&gt;
&lt;p&gt;So I now have a SSDT project that builds and publishes but still no website project.&lt;/p&gt;
&lt;p&gt;To get the website running from Visual Studio I started off creating a .Net 4 website project and added Entity Framework 5 and MVC 3 via nuget. I then copied all the website code into the new project, and with a bit of work I got it to build. Most of the work was relating to namespaces and referencing the correct one and moving the EF model from AppCode to a custom named folder. A bit of trial and error later I had a version of the website that could be run from Visual Studio.&lt;/p&gt;
&lt;p&gt;I have not deployed my new version of the website as it needs further testing. No automated testing or even a smoke test checklist currently exist.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2016/11/Visual-Studio-Team-Services.png?w=960&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;As my source code is hosted on Visual Studio Team Services (VSTS), I can get VSTS to build each commit and check I haven’t broken the build. This is not that helpful at the moment, hopefully one day I will have automated tests that can be run here as well.&lt;/p&gt;
&lt;p&gt;Wow, I feel like I have done loads with this code so far but there is loads more still to do. I need to understand more about the business processes behind the code with a hope to understand why some architectural decisions have been made. I want to refactor the code as much as is possible, I would like to remove much of the html/javascript from the stored procedures as I can’t see that there is any advantage to running a website like this. Please correct my if I am wrong.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>LINQ</title>
      <link>https://www.funkysi1701.com/posts/2016/linq/</link>
      <pubDate>Thu, 06 Oct 2016 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2016/linq/</guid>
      <description>&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2016/10/step30.jpg?w=515&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;h3 id=&#34;what-is-linq&#34;&gt;What is LINQ?&lt;a class=&#34;anchor ms-1&#34; href=&#34;#what-is-linq&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;LINQ&lt;/strong&gt; is an acronym for Language Integrated Query, which describes where it’s used and what it does. The Language Integrated part means that LINQ is part of programming language syntax. In particular, both C# and VB are languages that ship with .NET and have LINQ capabilities.&lt;/p&gt;
&lt;h3 id=&#34;how-do-i-use-linq-in-my-c-code&#34;&gt;How do I use LINQ in my C# code?&lt;a class=&#34;anchor ms-1&#34; href=&#34;#how-do-i-use-linq-in-my-c-code&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;To use LINQ the first thing you need to do is add the LINQ using statement.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;using&lt;/span&gt; System.Linq;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In your code you need a datasource, for this example I am going to use a simple array, but it can be anything eg SQL, XML etc&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;[] data = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;[&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;] { &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;7&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;9&lt;/span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next you need a LINQ query. (Note I know the Q in LINQ means query, so I have just written query query, if you are one of those people who hates seeing PIN number you might not like this blog post.) A LINQ query is very similar to a T-SQL query, so if like me you are good with databases this should make sense to you.&lt;/p&gt;
&lt;p&gt;In T-SQL you can have:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; num
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;WHERE&lt;/span&gt; num &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In LINQ this becomes:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; query =
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;from&lt;/span&gt; num &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; data
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;where&lt;/span&gt; num == &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;select&lt;/span&gt; num;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Finally you need to do  something with the query you have written. I am just going to print the results of my query to console.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;foreach&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; num &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; query)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Console.Write(num);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;what-other-sql-like-syntax-can-i-use&#34;&gt;What other SQL like syntax can I use?&lt;a class=&#34;anchor ms-1&#34; href=&#34;#what-other-sql-like-syntax-can-i-use&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In T-SQL you can control ordering using ORDER BY, LINQ has a similar syntax orderby&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;orderby&lt;/span&gt; num &lt;span style=&#34;color:#66d9ef&#34;&gt;descending&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In T-SQL you can use GROUP BY, to do something similar with LINQ&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;group&lt;/span&gt; num &lt;span style=&#34;color:#66d9ef&#34;&gt;by&lt;/span&gt; num.Type &lt;span style=&#34;color:#66d9ef&#34;&gt;into&lt;/span&gt; type
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;select&lt;/span&gt; type
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;foreach&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; type &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; query)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Console.Write(type.Key);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;foreach&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; num &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; type)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Console.Write(num);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;joins&#34;&gt;JOINS&lt;a class=&#34;anchor ms-1&#34; href=&#34;#joins&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;So you thought joining tables was a SQL Server only thing. Think again you can do this in LINQ&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; joinquery =
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;from&lt;/span&gt; cust &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; customers
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;join&lt;/span&gt; prod &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; products &lt;span style=&#34;color:#66d9ef&#34;&gt;on&lt;/span&gt; prod.CustomerId &lt;span style=&#34;color:#66d9ef&#34;&gt;equals&lt;/span&gt; cust.Id
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;select&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; { ProductName = prod.Name, CustomerName = cust.CompanyName };
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion&lt;a class=&#34;anchor ms-1&#34; href=&#34;#conclusion&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;There are loads more LINQ functionality that you can use. While writing this blog I found &lt;a href=&#34;https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b&lt;/a&gt;
 which has loads of examples of different queries that you can write with LINQ.&lt;/p&gt;
&lt;p&gt;This has inspired me to use LINQ more in my code and learn more about the different queries that could be written.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Looking back Ten years</title>
      <link>https://www.funkysi1701.com/posts/2016/looking-back-ten-years/</link>
      <pubDate>Thu, 29 Sep 2016 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2016/looking-back-ten-years/</guid>
      <description>&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2016/09/10-year-term-life-insurance.gif?resize=471%2C314&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Next month I will celebrate ten years working at my current job, two weeks after that I will start a new chapter of my life at a new company. Lets take this opportunity to look back ten years at some of the great stuff I have achieved.&lt;/p&gt;
&lt;h3 id=&#34;2006&#34;&gt;2006&lt;a class=&#34;anchor ms-1&#34; href=&#34;#2006&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In 2006 I had no IT experience. If you were to ask me where Event Logs could be found I wouldn’t know, and the letters DNS meant nothing to me. I was quiet and shy but hard working. The idea of making IT my career hadn’t occurred to me, this was just a job.&lt;/p&gt;
&lt;p&gt;I started off life doing first line support and compiling health and safety files onto CD-ROMs (known by the company as Eurofiles) with HTML. At the time the company had a mix of Windows 2000 and Windows XP, using MS Office 2003. Server wise I can’t remember exactly but I think two domain controllers, a database server and a backup server using a tape drive. At this point in time I don’t believe I did a lot with the servers but I think the servers were running Windows Server 2005.&lt;/p&gt;
&lt;p&gt;As time went on I learnt more and more about what the company did and how stuff worked.&lt;/p&gt;
&lt;h3 id=&#34;nagios&#34;&gt;Nagios&lt;a class=&#34;anchor ms-1&#34; href=&#34;#nagios&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;One of my early achievements was setting up a nagios server. I have blogged about &lt;a href=&#34;https://www.funkysi1701.com/posts/2014/i-love-nagios/&#34;&gt;Nagios&lt;/a&gt;
 before, but it is a server monitoring system that runs on linux. I am extremely proud of what I have achieved here, no one else in the company had my knowledge of how nagios worked. Initially I even experimented with using a cheap mobile phone connected to the serial port (remember when PCs had these?) to send SMS messages to alert of down time. However this was abandoned when I burned through all the credit on this phone.&lt;/p&gt;
&lt;p&gt;Nagios is still used today, and my current team have been shown how to extend the system as the business changes. My philosophy has always been if we have a problem that Nagios didn’t warn us about we need an extra nagios test. These days the nagios web interface is publicly available on the internet so can be checked from anywhere (assuming the office internet is up!) and a mobile app replaces the SMS idea we originally had.&lt;/p&gt;
&lt;h3 id=&#34;2011&#34;&gt;2011&lt;a class=&#34;anchor ms-1&#34; href=&#34;#2011&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;At the end of 2010 the IT Manager resigned, then the Developer resigned and finally the Lead Developer resigned. I was alone. I was IT Manager. I negotiated my first pay rise since joining the company. I was IT.&lt;/p&gt;
&lt;p&gt;Wow things were stressful back then. I had so much to learn but somehow I managed. I learnt how to Interview, yes I have employed some clangers along the way, but also some great staff. As well as internal staff I learnt to deal with contractors. We had contractors to help with our internal systems and also contractors to do development work. One thing I have learnt about contractors is that you will always have to chase them at some point to deliver what you are paying them for.&lt;/p&gt;
&lt;h3 id=&#34;server-migration&#34;&gt;Server Migration&lt;a class=&#34;anchor ms-1&#34; href=&#34;#server-migration&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Around the start of 2011 our email server started to show its age. Exchange 2003 had a hard limit on the size of its information store and we were rapidly approaching this. Along with an IT contractor I worked to migrate to Exchange 2010, this was a huge project and caused all sorts of issues which we just worked through. Since then I have done other migrations so Windows Server 2012 and also virtualized many servers in 2013.&lt;/p&gt;
&lt;h3 id=&#34;bandwidth&#34;&gt;Bandwidth&lt;a class=&#34;anchor ms-1&#34; href=&#34;#bandwidth&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A major limit with our infrastructure has always been the internet connection coming in. For a while we tried to load balance three ADSL connections, but the upload speed was always a limiting factor. It was a major victory for the simplification of our network when we got a leased line installed into our head office, helped by a government grant we gave us free installation. Not content with this I did the same again for our second York office, including the free installation.&lt;/p&gt;
&lt;h3 id=&#34;learning-development&#34;&gt;Learning Development&lt;a class=&#34;anchor ms-1&#34; href=&#34;#learning-development&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Since I started I have always been learning development stuff. But in the past few years I have learnt a massive amount helped largely by two main things. My boss passing lots of my responsibility onto others and dedicating lots of my time to development tasks, and also the opportunity to learn with our outsourced development team.&lt;/p&gt;
&lt;h3 id=&#34;finishing-off&#34;&gt;Finishing off&lt;a class=&#34;anchor ms-1&#34; href=&#34;#finishing-off&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;There are a few things that have been ongoing that we have wanted to change since I started which I can’t really take the credit for as they are not complete yet, but I am proud as they may be finished in the next few months.&lt;/p&gt;
&lt;p&gt;The company stores calendar information in one giant excel spreadsheet, this is being replaced by outlook calendars.&lt;/p&gt;
&lt;p&gt;Our last Windows Server 2003 server and tape drive is being decommissioned. This is the only server that has been running for the entire time I have been here.&lt;/p&gt;
&lt;p&gt;The way the company keeps track of work coming in and who does what is being reviewed. Over the years many people have tried to adapt the old database that one of the directors created in Access many years ago. I did a major overhaul recently to delete unused columns and added extra invoicing functionality. What is needed is a fresh system, maybe a CRM can do everything they want. I wish them lots of luck in doing this as I know it won’t be easy but it has to be done.&lt;/p&gt;
&lt;h3 id=&#34;2016&#34;&gt;2016&lt;a class=&#34;anchor ms-1&#34; href=&#34;#2016&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;There are many other projects and pieces of work that I have done that I am proud of. In 2016 I will leave a stable IT department. All clients are on Windows 10 and using Office 2010. We have virtual servers running Server 2012 and are using some great services from Azure to run our SaaS websites. There are of course things I would have liked to achieve, and things I wish I had done differently but on the whole it feels like the right time to move on, especially now long running projects are starting to conclude.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>10 Ways to Survive as an IT Manager</title>
      <link>https://www.funkysi1701.com/posts/2016/10-ways-to-survive-as-an-it-manager/</link>
      <pubDate>Thu, 22 Sep 2016 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2016/10-ways-to-survive-as-an-it-manager/</guid>
      <description>&lt;p&gt;So after five and a bit years of being an IT Manager here is some advice I have learned along the way in no particular order. On the whole I have enjoyed myself but it has been a real challenge at times.&lt;/p&gt;
&lt;h2 id=&#34;1-figure-out-what-plates-are-still-spinning&#34;&gt;1. Figure out what plates are still spinning&lt;a class=&#34;anchor ms-1&#34; href=&#34;#1-figure-out-what-plates-are-still-spinning&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Being an IT Manager is all about keeping everything running all of the time. A bit like spinning 5 or 6 plates. You have plates for your servers and network infrastructure, you have plates for bespoke databases that you maintain, you have plates for your staff (including any external contractors), you have plates for any websites or apps that you develop. That is a lot of plates to keep spinning and that before you start thinking about what your boss wants you to deliver. Make sure you know what is happening with all these plates, which ones are happy, which ones are on the way to the floor and which ones you need to get the glue out and repair.&lt;/p&gt;
&lt;h2 id=&#34;2-make-it-someone-elses-problem&#34;&gt;2. Make it someone else’s problem&lt;a class=&#34;anchor ms-1&#34; href=&#34;#2-make-it-someone-elses-problem&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you can blame someone else do so. If your internet goes down it is your ISPs fault. If your website dies its your hosting company’s fault. Take responsibility for problems but if when something goes wrong you can pick up the phone and ask for help, it will make your life easier.&lt;/p&gt;
&lt;h2 id=&#34;3-hire-good-staff&#34;&gt;3. Hire good staff&lt;a class=&#34;anchor ms-1&#34; href=&#34;#3-hire-good-staff&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Hiring poor staff wastes time and money and makes you look bad by others. Demand the highest salary band for new staff that you can afford and don’t agree to hiring anyone that you have doubts about. It is easy to bow to the pressure to get someone quickly but this will always result in worse problems in the long run. Once you have a good team do your best to keep them, and warn upper management of the problems if staff leaves (basically make it their problem not yours!).&lt;/p&gt;
&lt;h2 id=&#34;4-learn-learn-learn&#34;&gt;4. Learn, Learn, Learn&lt;a class=&#34;anchor ms-1&#34; href=&#34;#4-learn-learn-learn&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You may or may not have the opportunity to go on training courses. Whatever your situation spend time learning new stuff that will benefit the company and yourself. You can learn a lot by reading online, you can petition for training from your managers, you can fund training yourself, you can ask for help from your different suppliers. The more you learn, the more you can do and the more useful you can be to the company, plus the more interesting you will find the job.&lt;/p&gt;
&lt;h2 id=&#34;5-say-no&#34;&gt;5. Say No!&lt;a class=&#34;anchor ms-1&#34; href=&#34;#5-say-no&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Don’t be afraid to say no. You will always be asked to do the impossible and if something is impossible say so at the start. It wastes everyone’s time if you spend a lot of time trying to do the impossible. Always give your reasons for saying no, and if you always say no people will think you are unhelpful. A better way to say no is to come up with a better solution. No I can’t do it your way but here is a better solution.&lt;/p&gt;
&lt;h2 id=&#34;6-dont-give-estimates&#34;&gt;6. Don’t give estimates&lt;a class=&#34;anchor ms-1&#34; href=&#34;#6-dont-give-estimates&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you are asked how long something will take you don’t answer straight away or give an exaggerated estimate. Go away and spend some time thinking of everything that is involved before replying. There will always be something that you forgot to consider when first asked about it and looking at the different components will help plan out the work needed as well as provide an estimate.&lt;/p&gt;
&lt;h2 id=&#34;7-know-what-to-tell-your-boss-and-what-not-to&#34;&gt;7. Know what to tell your boss, and what not to&lt;a class=&#34;anchor ms-1&#34; href=&#34;#7-know-what-to-tell-your-boss-and-what-not-to&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is a hard one to get the balance right for. You need to tell your boss enough so that they appreciate all that you do, but too much and they will stop listening and accuse you of talking in technobabble. I have never got the balance right with this one. I have always aired on the side of not telling my boss enough, and hence they don’t realize that I saved the day on Sunday night as everything is working again on Monday. Do repeat yourself. If your server is running low on resources start asking for replacement hardware early, and increase the frequency and the panic in line with the problems it is causing.&lt;/p&gt;
&lt;h2 id=&#34;8-understand-the-problems-of-the-business&#34;&gt;8. Understand the problems of the business&lt;a class=&#34;anchor ms-1&#34; href=&#34;#8-understand-the-problems-of-the-business&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2016/09/bhrzpww6aehdx1wvrrug.jpg?w=800&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Businesses need to make money. If the one you work for isn’t making enough money you will soon be looking for another. If you work for IT you will quickly start to see the problems of the business, think about what simple changes IT could make to improve things that would benefit the whole company. Some of your suggestions won’t go anywhere, but some may have a massive impact. I can think of a few changes that IT have spearheaded that I am very proud of, upgrading our internet connection, simplifying or automating processes and delivering new versions of software.&lt;/p&gt;
&lt;h2 id=&#34;9-ask-for-help&#34;&gt;9. Ask for help&lt;a class=&#34;anchor ms-1&#34; href=&#34;#9-ask-for-help&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Don’t be afraid of asking for help. There are lots of places to look for help. Other departments could take more on, you could recruit extra help, you could hire external contractors. You can ask questions on support forums like &lt;a href=&#34;https://serverfault.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;ServerFault&lt;/a&gt;
 or &lt;a href=&#34;https://stackoverflow.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;StackOverflow&lt;/a&gt;
, many software re-sellers or other suppliers are a good point of contact for questions about things they supply. Microsoft Support was also invaluable for a server issue.&lt;/p&gt;
&lt;h2 id=&#34;10-think-about-disasters&#34;&gt;10. Think about disasters&lt;a class=&#34;anchor ms-1&#34; href=&#34;#10-think-about-disasters&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Write a disaster recovery plan or backup policy. Yes there will always be something more important that needs doing, but just stop for a moment to think how you would feel if everything died on your watch. The one thing you can rely on with technology is that it will fail at some point. A back of the envelope plan of action is better than no plan at all, even better is a detailed plan of what to do when each and every service you rely on fails. Plan additional services with an idea of adding extra redundancy. Always have multiple Domain Controllers, think about what data you could run from the Cloud. VMs could be replicated to the Cloud, and servers could be run from there.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Imposter Syndrome</title>
      <link>https://www.funkysi1701.com/posts/2016/imposter-syndrome/</link>
      <pubDate>Thu, 15 Sep 2016 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2016/imposter-syndrome/</guid>
      <description>&lt;p&gt;This week I handed in my notice at a job I have had for almost ten years. In a few weeks time I will start a brand new job as a web applications developer.&lt;/p&gt;
&lt;p&gt;This is a great achievement for me and a great chance to learn and expand my development skills.&lt;/p&gt;
&lt;p&gt;However moments after I handed my notice in, a huge wave of uncertainty enveloped me. I have read about this and I think I was suffering from an attack of &lt;strong&gt;Imposter Syndrome&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Despite external evidence of their competence, those with the syndrome remain convinced that they are frauds and do not deserve the success they have achieved. Proof of success is dismissed as luck, timing, or as a result of deceiving others into thinking they are more intelligent and competent than they believe themselves to be.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2016/09/1429677066685.rendition-medium.jpg?w=598&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;I started to convince myself I couldn’t do the job I had just accepted and that moments after I arrived on my first day I would be found out as a fraud and kicked out the door.&lt;/p&gt;
&lt;p&gt;My logical brain was no match for the Imposter Syndrome. Having been kicked out the door of this new job, I would become penniless in no time with no employer (even my previous boss wouldn’t want me back) or recruitment agency willing to speak with me.&lt;/p&gt;
&lt;p&gt;OK lets see if we can fight off the Imposter Syndrome and look at a possible worse case scenario. I start at my new job, it is very hard work and a month or so later I have to move on.&lt;/p&gt;
&lt;p&gt;No employer ever would sack me on my first day. My first day will be lots of learning how they do things, looking at procedures. I have lots of experience of learning new things, looking at procedures and if I put the work in I can make this new job a success. I have lots of good ideas and useful experience that no one at my new company has.&lt;/p&gt;
&lt;p&gt;I don’t know what the solution is to Imposter Syndrome other than to try and ignore it by thinking positively and the knowledge that I have done amazing things in the last ten years and I will do the same in the next ten.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Happy 50th Star Trek</title>
      <link>https://www.funkysi1701.com/posts/2016/happy-50th-star-trek/</link>
      <pubDate>Thu, 08 Sep 2016 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2016/happy-50th-star-trek/</guid>
      <description>&lt;p&gt;On September 8th 1966 a TV show called Star Trek first aired. Today 50 years later people around the world are still watching Star Trek.&lt;/p&gt;
&lt;p&gt;I was going to blog about the Star Trek story, but instead why not watch this video.&lt;/p&gt;
&lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/Bzi6CmUDabQ&#34; title=&#34;YouTube video player&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&#34; allowfullscreen&gt;&lt;/iframe&gt;</description>
    </item>
    
    <item>
      <title>DZone</title>
      <link>https://www.funkysi1701.com/posts/2016/dzone/</link>
      <pubDate>Thu, 25 Aug 2016 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2016/dzone/</guid>
      <description>&lt;p&gt;For a while now I have been sharing some of my blog posts on the &lt;a href=&#34;https://dzone.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Dzone&lt;/a&gt;
 website.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2016/08/dzone_02.png?w=400&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;The Dzone website allows users to submit links to content and I have been submitting the content I have created on this website. This is how Dzone describes themselves:&lt;/p&gt;
&lt;p&gt;With over 1 Million members, DZone.com is one of the web’s largest communities and publishers of technical content for software professionals. Developers from all over the world come to DZone for the latest and best content to hone their skills and advance their careers.&lt;/p&gt;
&lt;p&gt;Well this week I have been invited to join the &lt;a href=&#34;https://dzone.com/pages/mvb&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;MVB&lt;/a&gt;
 (Most Valuable Blogger) programme. The hope is that more of my readers will find my content from the DZone website.&lt;/p&gt;
&lt;p&gt;The DZone team will soon start sharing my content on the DZone website and I hope this will result in even more people reading what I have to say.&lt;/p&gt;
&lt;p&gt;If nothing else this is clearly telling me that my blog is making a difference, people are taking note of me and what I have to say. I need to keep going and keep writing articles and be more consistent.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Amazon Web Services Pt 2</title>
      <link>https://www.funkysi1701.com/posts/2016/amazon-web-services-pt-2/</link>
      <pubDate>Thu, 04 Aug 2016 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2016/amazon-web-services-pt-2/</guid>
      <description>&lt;p&gt;Last time I started looking at Amazon Web Services and how it differed from Azure. I am going to continue looking at what it can do.&lt;/p&gt;
&lt;h2 id=&#34;virtual-machines&#34;&gt;Virtual Machines&lt;a class=&#34;anchor ms-1&#34; href=&#34;#virtual-machines&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Lets look at what you can do with Virtual Machines. I selected to create a new Virtual Machine (or as AWS calls them an EC2 Instance)&lt;/p&gt;
&lt;p&gt;First you choose a name for your VM and then the OS that runs on it. There are 5 main OSes to choose from Windows Server, Amazon Linux and a selection of the most common Linux flavours.&lt;/p&gt;
&lt;p&gt;You can then download a certificate to secure your VM.&lt;/p&gt;
&lt;p&gt;Like Azure, AWS takes a few moments to create your VM. While I wait I can see that AWS has configured a firewall so only my current IP can connect to it.&lt;/p&gt;
&lt;p&gt;Once the VM is ready you can download an RDP file. However to get the login details you need to decrypt the password using the certificate you downloaded when you created the VM.&lt;/p&gt;
&lt;p&gt;It is interesting to compare the difference in security between Azure and AWS. Azure allows the resetting of passwords of VMs directly from its console, however I suspect that in AWS if you loose your certificate (AWS states they don’t keep a copy of this) you would have to recreate your VM.&lt;/p&gt;
&lt;p&gt;Like with the Websites the default name of the VM is much less user-friendly than what you get from Azure. However I suspect there are other options I haven’t spotted that may customise these.&lt;/p&gt;
&lt;h2 id=&#34;azure-portal-vs-aws-console&#34;&gt;Azure Portal vs AWS Console&lt;a class=&#34;anchor ms-1&#34; href=&#34;#azure-portal-vs-aws-console&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I really like the Azure Portal. It feels like something that has been designed so you can easily access all the options for a specific Azure feature.&lt;/p&gt;
&lt;p&gt;The AWS Console probably has all the same options as with Azure however I don’t think it looks half as good, and will take me a while looking through menus to find the equivalent options. Part of this is due to my unfamiliarity with AWS, so will get easier with time.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Amazon Web Services</title>
      <link>https://www.funkysi1701.com/posts/2016/amazon-web-services/</link>
      <pubDate>Thu, 21 Jul 2016 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2016/amazon-web-services/</guid>
      <description>&lt;p&gt;I am a big fan of Azure but I know zero about its biggest rival – Amazon Web Services or AWS.&lt;/p&gt;
&lt;p&gt;So lets sign up for a free trial and see what it can do. &lt;img class=&#34;img-fluid&#34; alt=&#34;Amazon Web Services&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2016/07/aws-300x169.png?resize=300%2C169&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;The AWS free trial is available from &lt;a href=&#34;https://aws.amazon.com/free/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://aws.amazon.com/free/&lt;/a&gt;
 and lasts for 12 months. From memory I think the Azure free trial lasted only one month.&lt;/p&gt;
&lt;p&gt;To start you need to login with your amazon account and create an AWS account. This requires your name and address and your payment info (you will only get billed if use services not covered by your free trial).&lt;/p&gt;
&lt;p&gt;Interestingly AWS requires you to verify your identity via an automated phone call. (I don’t recall doing anything like this for Azure but please correct me if I am wrong.)&lt;/p&gt;
&lt;p&gt;Once you are logged in you get a series of links displaying all the different services that are available. First impression is this is a simpler view to Azure’s portal with a similar amount of services. At the top right is an option to select which region you want to use, in Azure I use North Europe and West Europe, AWS has Ireland and Frankfurt.&lt;/p&gt;
&lt;h2 id=&#34;create-a-web-app&#34;&gt;Create a Web App&lt;a class=&#34;anchor ms-1&#34; href=&#34;#create-a-web-app&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;First thing to try is setting up a website. I selected create a web app and I get a page asking me for its basic details (very similar to Azure, however AWS asked what language your code is written in, Azure handles all of these) AWS websites appear to support a host of different options similar to Azure.&lt;/p&gt;
&lt;p&gt;The actual creation of your website takes a few moments (like on Azure). However the default URL for websites is similar to &lt;a href=&#34;http://test.vjbbimyv7w.eu-central-1.elasticbeanstalk.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;http://test.vjbbimyv7w.eu-central-1.elasticbeanstalk.com/&lt;/a&gt;
 which is not quite as nice as the Azure equivalent &lt;a href=&#34;http://test.azurewebsites.net&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;http://test.azurewebsites.net&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Azure has a host of command lines available via powershell. AWS has a similar command line interface called AWS CLI, including the option to deploy from git to your website.&lt;/p&gt;
&lt;p&gt;AWS Toolkit for Visual Studio is an extension that allows for the publishing of websites to AWS. (Just like you can publish to Azure)&lt;/p&gt;
&lt;p&gt;As I learn more about AWS I will continue to blog about it. &lt;a href=&#34;https://www.funkysi1701.com/2016/08/04/amazon-web-services-pt-2/&#34;&gt;Amazon Web Services Pt 2&lt;/a&gt;
&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Clever things with MS Access</title>
      <link>https://www.funkysi1701.com/posts/2016/clever-things-ms-access/</link>
      <pubDate>Thu, 07 Jul 2016 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2016/clever-things-ms-access/</guid>
      <description>&lt;p&gt;I hate MS Access and especially developing with it as you can’t do any thing clever with it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Wrong, Wrong, Wrong!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There are a few clever things I have been able to script to make developing with it passable. I still would rather use Visual Studio but this improves the experience a fair bit.&lt;/p&gt;
&lt;h2 id=&#34;source-control&#34;&gt;Source Control&lt;a class=&#34;anchor ms-1&#34; href=&#34;#source-control&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Access files are binary (I use the ADP/ADE file format but I assume other Access file formats have the same problem) and so you can’t diff them to see what has changed. This is bad.&lt;/p&gt;
&lt;p&gt;However there is a solution to this. A tool called Access SVN and can be downloaded from &lt;a href=&#34;https://accesssvn.codeplex.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://accesssvn.codeplex.com/&lt;/a&gt;
, this gives you a way to extract to text files all the forms and reports that are in Access. Before every commit I would manually run this tool on my ADP file and extract to text files, then I would commit these text files to source control and could easily see what had changed in each commit.&lt;/p&gt;
&lt;p&gt;Despite the name Access SVN, the tool is not tied to subversion, you can use any source control system, I use git.&lt;/p&gt;
&lt;p&gt;Also included in this tool is a way to do this with the command line, so you can make this a build step on your build server. I have not used this extensively yet, but the syntax is fairly simple&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;asvn.exe e &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;path to Access file&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;path to txt files&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;*.*&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The filter at the end &lt;em&gt;.&lt;/em&gt; allows you to specify what to extract so you could extract all forms/reports beginning with D with &amp;ldquo;&lt;em&gt;.D&lt;/em&gt;&amp;rdquo;. I had trouble using &lt;em&gt;.&lt;/em&gt; because the names of my forms/reports contain characters not allowed in a windows file name. I am sure there is a way round this but I haven’t had chance to look into it further yet.&lt;/p&gt;
&lt;h2 id=&#34;testing-ms-access&#34;&gt;Testing MS Access&lt;a class=&#34;anchor ms-1&#34; href=&#34;#testing-ms-access&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Surely testing is not possible with MS Access? I would have agreed with that statement the other day until I found a neat way of testing if a feature is enabled.&lt;/p&gt;
&lt;p&gt;Firstly a bit of background. I develop using MS Access 2003 because the design view is far easier to use, however because it is out of support all my users use MS Access 2010. MS Access 2010 has a feature called Tabbed Documents which allows all forms and reports to open in new tabs so you can easily switch between them. This feature can only be enabled in MS Access 2010 and has no effect if opening with MS Access 2003.&lt;/p&gt;
&lt;p&gt;If you use Access SVN on your Access file with tabbed documents turned on and off you will see UseMDIMode: 0 and UseMDIMode: 1 show up in the Database properties file. UseMDIMode: 0 means that tabbed documents is turned on.&lt;/p&gt;
&lt;p&gt;In powershell I can now write a test to see if UseMDIMode: 0 can be found in the database properties file&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Get-Content &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;General\Database properties.dbp.txt&amp;#34;&lt;/span&gt; | Select-String &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;UseMDIMode: 0&amp;#34;&lt;/span&gt; -quiet
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If the test passes True will be returned, if it fails null will be returned.&lt;/p&gt;
&lt;p&gt;On my build server I scripted the extraction of Database properties.dbp.txt from the ADP file with asvn.exe before running this test. While not strictly needed as Database properties.dbp.txt should be in source control, it is possible that someone could forget to extract the text files from the ADP, with this step you are always testing what is enabled in the binary file.&lt;/p&gt;
&lt;h2 id=&#34;ms-access-connection-strings&#34;&gt;MS Access Connection Strings&lt;a class=&#34;anchor ms-1&#34; href=&#34;#ms-access-connection-strings&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;While developing with MS Access I often swap the database connection to point to my local machine or a build server. I always try and remember to only ever commit with this set to the live database to avoid obvious problems.&lt;/p&gt;
&lt;p&gt;The other day I found on &lt;a href=&#34;https://stackoverflow.com/questions/16411430/change-access-server-connection-from-command-line&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;stackoverflow&lt;/a&gt;
 a way to script this. I love this! I can include this step in my deployment process and it will overwrite what ever the connection string is in source control with what your production environment needs.&lt;/p&gt;
&lt;p&gt;All you need to run this step is, (note it is spaces between the parameters not commas)&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cscript connect.vbs Project.adp &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ServerName&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;DatabaseName&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The contents of connect.vbs can be found on the &lt;a href=&#34;https://stackoverflow.com/questions/16411430/change-access-server-connection-from-command-line&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;stackoverflow article&lt;/a&gt;
. It is also possible to pass username and password if your environment requires this.&lt;/p&gt;
&lt;h2 id=&#34;compiled-ade&#34;&gt;Compiled ADE&lt;a class=&#34;anchor ms-1&#34; href=&#34;#compiled-ade&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The last clever thing I do with MS Access is convert my ADP file into the compiled ADE version. To manually do this there is an option in the tools menu.&lt;/p&gt;
&lt;p&gt;To automate this I run&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cscript createADE.vbs &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;path to ADP&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;path to ADE&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The contents of createADE came from this &lt;a href=&#34;https://social.msdn.microsoft.com/Forums/office/en-US/01fd48a9-258e-4405-86f1-adfb2f1057ee/create-an-access-2007-ade-from-a-adp-via-commandline?forum=accessdev&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;forum post&lt;/a&gt;
, the only change I made was to comment out some of the echo statements so it would run silently as part of my build process. It should be noted that cscript and wscript are almost identical and either will run these scripts however in a command line environment cscript is preferable, and wscript should be used in a windows environment.&lt;/p&gt;
&lt;p&gt;I am quite surprised at how much I have managed to do in terms of scripting the build and deployment process for MS Access. I still don’t like developing with Access but this has definitely improved things.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Periodic Table of DevOps</title>
      <link>https://www.funkysi1701.com/posts/2016/periodic-table-devops/</link>
      <pubDate>Thu, 30 Jun 2016 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2016/periodic-table-devops/</guid>
      <description>&lt;p&gt;The periodic table lists all the chemical elements and groups them together based on some key properties. Today I found an article about the &lt;a href=&#34;https://xebialabs.com/periodic-table-of-devops-tools/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;periodic table of DevOps&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2016/06/https-xebialabs.com-assets-files-infographics-periodic-table-of-devops-v2.png?resize=1024%2C572&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;I am not going to discuss every element but I thought I might go through some that I have heard of or used.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Github – The repository of lots of open source software. My Github can be found at &lt;a href=&#34;https://github.com/funkysi1701&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://github.com/funkysi1701&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Amazon Web Services – The second most popular cloud computing provider (not sure why this isn’t number 3?)&lt;/li&gt;
&lt;li&gt;Git – The distributed source control system that everyone uses these days.&lt;/li&gt;
&lt;li&gt;Azure – The number one cloud provider, I have used this a lot, mostly with websites but also with some of their other features like Traffic Manager.&lt;/li&gt;
&lt;li&gt;Bitbucket – like Github but allows private repositories. I have used this extensively for work based projects that I don’t want to be public.&lt;/li&gt;
&lt;li&gt;Google Cloud Platform – don’t know much about this one, but no surprise that google wants a piece of the cloud computing pie.&lt;/li&gt;
&lt;li&gt;Selenium – This is a product I want to play about with as allows front end testing with a browser.&lt;/li&gt;
&lt;li&gt;Rackspace – Before we made the jump to Azure we made use of some Rackspace servers.&lt;/li&gt;
&lt;li&gt;Subversion – The first source control system that I used, but been using git so long now not sure I can remember how it worked.&lt;/li&gt;
&lt;li&gt;Visual Studio – The IDE from Microsoft that I use to write code. I am a big fan as it does everything I could want.&lt;/li&gt;
&lt;li&gt;TeamCity – The continuous integration software that I have been using to automate my deployments.&lt;/li&gt;
&lt;li&gt;MSBuild – This is used by Visual Studio to build your software and can also be used by your deployment scripts.&lt;/li&gt;
&lt;li&gt;Trello – A website that allows you to create a board of ideas or things to do.&lt;/li&gt;
&lt;li&gt;Slack – Brings all your communication together in one place. It’s real-time messaging, archiving and search for modern teams.&lt;/li&gt;
&lt;li&gt;New Relic – A software analytics tool suite used by developers, ops, and software companies to understand how your applications are performing. Useful but find myself favouring Application Insights (part of Azure) more now.&lt;/li&gt;
&lt;li&gt;Nagios – Yay nagios is on the list! My favourite server monitoring system.&lt;/li&gt;
&lt;li&gt;Splunk – This application can be used to search, monitor and analyse all your log files to find out what is happening. Don’t currently use it but I have tried it out in the past.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What is your favourite DevOps tool? Why not leave a comment below?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Automatic Git Tagging</title>
      <link>https://www.funkysi1701.com/posts/2016/automatic-git-tagging/</link>
      <pubDate>Thu, 16 Jun 2016 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2016/automatic-git-tagging/</guid>
      <description>&lt;p&gt;One of the features of git is the ability to tag a point in my change history with a tag. For a while now I have been manually tagging my code whenever I do a release, so I can easily work out what has changed by doing a diff between two tags.&lt;/p&gt;
&lt;p&gt;Now that I am automating my release process with TeamCity I am thinking about how to manage my tags better.&lt;/p&gt;
&lt;p&gt;TeamCity has a setting called VCS Labeling which comes in very handy.
&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2016/06/Untitled.jpg?w=1595&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Configuring it is fairly simple as it only has three settings.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;VCS root to label&lt;/strong&gt;: This is obviously the url to your git repository
&lt;strong&gt;Labeling pattern&lt;/strong&gt;: This is the text of the label to be added.
&lt;strong&gt;Label successful builds only&lt;/strong&gt;: Do you really want to add a tag if the build failed?&lt;/p&gt;
&lt;p&gt;A tag needs to have a unique name, so adding a tag just called &lt;strong&gt;deployed&lt;/strong&gt; won’t work. When I used to add tags manually I used the naming convention of &lt;strong&gt;deployedyyyymmdd&lt;/strong&gt;.  While this naming convention is possible with TeamCity I use something a bit more complex to provide more information about what has been deployed.&lt;/p&gt;
&lt;p&gt;TeamCity provides lots of parameters that can be used in your build steps and also in the Labeling pattern box. I started off using &lt;strong&gt;deployed-build-%system.build.number%&lt;/strong&gt; as my tag which just marks git with the TeamCity build number.&lt;/p&gt;
&lt;p&gt;When I run a TeamCity deployment I don’t always use the same configuration options, I deploy locally, to a test server or to production and sometimes I just deploy the frontend or the backend. How cool would it be to include this information in the tag text?&lt;/p&gt;
&lt;p&gt;Well the next step was to change my Labeling pattern to &lt;strong&gt;deployed-build-%system.build.number%-%ServerName%-%DatabaseName%-%FrontEndPath%&lt;/strong&gt;, this adds the backend database config settings and the path the frontend was deployed to. Now when looking at git you can see commits marked with multiple tags, one for each deployment that succeeded and the tag will indicate the settings used during that deployment.&lt;/p&gt;
&lt;p&gt;Now I will never forget to add the tag after a release as the adding of a tag is part of the deployment process, if the deployment fails the tag won’t be added. I can test my deployment to test and git will show if this has been successful, and when I deploy live this will also show up.&lt;/p&gt;
&lt;p&gt;How do you use tags? Do you mark successful builds with a tag? Why not let me know or leave a comment below.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>I’m 100 blog posts old</title>
      <link>https://www.funkysi1701.com/posts/2016/i-m-100-blog-posts-old/</link>
      <pubDate>Thu, 02 Jun 2016 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2016/i-m-100-blog-posts-old/</guid>
      <description>&lt;p&gt;That’s right this is the one hundredth post that I have written on this blog.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;100-posts-old-L-fwCF_f&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2016/06/100-posts-old-L-fwCF_f-300x247.jpeg?resize=300%2C247&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So what have I learned in the past 100 posts?&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It is easier to write a blog before you become a parent. More recently I am increasingly finding it difficult to find the time to blog. It used to be that I could write on an evening, but now James is around I often prefer to play with him, or more often stop him crawling where he shouldn’t.&lt;/li&gt;
&lt;li&gt;I like my job. The inspiration for most of this site is my day job and as you can read, I do a wide variety of different things, but I have a lot more to learn as well.&lt;/li&gt;
&lt;li&gt;Finding your niche is hard. 100 posts in and I am still not sure what my niche is. I started out with the broad niche of IT and what I do, I then considered something about IT and fatherhood but I don’t think that topic is really me. My current thinking is maybe DevOps especially as my role these days fits squarely between Development and Operations.&lt;/li&gt;
&lt;li&gt;Its time for a refresh. I have been meaning to change the theme of this site for some time and I feel after 100 posts now is as good as time as any. I want to emphasise my skills and what I am learning and increase the emphasis on DevOps, which I think will be my niche.&lt;/li&gt;
&lt;li&gt;Watching visitor numbers is addictive. Every day I look at how many people have looked at my blog, but I have yet to see a pattern between what I write and how many reads I get. Is my writing getting better? I don’t know. Are more people reading? Probably not. Will I keep going? Yes&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;So what is next?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Hopefully a refreshed look in the next few months. Hopefully regular posts. If there is something you want to see on here drop me a message via any of the social media links or put a comment below.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What is my favourite post?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Maybe &lt;a href=&#34;https://www.funkysi1701.com/2015/05/30/user-groups-and-f/&#34;&gt;User Groups and F#&lt;/a&gt;
 which proved very popular and got me to start going to user groups something I still enjoy today. I also like &lt;a href=&#34;https://www.funkysi1701.com/2016/02/25/coding-myself-into-a-corner/&#34;&gt;Coding Myself Into A Corner&lt;/a&gt;
 which got me to start thinking more if I was giving myself future problems. But there are many others I like such as &lt;a href=&#34;https://www.funkysi1701.com/2015/09/03/baby-magic-and-becoming-a-father/&#34;&gt;James and Becoming a father&lt;/a&gt;
&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Brothers, TNG S4 E3 Review, The Battle Bridge</title>
      <link>https://www.funkysi1701.com/posts/2016/brothers-tng-s4-e3-review-battle-bridge/</link>
      <pubDate>Thu, 26 May 2016 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2016/brothers-tng-s4-e3-review-battle-bridge/</guid>
      <description>&lt;p&gt;My latest podcast can be found &lt;a href=&#34;http://www.trekmate.org.uk/brothers-tng-s4-e3-review-the-battle-bridge/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;http://www.trekmate.org.uk/brothers-tng-s4-e3-review-the-battle-bridge/&lt;/a&gt;
 and feedback can be left on the trekmate forums &lt;a href=&#34;http://forum.trekmatefamily.com/2016/05/brothers-tng-s4-e3-review-the-battle-bridge/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;http://forum.trekmatefamily.com/2016/05/brothers-tng-s4-e3-review-the-battle-bridge/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Data jeopardizes an emergency mission to save an ill child when he gets a signal from his creator.&lt;/p&gt;
&lt;p&gt;Today James and Lou discuss (Brothers) and what we think of it, with tonight’s guest host Simon Foster, Funky Si.&lt;/p&gt;
&lt;p&gt;Credit: Main Title Theme (TV Edit) was arranged by &lt;a href=&#34;http://en.memory-alpha.org/wiki/Dennis_McCarthy&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Dennis McCarthy&lt;/a&gt;
 and composed by &lt;a href=&#34;http://en.memory-alpha.org/wiki/Jerry_Goldsmith&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Jerry Goldsmith&lt;/a&gt;
 and &lt;a href=&#34;https://memory-alpha.fandom.com/wiki/Alexander_Courage&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Alexander Courage&lt;/a&gt;
&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Running Windows on Raspberry Pi</title>
      <link>https://www.funkysi1701.com/posts/2016/windows-10-raspberry-pi-3/</link>
      <pubDate>Thu, 05 May 2016 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2016/windows-10-raspberry-pi-3/</guid>
      <description>&lt;p&gt;Last year you may remember me talking about playing with a Raspberry Pi. Well since then my Raspberry Pi has been sat on a desk collecting dust.&lt;/p&gt;
&lt;p&gt;This week I attended Leeds Sharp and the topic was &lt;strong&gt;Running Windows on Raspberry Pi&lt;/strong&gt; and this has inspired me again to do something with a Pi.&lt;/p&gt;
&lt;p&gt;But first what did I learn.&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;Here are a couple more of pics of last nights &lt;a href=&#34;https://twitter.com/LeedsSharp?ref_src=twsrc%5Etfw&#34;&gt;@LeedsSharp&lt;/a&gt; &lt;a href=&#34;https://t.co/QvlsYjNFvB&#34;&gt;https://t.co/QvlsYjNFvB&lt;/a&gt; &lt;a href=&#34;https://twitter.com/hashtag/RaspberryPi?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#RaspberryPi&lt;/a&gt; &lt;a href=&#34;https://twitter.com/hashtag/MSIoT?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#MSIoT&lt;/a&gt; &lt;a href=&#34;https://t.co/60o4wiiPSv&#34;&gt;pic.twitter.com/60o4wiiPSv&lt;/a&gt;&lt;/p&gt;&amp;mdash; Richard Tasker 🇬🇧 (@ritasker) &lt;a href=&#34;https://twitter.com/ritasker/status/725970415189909504?ref_src=twsrc%5Etfw&#34;&gt;April 29, 2016&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;p&gt;I had heard that a cut down version of Windows 10 could be installed on the newer Raspberry Pi’s, but I hadn’t really understood how cut down the version of windows is. Having now seen it demonstrated the OS consists of a single page with a few menu options.&lt;/p&gt;
&lt;p&gt;The real power of Windows 10 IoT is when you connect remotely to it. There are a couple of ways to do this, PowerShell (check out &lt;a href=&#34;https://ms-iot.github.io/content/en-US/win10/tools/CommandLineUtils.htm&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://ms-iot.github.io/content/en-US/win10/tools/CommandLineUtils.htm&lt;/a&gt;
 for a few commands), and of course connecting Visual Studio to your Pi.&lt;/p&gt;
&lt;p&gt;When I had previously played with a Pi, it had been with bash scripts and linux commands. The beauty of installing Windows IoT is that you can write c# code, something I do in my day job so theoretically I should find it easier.&lt;/p&gt;
&lt;p&gt;The demonstration at Leeds Sharp was pretty impressive. If you are a fan of the Big Bang Theory you may recall Sheldon playing a Theremin. Well it is actually possible to construct a Theremin from a couple of sensors and a Raspberry Pi. The code for which is on &lt;a href=&#34;https://github.com/ritasker/IoTDemos&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;github&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;Now that I have been inspired what shall I do?&lt;/p&gt;
&lt;p&gt;My Raspberry Pi won’t support Windows 10 IoT, so I need to buy the latest version. I am thinking of buying a kit so I can play about with a breadboard, LEDs and resistors. Maybe not build a robot straight away but certainly try doing something that connects to the GPIO pins.&lt;/p&gt;
&lt;p&gt;If you have any suggestions leave a comment below.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Exchange Web Services</title>
      <link>https://www.funkysi1701.com/posts/2016/exchange-web-services/</link>
      <pubDate>Thu, 21 Apr 2016 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2016/exchange-web-services/</guid>
      <description>&lt;p&gt;Where I work we use a really old fashioned way of recording where in the country employees are: Excel!&lt;/p&gt;
&lt;p&gt;For years I have been trying to persuade staff to use calendars in Exchange. Outlook is great for looking at one or two people’s calendars at once but quickly gets unmanageable for looking at ten or more peoples availability.&lt;/p&gt;
&lt;p&gt;Recently I have started looking into how easy it is to query this information to give a custom view.&lt;/p&gt;
&lt;p&gt;Microsoft provide an API to query exchange information called Exchange Web Services or EWS. I have only used EWS with my Exchange 2010 setup, but the documentation mentions working with Exchange 2007 and older or Exchange online.&lt;/p&gt;
&lt;p&gt;Here are the basics of what I have tried. Fire up Visual Studio and from nuget install EWS.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Install-Package Microsoft.Exchange.WebServices
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I started off with a simple Console App to see how it all worked, and then extended it to a MVC website. I found querying exchange directly was slow, but it is easy enough to cache information in a database.&lt;/p&gt;
&lt;p&gt;To start you need to create an Exchange Service object, by specifying the version of Exchange you are using.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ExchangeService service = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; ExchangeService(ExchangeVersion.Exchange2010);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next you need to pass the URL you are using to access Exchange.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;service.Url = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Uri(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;mail.example.com&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To access information from exchange you need to pass some Exchange credentials, ideally a username and password that has access to view all the calendars you want to look at.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;service.Credentials = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; WebCredentials(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;username&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;password&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next pass the email address of the user who owns the calendar you want to look at.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;service.ImpersonatedUserId = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; ImpersonatedUserId(ConnectingIdType.SmtpAddress, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;me@example.com&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;My particular exchange server has a self signed SSL certificate which is not going to be trusted by remote clients.  The following line ignores this validation check and makes my program connect.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;System.Net.ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) =&amp;gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now that we have connected to exchange we just need a few lines to look for events in the calendars.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Initialize the calendar folder object with only the folder ID.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CalendarFolder calendar = CalendarFolder.Bind(service, WellKnownFolderName.Calendar, &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; PropertySet());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Set the start and end time and number of appointments to retrieve.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CalendarView cView = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; CalendarView(startDate, endDate);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Limit the properties returned to the appointment&amp;#39;s subject, start time, and end time.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cView.PropertySet = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; PropertySet(AppointmentSchema.Subject, AppointmentSchema.Start, AppointmentSchema.End);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Retrieve a collection of appointments by using the calendar view.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;FindItemsResults&amp;lt;Appointment&amp;gt; appointments = calendar.FindAppointments(cView);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now that you have an appointments object you can loop through each element with a foreach loop. In my case I assign each elements Subject to a variable, which I can then do what I like with (display in a console window, save to a database, display in an MVC website.)&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;foreach&lt;/span&gt; (Appointment a &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; appointments)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (a.Subject != &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        subject += a.Subject.ToString();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;My website queries a SQL database which I can easily populate with a console app that runs at regular intervals throughout the day.&lt;/p&gt;
&lt;p&gt;There is a lot more I want to do with this project as this is only the basics of what you can do with Exchange Web Services. So expect more blog posts on this subject as I expand its functionality and learn new ways of doing things.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Revisiting Team City</title>
      <link>https://www.funkysi1701.com/posts/2016/revisiting-teamcity/</link>
      <pubDate>Thu, 24 Mar 2016 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2016/revisiting-teamcity/</guid>
      <description>&lt;p&gt;Last year I blogged about &lt;a href=&#34;http://www.funkysi1701.com/2015/04/01/teamcity/&#34;&gt;Team City&lt;/a&gt;
, well I have been looking at it again recently. In that time they have even changed their logo!&lt;/p&gt;
&lt;p&gt;Lets start with thinking about what I want my Continuous Integration server to do.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Check out my code from source control (usually master but all feature branches would be even better)&lt;/li&gt;
&lt;li&gt;Configure specific setting for build&lt;/li&gt;
&lt;li&gt;Build my code&lt;/li&gt;
&lt;li&gt;Build my databases&lt;/li&gt;
&lt;li&gt;Run any unit tests&lt;/li&gt;
&lt;li&gt;(Optional) Run deployment to Azure Test/Live site&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There are probably other things I want to achieve but I will start with these six.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Checking out code from source control is something Team City does out of the box, so I can safely say I have done this now. It even monitors a branch for changes and initiates a new check out.&lt;/li&gt;
&lt;li&gt;Team City allows you to create specific build steps so in theory you can have multiple builds for every variation of settings that you want for your code. I have not tried this yet apart from building with the default config, but I don’t expect it will be too difficult.&lt;/li&gt;
&lt;li&gt;I have managed to get my code to build with Team City, it took a bit of tweaking the different build steps but wasn’t too difficult. Team City has a visual studio build agent which takes you solution file and does what it needs to. The one problem I have found with this step is that I get errors with my tests if I select a Debug config instead of Release.&lt;/li&gt;
&lt;li&gt;Databases are always the problem part of the deployment. So far I have manually deployed my databases but I intend on revisit this step. A &lt;a href=&#34;https://stackoverflow.com/questions/21555038/how-can-i-execute-sql-scripts-using-teamcity&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;stackoverflow&lt;/a&gt;
 post suggests that I can run SQL code via Team City in the following way by creating a command line executable:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Command executable: c:&lt;span style=&#34;color:#ae81ff&#34;&gt;\P&lt;/span&gt;rogram Files&lt;span style=&#34;color:#ae81ff&#34;&gt;\M&lt;/span&gt;icrosoft SQL Server&lt;span style=&#34;color:#ae81ff&#34;&gt;\1&lt;/span&gt;00&lt;span style=&#34;color:#ae81ff&#34;&gt;\T&lt;/span&gt;ools&lt;span style=&#34;color:#ae81ff&#34;&gt;\B&lt;/span&gt;inn&lt;span style=&#34;color:#ae81ff&#34;&gt;\s&lt;/span&gt;qlcmd.exe
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Command parameters: -S &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;ServerName&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; -i &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;PathToSQLScript&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I have yet to try this but I am hopefully that it will just work. Dropping a database and restoring a back and then running different SQL scripts is all possible from TSQL, so I should be OK. Watch this space for more details.&lt;/p&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;Running the unit tests got me stuck for a while. I tried setting it up using VSTest or MSTest neither worked mainly because a config file wasn’t being copied with the test binaries. When I tried using NUnit it just worked. The tests that failed gave me a few config settings to change.&lt;/li&gt;
&lt;li&gt;I have powershell scripts that deploy to Azure websites, I think that these could form the basis of a deployment to Azure. Again the difficult step here may end up being deploying all the different databases to Azure. This is also the riskiest step as I need to connect to live servers which is why I will leave this to last, at the very least I could generate scripts that do a full deployment.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That’s it for now. Once I have this all working I will revisit again with details of the database steps as I am expecting a few challenges to overcome. What have you used a CI Server for? Are there other things I want to achieve from a project like this? Why not contact me or leave a comment below&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Model View Controller (MVC)</title>
      <link>https://www.funkysi1701.com/posts/2016/model-view-controller-mvc/</link>
      <pubDate>Thu, 17 Mar 2016 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2016/model-view-controller-mvc/</guid>
      <description>&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2016/03/27.jpg?w=327&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Model View Controller or MVC is a software architectural pattern for implementing user interfaces on computers. It divides a given software application into three interconnected parts, so as to separate internal representations of information from the ways that information is presented to or accepted from the user.&lt;/p&gt;
&lt;p&gt;I have been trying to get my head around the concept of MVC for a while, hopefully writing this article will help solidify my understanding of it.&lt;/p&gt;
&lt;p&gt;One of the core concepts of MVC is the ability to separate concerns so you can concentrate your energies on one aspect of the application.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Model&lt;/strong&gt; This is the data. If your application uses a database the model often mirrors what you have in the database and concerns itself retrieving information from the database.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;View&lt;/strong&gt; This concerns itself with displaying the data to the user. Typically this is the html pages of your application.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Controller&lt;/strong&gt; This concerns itself with actually doing things and deals with user interaction. Typically it will get data from the view and send data to the model.&lt;/p&gt;
&lt;p&gt;The three concerns can be developed in isolation as they do not depend on each other, for larger development teams you can even divide up development much easier that a traditional app.&lt;/p&gt;
&lt;p&gt;The basic concept of MVC I get and understand, however I find myself getting bogged down in the details.&lt;/p&gt;
&lt;p&gt;The database doesn’t matter. I need to remember this and not get sidetracked in writing custom methods to connect to the database which end up unmanageable. I know SQL, so can easily write SQL commands to copy data into the format I need for my app. The app I am currently working on involves a large amount of existing data, and I need to concentrate on the MVC parts and worry about the database later.&lt;/p&gt;
&lt;p&gt;In previous attempts I have tried to build my model against many tables, but instead I can write a query against many tables and insert that into one table which the Model can then use.&lt;/p&gt;
&lt;p&gt;Changing the model often results in an error informing you that the context has changed since the database was created. The easy solution to this in my case is to drop the database and allow entity framework to recreate the database each time. As long as my database contains no new data, I won’t loose anything.&lt;/p&gt;
&lt;p&gt;One of the core advantages of MVC is the ability to test it or even use test driven development (TDD). I haven’t really dabbled with testing yet as I am still trying to get my head around the fundamentals, but once I have made some progress with my app I want to test, so next time I get asked to add a new feature I have no fear about breaking stuff.&lt;/p&gt;
&lt;p&gt;For the first time I have got an app with a working Authentication system from the start. And it is remarkably easy to implement with one keyword. Adding &lt;strong&gt;[Authorize]&lt;/strong&gt; to the top of your controller is all that is needed. Building the actual Authentication system is relatively easy from Visual Studio, as it has templates for Azure AD, Forms Based, Open Auth like google/twitter etc.&lt;/p&gt;
&lt;p&gt;It is still very early days for my MVC app and my understanding of it, but I feel I have turned the corner and can actually build something with it now, rather than be stuck in a downward spiral of confusion.&lt;/p&gt;
&lt;p&gt;What do you think about MVC why not leave a comment below? For more info about MVC I have been looking at &lt;a href=&#34;http://www.asp.net/mvc&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;http://www.asp.net/mvc&lt;/a&gt;
 which has more information and tutorials.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Surface Book Review</title>
      <link>https://www.funkysi1701.com/posts/2016/surface-book-review/</link>
      <pubDate>Thu, 10 Mar 2016 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2016/surface-book-review/</guid>
      <description>&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2016/02/en-INTL-PDP0-Surface-Book-CR9-00001-P2.jpg?w=780&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;


I have just bought myself a new laptop, but it is not just any laptop it is a &lt;a href=&#34;https://www.microsoftstore.com/store/msuk/en_GB/pdp/productID.332604800&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Microsoft Surface Book&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;I think this is probably the first time I have bought myself a top of the range laptop and after a few days of use I am loving it.&lt;/p&gt;
&lt;p&gt;The Surface Book is the latest in Microsoft’s Surface line of tablets but the first to feature a keyboard and be more like a traditional laptop. The keyboard is detachable from the keyboard so you can use the Surface Book like a tablet.&lt;/p&gt;
&lt;p&gt;As it is a top of the range laptop, it was not cheap, so if price is a significant factor in your laptop choice this is not the machine for you. Microsoft are trying to compete with Apple’s Macbook range.&lt;/p&gt;
&lt;p&gt;So what did I get for my money:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows 10 Pro&lt;/li&gt;
&lt;li&gt;16Gb RAM&lt;/li&gt;
&lt;li&gt;512Gb SSD (Formatted Size nearer 474Gb)&lt;/li&gt;
&lt;li&gt;6th Generation Intel Core i7 Processor&lt;/li&gt;
&lt;li&gt;Surface Pen&lt;/li&gt;
&lt;li&gt;13.5-inch touch screen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I have only had the device for a few days but these are my thoughts so far. My primary reason for buying this is for doing development work with Visual Studio and SQL Server.&lt;/p&gt;
&lt;p&gt;I really like the Surface Pen. This is a feature that I didn’t think I would use much. The Pen connects via bluetooth and allows interaction with the touch screen. The pressure sensitive screen allows all sort of touch actions to be performed.&lt;/p&gt;
&lt;p&gt;I especially like the choice of keyboards that are offered when the physical keyboard is detached. You can have either a on screen keyboard which you can type with pen or fingers, an on screen keyboard that splits in half or you can write with the pen. This is an amazing feature. My handwriting is not good but most of the time it understands my scrawl. With this option you can hand write a tweet or fill in a form on a webpage. For speed I would not recommend this form of input for large amounts of text, but for browsing the web of when you are just clicking on links it is great.&lt;/p&gt;
&lt;p&gt;Windows Hello – I can unlock windows just by looking at my screen. How cool is that! It was really easy to setup, it just takes a photo of your face and next time you login all you need to do it look at the screen. Note if you are working in tablet mode, make sure the tablet is the correct way up.&lt;/p&gt;
&lt;p&gt;It’s not all brilliant though. Detaching the screen is fiddly and sometimes takes a few moments to do. A few times I have felt I needed another hand but I am sure the more I do this the easier I will find it to do.&lt;/p&gt;
&lt;p&gt;Battery life isn’t great especially when running off the tablet only. This is due to the machine having two batteries, one in the base and one in the screen so with keyboard attached you have much longer use times. Actually I am finding the battery is lasting longer now that I have used it for a few days.&lt;/p&gt;
&lt;p&gt;The screen has a very high resolution 3000 x 2000 but using clever zooming technology everything is still readable and not tiny. However I use Remote Desktop a lot and this caused me a problem. When RDPing the remote session used the host screen resolution which made everything tiny on my servers. The solution to this can be found on &lt;a href=&#34;https://superuser.com/questions/891413/remote-connection-desktop-manager-2-7-does-not-support-dpi-scaling-anymore&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;SuperUser&lt;/a&gt;
 and involved using Microsoft’s Remote Desktop Connection Manager, a cool bit of software for managing multiple RDP sessions. This is actually an improvement on the way I usually work, but until I found the answer this was annoying.&lt;/p&gt;
&lt;p&gt;Another minor annoyance with the keyboard is that you can’t press Ctrl-Alt-Del with one hand. Normally this isn’t a requirement but if the screen locks while I have my son on my lap I am stuck, but I won’t blame the surface book for this.&lt;/p&gt;
&lt;p&gt;When I got my Surface Book I was also given a Microsoft Wireless Display Adapter. I am not a fan of this bit of tech as I can’t get it to work. I briefly got my old laptop to connect but my Surface Book keeps telling me NO!&lt;/p&gt;
&lt;p&gt;Overall I like the Surface Book. It is certainly the nicest laptop I have ever used. Now that I have the docking station I can connect two monitors, have a wired internet connection and it becomes a proper work horse. What does everyone else think? Better than Apple’s range of laptops?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Trying Out Azure Active Directory</title>
      <link>https://www.funkysi1701.com/posts/2016/trying-out-azure-active-directory/</link>
      <pubDate>Thu, 03 Mar 2016 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2016/trying-out-azure-active-directory/</guid>
      <description>&lt;p&gt;One of my plans is to create new MVC Webapps for my companies databases. Once I publish these I will need to secure them so only staff have access.&lt;/p&gt;
&lt;p&gt;The traditional way to do this would be insert membership tables into my database. The user then has to remember another username and password and I have to secure the storage of these credentials. Lots of work for everyone.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2016/03/arch.png?w=600&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;There is a better way by using Azure Active Directory. You have probably heard of Active Directory, if you are a SysAdmin you probably use it all the time to manage your corporate users and computers. Azure Active Directory is an extension of this into the Cloud.&lt;/p&gt;
&lt;p&gt;I have blogged in the past about using Azure but this is the first time I have tried connecting my internal domain to Azure. There is a &lt;a href=&#34;https://vlabs.holsystems.com/vlabs/technet?eng=VLabs&amp;amp;auth=external&amp;amp;src=vlabs&amp;amp;altadd=true&amp;amp;labid=13535&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Virtual Lab&lt;/a&gt;
 which helped me try out some of these ideas.&lt;/p&gt;
&lt;p&gt;The first thing I did was to create a new Directory in Azure. I did this via the old portal (&lt;a href=&#34;https://manage.windowsazure.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;manage.windowsazure.com&lt;/a&gt;
) it might be possible via the new portal but I don’t know how yet.&lt;/p&gt;
&lt;p&gt;Click New, select App Services &amp;gt; Active Directory &amp;gt; Directory and select Custom Create. Select Create new directory, give it a name and a domain name and select a region from the drop down. Then add a Global Admin for this directory.&lt;/p&gt;
&lt;p&gt;There is a tool called &lt;a href=&#34;https://www.microsoft.com/en-us/download/details.aspx?id=47594&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Azure Active Directory Connect&lt;/a&gt;
. Download and Install this with express settings on one of your domain controllers. You need to specify a domain admin account to access your domain and the Azure Global Admin account you just created.&lt;/p&gt;
&lt;p&gt;At this point I went to bed so I am not sure how long it tool to sync all the domain information but by morning it was all showing in the users list on Azure.&lt;/p&gt;
&lt;p&gt;All my user accounts are showing with a @contoso.onmicrosoft.com, it is possible to use custom domains but I haven’t figured out that step yet. I made a change in my Active Directory and a while later that change was showing in Azure AD.&lt;/p&gt;
&lt;p&gt;So now what? Open up Visual Studio and see if I can use Azure to Authenticate.&lt;/p&gt;
&lt;p&gt;I selected to create a new MVC web project and clicked the change authenticate option. One of the options was Work and School Accounts, I then selected Cloud Single Organization and entered contoso.onmicrosoft.com. I then ran this app and it authenticated using Azure using my domain password. Really impressed at how easy that was.&lt;/p&gt;
&lt;p&gt;The app then shows up on Azure in the old portal. In Applications you can see a list of which users have access to your app and configure few other app related settings.&lt;/p&gt;
&lt;p&gt;This is a long way off being useful in my actual app, but it shows that the basics of what I am trying to do does work. Anyone done anything similar with Azure AD? How did you get on?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Coding myself into a corner</title>
      <link>https://www.funkysi1701.com/posts/2016/coding-myself-into-a-corner/</link>
      <pubDate>Thu, 25 Feb 2016 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2016/coding-myself-into-a-corner/</guid>
      <description>&lt;p&gt;I spend an awful lot of my working life adding new features and improvements to a legacy database system.&lt;/p&gt;
&lt;p&gt;A &lt;strong&gt;legacy&lt;/strong&gt; system is an old method, technology, computer system, or application program, “of, relating to, or being a previous or outdated computer system.” Often a pejorative term, referencing a system as &amp;ldquo;&lt;strong&gt;legacy&lt;/strong&gt;&amp;rdquo; often implies that the system is out of date or in need of replacement.&lt;/p&gt;
&lt;p&gt;My particular legacy system is Microsoft Access. We use Microsoft Access to provide the front end for all our internal databases. The particular technology we use is ADP files which are only supported in Access 2000, 2003 or 2010.&lt;/p&gt;
&lt;p&gt;Microsoft has already dropped support for Access 2000 and 2003, and support for 2010 is due to be dropped in 2020.&lt;/p&gt;
&lt;p&gt;So why am I coding myself into a corner? Its simple for every feature or improvement I create in Access, I increase the amount of features I need to create or port to a new front end.&lt;/p&gt;
&lt;p&gt;This is a very depressing thought, everything I create will need creating again. I am not saving myself work but increasing the amount of work I need to do again.&lt;/p&gt;
&lt;p&gt;The bad news is that my employers like almost all businesses demand results and like a good employee I have been delivering them. I have been promised the mythical “when we are quiet” you can work on rebuilding the database front end. I know this will likely never happen so what are my options.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Do nothing&lt;/strong&gt; I have warned my managers that this work needs doing and it is up to them to give me the resources I need. This is not an acceptable option. Firstly I am not future proofing the business, 2020 will be here before we know it. Also I am not developing myself as a developer, as the only experience I am getting is with Legacy technology that has expired or will do very soon. No one wants to employ someone who only has legacy experience.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Do something&lt;/strong&gt; I need to keep delivering results and doing what is asked of me. Like any good engineer I should be multiplying my estimates by four, meaning that I have some time that can be used for looking at the bigger picture. This is a win-win option really. Employer gets a solution that is future proof, Employee gets valuable experience in up to date technology.&lt;/p&gt;
&lt;p&gt;What do you think? Have you been tied to legacy technology? Why not leave a comment below.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Star Trek Episode Review The Best of Both Worlds</title>
      <link>https://www.funkysi1701.com/posts/2016/star-trek-episode-review-the-best-of-both-worlds/</link>
      <pubDate>Thu, 18 Feb 2016 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2016/star-trek-episode-review-the-best-of-both-worlds/</guid>
      <description>&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2016/02/Picard_kidnapped_by_the_Borg.jpg&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Episode Title: &lt;strong&gt;The Best of Both Worlds&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Star Trek Type: TNG&lt;/li&gt;
&lt;li&gt;Original Air Date: 18 June 1990 &amp;amp; 24 September 1990&lt;/li&gt;
&lt;li&gt;Written By: Michael Piller&lt;/li&gt;
&lt;li&gt;Directed By: Cliff Bole&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Borg threaten the Federation, when they kidnap Captain Picard and destroy a fleet of 39 Starships. Luckily some original thinking from Commander Riker and Lieutenant Commander Shelby saves the Federation from assimilation.&lt;/p&gt;
&lt;p&gt;Thoughts: I love this episode! It is probably my favourite episode in the whole of trek. I can’t think of  a single scene which I don’t like.&lt;/p&gt;
&lt;p&gt;It is a two parter that actually works best as a two parter. The moment that Riker orders the Enterprise to fire on the Borg is great. At the time some thought that Patrick Stewart might leave the show and be replaced by Riker/Shelby. I am very glad that didn’t happen but it is interesting to ponder what that might be like.&lt;/p&gt;
&lt;p&gt;The Borg soundtrack in this episode is great. Ron Jones really captures the spooky threat that the Borg are. I was always disappointed that some of that didn’t continue in First Contact and when the Borg return in Voyager.&lt;/p&gt;
&lt;p&gt;The episode has a cracking pace. From the moment the Borg first attack the Enterprise to the moment the Borg ship explodes the show doesn’t slow down.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;I am Locutus… of Borg. Resistance… is futile. 
Your life, as it has been… is over. From this time forward… you will service… us.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Commander Shelby is a great character that enhances the episode and introduces conflict between characters, particularly Riker.&lt;/p&gt;
&lt;p&gt;I have heard that Riker’s thoughts about his career was a mirror to writer Michael Piller’s thoughts about leaving the show. Luckily for us he stayed.&lt;/p&gt;
&lt;p&gt;In a future episode of DS9 Worf comments that he felt there was nothing that they couldn’t do during this time. I have to agree the tag team of him and Data is a great one. If I want rescuing it would be Data and Worf that I would want.&lt;/p&gt;
&lt;p&gt;My good friends at &lt;a href=&#34;http://www.trekmate.org.uk/the-best-of-both-worlds-tng-s3-e26-review-the-battle-bridge/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Trekmate&lt;/a&gt;
 have just reviewed part one, why not have a listen?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>My git repository is too large!</title>
      <link>https://www.funkysi1701.com/posts/2016/my-git-repository-is-too-large/</link>
      <pubDate>Thu, 11 Feb 2016 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2016/my-git-repository-is-too-large/</guid>
      <description>&lt;p&gt;Today I did a clone of one of my git repositories and it took ages to download. Looking into what got downloaded it was easy to see why. The .git folder was over 500Mb in size.&lt;/p&gt;
&lt;p&gt;I know how this has happened. This repository was created in 2013 and has been used by me as a dumping ground for lots of things related to the code which never should have been committed.&lt;/p&gt;
&lt;p&gt;Since 2013 I have learnt a lot more about coding and git so the current version of the files in git isn’t too bad. But git keeps the history of changes for every file so bad practices like this are kept.&lt;/p&gt;
&lt;p&gt;What can I do about this? Well what does google suggest? I found this &lt;a href=&#34;http://stevelorek.com/how-to-shrink-a-git-repository.html&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;blog post&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;It suggests ways of listing all the large files that are stored in git and a way to remove them. As I am the only person that regularly commits to this repository I see no problem with giving it a go.&lt;/p&gt;
&lt;p&gt;I will summarise the steps here.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git clone url
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now you need all the remote branches so there is a bash script to run&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#!/bin/bash
for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master`; do
git branch –track ${branch##*/} $branch
done
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Another bash script then lists the top 10 large files&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#!/bin/bash
#set -x
# Shows you the largest objects in your repo’s pack file.
# Written for osx.
#
# @see http://stubbisms.wordpress.com/2009/07/10/git-script-to-show-largest-pack-objects-and-trim-your-waist-line/
# @author Antony Stubbs
# set the internal field spereator to line break, so that we can iterate easily over the verify-pack output
IFS=$’\n’;
# list all objects including their size, sort by size, take top 10
objects=`git verify-pack -v .git/objects/pack/pack-*.idx | grep -v chain | sort -k3nr | head`
echo “All sizes are in kB. The pack column is the size of the object, compressed, inside the pack file.”
output=“size,pack,SHA,location”
for y in $objects do
# extract the size in bytes
size=$((`echo $y | cut -f 5 -d ‘ ‘`/1024))
# extract the compressed size in bytes
compressedSize=$((`echo $y | cut -f 6 -d ‘ ‘`/1024))
# extract the SHA
sha=`echo $y | cut -f 1 -d ‘ ‘`
# find the objects location in the repository tree
other=`git rev-list –all –objects | grep $sha`
#lineBreak=`echo -e “\n”`
output=“${output}\n${size},${compressedSize},${other}”
done
echo -e $output
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;After running the script you will see details of your largest files. I had *.msi and *.exe files in the mix. To remove them run the following, where filename is the path to the file that needs removing.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git filter-branch –tag-name-filter cat –index-filter ‘git rm -r –cached –ignore-unmatch filename’ –prune-empty -f — –all
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;To reclaim the disk space run the following commands&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;rm -rf .git/refs/original/
git reflog expire –expire=now –all
git gc –prune=now
git gc –aggressive –prune=now
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now push your changes back to the remote server.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git push origin –force –all
git push origin –force –tags
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now if you do a clone it will be much smaller than before and you can get back to coding much quicker, without having to wait.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>SQL Transaction Log Backups</title>
      <link>https://www.funkysi1701.com/posts/2016/transaction-log-backups/</link>
      <pubDate>Thu, 04 Feb 2016 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2016/transaction-log-backups/</guid>
      <description>&lt;p&gt;Like many DBAs I spend a lot of time maintaining my SQL Server backups.&lt;/p&gt;
&lt;p&gt;From SQL Server I maintain both full backups and transaction log backups. I have often restored my full backups but until recently I have never restored a transaction log backup. All backup strategy’s are only as good as the last time you tested the restore process.&lt;/p&gt;
&lt;h2 id=&#34;so-what-is-a-transaction-log-backup&#34;&gt;So what is a transaction log backup?&lt;a class=&#34;anchor ms-1&#34; href=&#34;#so-what-is-a-transaction-log-backup&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A transaction log backup contains all the transaction log records generated since the last full backup and is used to allow the database to be recovered to a specific point in time (usually the time right before a disaster strikes).  Since these are incremental, if you want to restore the database to a particular point in time, you need to have all the transaction log records necessary to replay database changes up to that point in time.&lt;/p&gt;
&lt;h2 id=&#34;how-to-do-the-restore&#34;&gt;How to do the restore.&lt;a class=&#34;anchor ms-1&#34; href=&#34;#how-to-do-the-restore&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;First right click on Databases in SQL Management Studio and select restore database. You should then get a screen similar to this.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2016/02/restore1.jpg?resize=768%2C640&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;In source click the &amp;hellip; to allow you to select your backup files.&lt;/p&gt;
&lt;p&gt;Now normally I have only ever selected one file here, the *.bak file. Instead select the *.bak and all the *.trn files as well. After SQL Server has chugged for a few minutes (time will depend on number of transaction files and server/disk speed etc) the restore plan section should fill up with files.&lt;/p&gt;
&lt;p&gt;In the destination database box, type in the name of the database you want to restore. I recommend using a different name to avoid overwriting the original database, appending Test or a datetime to the name is what I usually do.&lt;/p&gt;
&lt;p&gt;On my test server I need to untick the take tail-log backups option off the options screen before I can execute the restore.&lt;/p&gt;
&lt;p&gt;Now you can either check the tick boxes in the restore plan section or (more fun) click the timeline button to select at what point in time you want to restore to.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2016/02/restore2.jpg?resize=768%2C457&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;You can either select the point in time with your mouse or specify the exact point in the time textbox. Alternatively you can just select the most recent point, probably the most likely option when disaster strikes.&lt;/p&gt;
&lt;p&gt;Now that I have tried doing this on my test server I feel much more confident that when disaster does strike I can get things restored quickly and painlessly.&lt;/p&gt;
&lt;h2 id=&#34;how-often-should-you-run-transaction-backups&#34;&gt;How often should you run transaction backups?&lt;a class=&#34;anchor ms-1&#34; href=&#34;#how-often-should-you-run-transaction-backups&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The answer to this question depends on how critical your data is. Until very recently I ran mine ever 15 minutes, I have increased this to every 5 minutes, but I have seen recommendations of running it &lt;a href=&#34;https://www.brentozar.com/archive/2014/02/back-transaction-logs-every-minute-yes-really/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;every minute&lt;/a&gt;
. The more critical your data the more often you should run them.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Development Annoyance</title>
      <link>https://www.funkysi1701.com/posts/2016/development-annoyance/</link>
      <pubDate>Fri, 29 Jan 2016 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2016/development-annoyance/</guid>
      <description>&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2016/01/How-you-can-stop-annoyance-or-frustrations-quickly.jpg?w=425&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;I spend a lot of my time creating new features that simplify my companies business processes.&lt;/p&gt;
&lt;p&gt;A good example of this is an invoicing system I created. Instead of users working off different spreadsheets and copying and pasting data between various different programs the user can click a couple of buttons and everything is done and they can move on to the next task.&lt;/p&gt;
&lt;p&gt;I am currently expanding this system so more of the companies work can be invoiced quickly and simply.&lt;/p&gt;
&lt;h2 id=&#34;i-like-working-on-this-kind-of-problem&#34;&gt;I like working on this kind of problem.&lt;a class=&#34;anchor ms-1&#34; href=&#34;#i-like-working-on-this-kind-of-problem&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I get to discuss with the different departments involved, finding out how they work and what could make their lives better.&lt;/p&gt;
&lt;p&gt;I then get to look at what structures already exist in the database and get to rip out anything that makes no sense (Today I had a Customer table which has a primary key called ClientId – its now a Client table with PK ClientId) and add new structures to store new information.&lt;/p&gt;
&lt;p&gt;I then can build a user interface so the users can interact with the data.&lt;/p&gt;
&lt;p&gt;But the most important part of the process comes next. This is when I show the users what I have built and how it will make their lives better, they can then feed back to me questions and comments. How do I do x?, what about y?, have you thought about z?&lt;/p&gt;
&lt;p&gt;After this very valuable feedback I can go back and tweak what I have done making it better and better until the users think it is suitable for what they need.&lt;/p&gt;
&lt;h2 id=&#34;now-why-did-i-call-this-post-development-annoyance&#34;&gt;Now why did I call this post development annoyance?&lt;a class=&#34;anchor ms-1&#34; href=&#34;#now-why-did-i-call-this-post-development-annoyance&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I find it intensely annoying that after spending weeks of my time working on creating something to be used. Users either make do with my solution and never tell me the one thing that really annoys them or worse they go back to the time consuming process and never feedback the one or two changes I need to make to complete the project.&lt;/p&gt;
&lt;p&gt;Now I am not perfect, like many IT people my people skills are somewhat lacking but apart from asking people what can you do to get the feedback you need to complete the project?&lt;/p&gt;
&lt;p&gt;I do not have the knowledge that other departments have so I consider development a team effort that requires everyone to contribute otherwise it will not finish.&lt;/p&gt;
&lt;p&gt;The second outcome where users return to their old ways is the most annoying. It could well be months or even years before I find out that what I created is not being used any more. By that time my memory of what I did and more importantly why I did what I did has been lost and forgotten.&lt;/p&gt;
&lt;p&gt;So users please, please tell me what works and what doesn’t and what things I can do to improve things. I want my solutions to constantly improve and get better and I can only do that with your help.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Star Trek Episode Review Arena</title>
      <link>https://www.funkysi1701.com/posts/2016/star-trek-episode-review-arena/</link>
      <pubDate>Thu, 21 Jan 2016 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2016/star-trek-episode-review-arena/</guid>
      <description>&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2016/01/Gorn.jpg?w=662&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Episode Title: &lt;strong&gt;Arena&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Star Trek Type: TOS&lt;/li&gt;
&lt;li&gt;Original Air Date: 19 January 1967&lt;/li&gt;
&lt;li&gt;Teleplay: Gene L Coon&lt;/li&gt;
&lt;li&gt;Story By: Frederic Brown&lt;/li&gt;
&lt;li&gt;Directed By: Joseph Pevney&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The episode begins with the Enterprise in orbit of Cestus III. Commodore Travers requests a tactical team join the away team. When the away team beam down Cestus III has been destroyed.&lt;/p&gt;
&lt;p&gt;Spock detects non-human life signs, obviously the aliens that destroyed the outpost. They attack the Enterprise, stranding the away team who are under heavy fire. Sulu is instructed to do whatever he can to protect the Enterprise and leaves orbit.&lt;/p&gt;
&lt;p&gt;Kirk finds the armoury and a grenade launcher, after firing the enemy withdraws.&lt;/p&gt;
&lt;p&gt;After beaming back aboard the Enterprise they pursue the unknown enemy into uncharted space. One of the survivors of Cestus III explains that the enemy attacked without warning.&lt;/p&gt;
&lt;p&gt;Kirk is determined to destroy the enemy ship before it reaches home and the Enterprise prepares for battle.&lt;/p&gt;
&lt;p&gt;An unknown solar system scans the Enterprise as they continue their pursuit of the enemy ship. The enemy ship comes to a complete stop. The Enterprise prepares to attack but before they can they also come to a complete stop. The Metrons have stopped both ships because both ships were on a mission of violence. The captains of both ships will be placed on a planet where the winner can destroy the other.&lt;/p&gt;
&lt;p&gt;Captain Kirk and the enemy captain appear on a desert planet. The enemy is a reptilian like species called the Gorn. The Gorn has superior strength to humans but Kirk manages to escape his first encounter.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;#34;This is Captain James Kirk of the Starship Enterprise. 
Whoever finds this, please get it to Starfleet Command. 
I’m engaged in personal combat with a creature apparently 
called a Gorn. He’s immensely strong. Already, 
he has withstood attacks from me that would have 
killed a Human being. Fortunately, though strong, 
he is not agile. The agility and I hope the cleverness, is mine.&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The Metrons said that the planet contained materials to allow the building of a weapon, however at first glance Kirk sees nothing that could help him defeat the much strong Gorn captain. He does find some diamonds, too small to be used as a weapon.&lt;/p&gt;
&lt;p&gt;Kirk pushes a huge boulder over a cliff onto the Gorn captain, which appears to knock him out, however he survives and Kirk barely escapes. Kirk then finds Sulphur, which triggers a memory.&lt;/p&gt;
&lt;p&gt;The Metrons allow the Enterprise to watch the last stages of Kirks struggle. They see Kirk discover Potassium Nitrate. The Gorn accuses the Federation of trespassing into their space.&lt;/p&gt;
&lt;p&gt;Kirk starts constructing a weapon using the diamonds, sulphur and potassium nitrate to make a gunpowder explosion to fire the diamonds at the Gorn captain. Just in time he applies a spark to his weapon and his opponent lies defeated.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2016/01/Gorn_Kirk_cannon.jpg?resize=300%2C225&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Kirk refused to kill the Gorn captain as they may have been just defending themselves. The Metron announces that Kirk has displayed the advanced trait of mercy and there may be hope for humanity after all.&lt;/p&gt;
&lt;p&gt;Thoughts: I like this episode very much. It has some classic Star Trek ideas in it.&lt;/p&gt;
&lt;p&gt;We have a super powerful alien race (the Metrons) that think there is hope for humanity.&lt;/p&gt;
&lt;p&gt;We have Kirk using raw materials to construct a weapon using simple chemistry.&lt;/p&gt;
&lt;p&gt;We have an enemy race that appears destructive but may have just been defending themselves.&lt;/p&gt;
&lt;p&gt;We have the classic location of Vasquez Rocks, somewhere that if I ever visit the US I have to visit.&lt;/p&gt;
&lt;p&gt;We have the very cheesy Gorn mask, yes its not realistic but the story is strong enough that it doesn’t really matter. Enterprise brought back the Gorn but as a CGI character and I think I may prefer the rubber mask.&lt;/p&gt;
&lt;p&gt;Interestingly the weapon Kirk builds would likely not work. The US show MythBusters proved that the bamboo wasn’t strong enough to hold the explosion and the weapon would likely wound Kirk as much as it would wound the Gorn.&lt;/p&gt;
&lt;p&gt;Score: 10/10
Redshirt Count: Cestus III Outpost, 1 Red Shirt and 1 yellow shirt from away team.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Disaster Planning</title>
      <link>https://www.funkysi1701.com/posts/2016/disaster-planning/</link>
      <pubDate>Thu, 14 Jan 2016 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2016/disaster-planning/</guid>
      <description>&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2016/01/flood.jpg?resize=1024%2C1024&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Over the Christmas break the city of York experienced the worst flooding disaster it has seen in recent years. If you want to help donations are being taken at &lt;a href=&#34;https://mydonate.bt.com/events/yorkfloodappeal/272657&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;York Flood Appeal&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;Luckily I wasn’t affected but it was really sad seeing many of my favourite streets full of water. Thousands of people had to be evacuated from their homes when the water was at its highest.&lt;/p&gt;
&lt;p&gt;York has its phone exchange located in the centre of the city and as the flood waters rose, this building flooded. BT who run the exchange worked flat out trying to restore phone and broadband services to York and the surrounding area, but this lead to at least 24 hours or more of downtime for users.&lt;/p&gt;
&lt;p&gt;During this time most of the city wasn’t able to take card payments from customers (due to an internet connection being required), cash machines were not working for the same reasons and the most worrying thing access to emergency services was not available.&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;Anyone would think the city phones were down &lt;a href=&#34;https://twitter.com/hashtag/yorkfloods?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#yorkfloods&lt;/a&gt; &lt;a href=&#34;https://twitter.com/hashtag/bthardatwork?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#bthardatwork&lt;/a&gt; &lt;a href=&#34;https://t.co/ZavLMsG2Js&#34;&gt;pic.twitter.com/ZavLMsG2Js&lt;/a&gt;&lt;/p&gt;&amp;mdash; Simon Foster (@funkysi1701) &lt;a href=&#34;https://twitter.com/funkysi1701/status/681439632886738944?ref_src=twsrc%5Etfw&#34;&gt;December 28, 2015&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;p&gt;I am in no way critical of the hard working engineers that worked on the BT exchange to restore services to the city. However I have to ask what was contained in the BT disaster recovery plan.&lt;/p&gt;
&lt;p&gt;As an IT Manager myself backups and disaster planning is something I need to think about and plan for. Recent investment in our internet connection meant that we are now on a leased line so BTs downtime would not have affected us in terms of network connectivity, I am uncertain about phone but I believe as a business we could have continued running during this time if we needed to.&lt;/p&gt;
&lt;p&gt;Planning for a disaster is not something I ever make enough time, however I definitely want to spend more time on it and I do have the basics of a plan in my head which is probably more than BT has.&lt;/p&gt;
&lt;p&gt;BT is a huge company they run almost the entire country’s phone lines and according to &lt;a href=&#34;https://en.wikipedia.org/wiki/BT_Group&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;wikipedia&lt;/a&gt;
 have operations in 170 countries. I think that they can afford to have someone plan for disaster recovery.&lt;/p&gt;
&lt;p&gt;The York Exchange is located next to a river that often floods. What could the company have done to avoid this problem?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Relocate some or all of its services to a location away from the river.&lt;/li&gt;
&lt;li&gt;Add the ability to reroute services through an alternative exchange.&lt;/li&gt;
&lt;li&gt;Many towns and villages surrounding York use the BT exchange surely some of these could have been configured to use other exchanges.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In these days of terror alerts and bomb scares. Imagine if York was London and all it took to take down communication ability of the capital was one Exchange to be offline?&lt;/p&gt;
&lt;p&gt;I am sure BT are looking at what they did right and what they did wrong and if you are reading this have a look at your own disaster recovery policy. Don’t get caught out like BT did.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Top 50 Star Trek episodes</title>
      <link>https://www.funkysi1701.com/posts/2016/top-50-star-trek-episodes/</link>
      <pubDate>Thu, 07 Jan 2016 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2016/top-50-star-trek-episodes/</guid>
      <description>&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2016/01/07df3N8m.jpg?w=512&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;In 1966 a TV show called &lt;a href=&#34;http://www.startrek.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Star Trek&lt;/a&gt;
 first aired in the USA. Since then 726 episodes have been made and 12 films have been released. 2016 marks the 50th anniversary and Star Trek is as alive as ever with a new film due out this summer and a brand new TV series in the works for broadcast in 2017.&lt;/p&gt;
&lt;p&gt;But what can I do to celebrate? With that many episodes I don’t have enough time to re-watch every episode so how about a re-watch of the top 50 episodes.&lt;/p&gt;
&lt;p&gt;Star Trek has five live action TV series so all I need to do is pick my top 10 from each.&lt;/p&gt;
&lt;h2 id=&#34;star-trek&#34;&gt;Star Trek&lt;a class=&#34;anchor ms-1&#34; href=&#34;#star-trek&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2016/01/Landing_party_beams_up_from_Guardian_planet.jpg?resize=300%2C225&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;The original Star Trek series first aired on September 8th 1966. It lasted only three years and 79 episodes. This series featured the iconic characters Kirk, Spock and Bones on a five-year mission to explore space.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The City on the Edge of Forever&lt;/li&gt;
&lt;li&gt;The Devil in the Dark&lt;/li&gt;
&lt;li&gt;Balance of Terror&lt;/li&gt;
&lt;li&gt;The Trouble with Tribbles&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.funkysi1701.com/2016/01/21/star-trek-episode-review-arena/&#34;&gt;Arena&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;This Side of Paradise&lt;/li&gt;
&lt;li&gt;Amok Time&lt;/li&gt;
&lt;li&gt;Space Seed&lt;/li&gt;
&lt;li&gt;Mirror Mirror&lt;/li&gt;
&lt;li&gt;The Deadly Years&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;star-trek-the-next-generation&#34;&gt;Star Trek: The Next Generation&lt;a class=&#34;anchor ms-1&#34; href=&#34;#star-trek-the-next-generation&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2016/01/Senior_staff_poker_game.jpg?resize=300%2C226&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;The first spin-off series set 100 years after Kirk featured a new Enterprise continuing to explore space. This series aired between 1987 and 1994 for 178 episodes.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;http://www.funkysi1701.com/2016/02/18/star-trek-episode-review-the-best-of-both-worlds/&#34;&gt;Best of Both Worlds&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Yesterdays Enterprise&lt;/li&gt;
&lt;li&gt;The Offspring&lt;/li&gt;
&lt;li&gt;The Measure of a Man&lt;/li&gt;
&lt;li&gt;Disaster&lt;/li&gt;
&lt;li&gt;All Good Things…&lt;/li&gt;
&lt;li&gt;Tapestry&lt;/li&gt;
&lt;li&gt;The Inner Light&lt;/li&gt;
&lt;li&gt;Cause and Effect&lt;/li&gt;
&lt;li&gt;Unification&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;star-trek-deep-space-nine&#34;&gt;Star Trek: Deep Space Nine&lt;a class=&#34;anchor ms-1&#34; href=&#34;#star-trek-deep-space-nine&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2016/01/Federation_fleet_prepares_to_engage_Dominion_fleet.jpg?resize=300%2C229&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;The second spin-off series which ran at the same time as TNG was set on a space station so instead of exploring adventures arrived via a stable wormhole. This series aired between 1993 and 1999 for 176 episodes.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Emissary&lt;/li&gt;
&lt;li&gt;Duet&lt;/li&gt;
&lt;li&gt;The Way of the Warrior&lt;/li&gt;
&lt;li&gt;The Visitor&lt;/li&gt;
&lt;li&gt;Sacrifice of Angels&lt;/li&gt;
&lt;li&gt;Waltz&lt;/li&gt;
&lt;li&gt;Trials and Tribble-ations&lt;/li&gt;
&lt;li&gt;In the Pale Moonlight&lt;/li&gt;
&lt;li&gt;Far Beyond the Stars&lt;/li&gt;
&lt;li&gt;Siege of AR 558&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;star-trek-voyager&#34;&gt;Star Trek: Voyager&lt;a class=&#34;anchor ms-1&#34; href=&#34;#star-trek-voyager&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2016/01/Voyager_away_team.jpg?resize=300%2C246&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;The third spin-off series ran after TNG and featured a female captain and a starship stranded in a remote part of the galaxy journeying home. This series aired between 1995 and 2001 for 172 episodes.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Scorpions&lt;/li&gt;
&lt;li&gt;Year of Hell&lt;/li&gt;
&lt;li&gt;Caretaker&lt;/li&gt;
&lt;li&gt;Message in a Bottle&lt;/li&gt;
&lt;li&gt;Eye of the Needle&lt;/li&gt;
&lt;li&gt;Heroes and Demons&lt;/li&gt;
&lt;li&gt;Jetrel&lt;/li&gt;
&lt;li&gt;Timeless&lt;/li&gt;
&lt;li&gt;Pathfinder&lt;/li&gt;
&lt;li&gt;Riddles&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;star-trek-enterprise&#34;&gt;Star Trek: Enterprise&lt;a class=&#34;anchor ms-1&#34; href=&#34;#star-trek-enterprise&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2016/01/Andorians_pjem.jpg?resize=300%2C207&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;The most recent spin-off ran after Voyager and was set 100 years before Kirk. This series aired between 2001 and 2005 for 98 episodes.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Broken Bow&lt;/li&gt;
&lt;li&gt;The Andorian Incident&lt;/li&gt;
&lt;li&gt;Shuttlepod One&lt;/li&gt;
&lt;li&gt;In a Mirror Darkly&lt;/li&gt;
&lt;li&gt;Twilight&lt;/li&gt;
&lt;li&gt;Damage&lt;/li&gt;
&lt;li&gt;Azati Prime&lt;/li&gt;
&lt;li&gt;Regeneration&lt;/li&gt;
&lt;li&gt;Impulse&lt;/li&gt;
&lt;li&gt;Zero Hour&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I am not going to review each episode here, I will save that for future blogs. With 50 episodes that is one a week to get them all reviewed during Star Trek’s birthday year. We will see if I manage to keep to that schedule.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>A look back at 2015</title>
      <link>https://www.funkysi1701.com/posts/2015/look-back-2015/</link>
      <pubDate>Thu, 31 Dec 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/look-back-2015/</guid>
      <description>&lt;p&gt;Wow! What an amazing year 2015 has been and with 2015 about to end I thought it would be good to look back at what happened in this amazing year.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/12/151218181153-2015-year-in-review-biggest-stories-wrap-up-orig-00025316-large-169.jpg?w=460&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;January&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I started the year with a declaration that 2015 would be my year of code. Well I have had a few breaks from programming but I have learnt loads this year. I have flitted a bit concentrating on different areas of programming but I think that has broadened my knowledge. I consider myself to be a &lt;a href=&#34;http://www.funkysi1701.com/2015/06/03/im-a-developer-now/&#34;&gt;programmer now&lt;/a&gt;
, which I didn’t at the start of 2015.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;February&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A first for 2015 was appearing on a &lt;a href=&#34;http://www.funkysi1701.com/2015/01/27/podcasts/&#34;&gt;podcast&lt;/a&gt;
. The Trekmate podcast &lt;a href=&#34;http://www.funkysi1701.com/2015/02/13/ten-forward-episode-135-anti-firbob-is-back-or-simons-desert-island-trek/&#34;&gt;Ten Forward&lt;/a&gt;
 were the lucky ones that got to experience my first attempt at talking to the world. This continued throughout the year with appearances on &lt;a href=&#34;http://www.funkysi1701.com/2015/07/30/upper-pylon-2-1-x-09-the-passenger/&#34;&gt;Upper Pylon 2&lt;/a&gt;
, &lt;a href=&#34;http://www.funkysi1701.com/2015/10/08/the-hunted-tng-s3-e11-the-battle-bridge/&#34;&gt;The Battle Bridge&lt;/a&gt;
 and even the &lt;a href=&#34;http://www.funkysi1701.com/2015/11/12/star-trek-is-back-in-2017/&#34;&gt;Sci-Fi Waffle&lt;/a&gt;
 podcast.&lt;/p&gt;
&lt;p&gt;It was a sad time for Trekkies at the end of February when &lt;a href=&#34;http://www.funkysi1701.com/2015/02/28/hes-really-not-dead-as-long-as-we-remember-him/&#34;&gt;Leonard Nimoy&lt;/a&gt;
 passed away.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;March&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In March I talked about my recent efforts with &lt;a href=&#34;http://www.funkysi1701.com/2015/03/12/azure-traffic-manager/&#34;&gt;Azure Traffic Manager&lt;/a&gt;
 to help prevent downtime. I also spent a lot of time improving &lt;a href=&#34;http://www.funkysi1701.com/2015/03/05/database-deployment/&#34;&gt;databases&lt;/a&gt;
 which led me to consider ways to deploy it better.&lt;/p&gt;
&lt;p&gt;Also in March I attended an IT networking event called &lt;a href=&#34;http://www.funkysi1701.com/2015/03/22/networking-event/&#34;&gt;ITBoss&lt;/a&gt;
. Free food and drinks and a discussion with fellow IT Managers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;April&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;April was a bit of a mixed bag. I celebrated my second wedding anniversary but I also said goodbye to my car due to financial reasons.&lt;/p&gt;
&lt;p&gt;I played about with a &lt;a href=&#34;http://www.funkysi1701.com/2015/04/11/the-raspberry-pi-adventure-starts/&#34;&gt;Raspberry Pi&lt;/a&gt;
, mostly with the &lt;a href=&#34;http://www.funkysi1701.com/2015/04/15/security-camera-with-raspberry-pi-camera/&#34;&gt;camera&lt;/a&gt;
. I really must make some time to play with it more.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;May&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In May I went to a C# User Group called Leeds Sharp, was great fun and I really need to make more time and go back in 2016. It did result in one of my &lt;a href=&#34;http://www.funkysi1701.com/2015/05/30/user-groups-and-f/&#34;&gt;most popular blog posts&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;Usually developers don’t enjoy finding bugs in their software but I had great fun when I realised I had a &lt;a href=&#34;http://www.funkysi1701.com/2015/05/22/overflow/&#34;&gt;Stack Overflow&lt;/a&gt;
 in one of my databases, it was easy to fix once I worked out what was going on.&lt;/p&gt;
&lt;p&gt;In May the UK went to the polls as we had another General Election.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;June&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In June I celebrated my &lt;a href=&#34;http://www.funkysi1701.com/2015/06/17/50th-blog-post/&#34;&gt;50th Blog Post&lt;/a&gt;
. Amazing to think I had already written 50 Blog posts, even more now!&lt;/p&gt;
&lt;p&gt;Leeds Sharp had a coding challenge, to solve &lt;a href=&#34;http://www.funkysi1701.com/2015/06/26/sudoku-challenge/&#34;&gt;Sodoku&lt;/a&gt;
 puzzle programatically. Didn’t get it finished but made a good stab at it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;July&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In July it was SysAdmin Day and I celebrated with my staff the amazing work we do keeping everything working.&lt;/p&gt;
&lt;p&gt;Microsoft launched &lt;a href=&#34;http://www.funkysi1701.com/2015/07/11/how-to-upgrade-to-windows-10/&#34;&gt;Windows 10&lt;/a&gt;
 in July, the latest operating system is being offered for free for a year.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;August&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In August everything changed as my son &lt;a href=&#34;http://www.funkysi1701.com/2015/09/03/baby-magic-and-becoming-a-father/&#34;&gt;James&lt;/a&gt;
 was born. I took time out from blogging and work during this time to spend with James.&lt;/p&gt;
&lt;p&gt;Before James was born I stepped down from my involvement with the &lt;a href=&#34;http://www.funkysi1701.com/2015/08/03/volunteering-for-a-technical-team/&#34;&gt;technical team&lt;/a&gt;
 at St Michael le Belfrey.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;September&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In september it was back to work, where I started planning how to add &lt;a href=&#34;http://www.funkysi1701.com/2015/09/24/adding-internet-connection-resiliency/&#34;&gt;internet connections&lt;/a&gt;
 to reduce the chance of outages.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;October&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In October I took James to a &lt;a href=&#34;http://www.funkysi1701.com/2015/10/22/james-goes-on-an-adventure-with-daddy/&#34;&gt;dads group&lt;/a&gt;
. This was the first time Dad spent time with James without Mummy and it was awesome.&lt;/p&gt;
&lt;p&gt;I also celebrated my first birthday after becoming a father, was great to have a card from James. James also got the chance to spend time with my family in Nottingham.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;November&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In November the countdown to Christmas began with James appearing in his first Nativity as Jesus and dressed up as an Elf at a Christingle service.&lt;/p&gt;
&lt;p&gt;Exciting Star Trek news was announced this month, a new &lt;a href=&#34;http://www.funkysi1701.com/2015/11/12/star-trek-is-back-in-2017/&#34;&gt;TV series&lt;/a&gt;
 is to be aired in January 2017. No other details yet but very exciting.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;December&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;December is all about &lt;a href=&#34;http://www.funkysi1701.com/2015/12/24/christmas-2015-fosters/&#34;&gt;Christmas&lt;/a&gt;
 and we had a great Christmas time as a family.&lt;/p&gt;
&lt;p&gt;Sadly York was hit by Floods just after Christmas, luckily my family was not affected but many others have been. Hopefully by the time you read this the cleanup will be well underway.&lt;/p&gt;
&lt;p&gt;Before Christmas I spent my time counting down the days with the &lt;a href=&#34;http://www.funkysi1701.com/2015/12/17/christmas-count-code/&#34;&gt;Advent of Code&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What will 2016 bring?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I don’t know. There will be lots more time with James as he continues to learn and develop. I will continue to learn and develop my coding skills. Watch this space as I keep blogging about it.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Christmas 2015 with the Fosters</title>
      <link>https://www.funkysi1701.com/posts/2015/christmas-2015-fosters/</link>
      <pubDate>Thu, 24 Dec 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/christmas-2015-fosters/</guid>
      <description>&lt;p&gt;Four months ago James David Martin Foster was born. And he is even more awesome now than when he was born.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/12/20151206_105450.jpg?w=747&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;As I write this James only has a few sleeps (as James sleeps multiple times in a day I can’t put an exact number) until his first Christmas. James is pretty much unaware of what is going on as he is still too young but that doesn’t stop his parents enjoying the season.&lt;/p&gt;
&lt;p&gt;He has lots of Christmas themed clothes which we have been enjoying taking pictures of him wearing. He makes a great looking elf I think.&lt;/p&gt;
&lt;p&gt;We took James to his first Christingle service at &lt;a href=&#34;http://belfrey.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;St Michael le Belfrey&lt;/a&gt;
 at the start of December. A Christingle service is where you stick a candle and cocktail sticks into an orange. James loved it, he already loves looking at lights so loved looking into the light from the candle.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/12/12333053_10153912153609155_79017677_o.jpg?resize=168%2C300&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Another Christmas activity we did this year as a family was to appear in a nativity. St Michael le Belfrey every Christmas hold a cafe to tell people the good news about Christmas and they have a nativity outside which includes donkeys. Don’t we make a great holy family. (Excuse the coffee cups but it was cold.)&lt;/p&gt;
&lt;p&gt;Me and James’s mummy have gone a bit crazy with buying him presents, we have both got him lots of things to open on Christmas morning (or more likely mummy/daddy will do the opening)&lt;/p&gt;
&lt;p&gt;James also has three Christmas days to look forward to, with different sides of the family each no doubt with him as the centre of attention.&lt;/p&gt;
&lt;p&gt;Exciting times. Happy Christmas everyone, make yours as special as ours.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/12/12309579_10153809916077792_2703731936729335666_o.jpg?resize=225%2C300&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The Christmas count down with code</title>
      <link>https://www.funkysi1701.com/posts/2015/christmas-count-code/</link>
      <pubDate>Thu, 17 Dec 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/christmas-count-code/</guid>
      <description>&lt;p&gt;In December we count down the days to Christmas. People often have advent calendars filled with chocolates or even Lego.&lt;/p&gt;
&lt;p&gt;But what about if you are a programmer, how can you count down the days till Christmas? What about if you had a daily Christmas themed coding challenge? Well &lt;a href=&#34;https://www.adventofcode.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;www.adventofcode.com&lt;/a&gt;
 is the answer.
&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/12/adventofcode.jpg?w=691&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Each day a new challenge is available. So far the challenges are related to Christmas and Santa delivering his presents. The challenge is split into two closely linked parts. You are given a randomly generated input and your need to give an answer using a short string or number.&lt;/p&gt;
&lt;p&gt;The challenges are getting harder, with some completely defeating me, (not surprising with my limited programming knowledge). The challenges are language independent so you could try them in javascript or c#. I have been using Visual Studio and C# and my code is viewable on &lt;a href=&#34;https://github.com/funkysi/AdventSolution&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;github&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;So far I have completed Challenges 1 to 6 and also 10. Partly because I found challenge 7 very difficult but I am hoping to have another go at it.&lt;/p&gt;
&lt;p&gt;While coding through these challenges I have done a fair amount of refactoring. I started off with a simple console app with most of my code in one method. As the number of challenges increased I started moving the code for each challenge into its own class, with methods and properties that were unique to the challenge. I also added a main menu so you can choose which challenge to run. Some of my code to answer the challenges takes some time to run so this was quite a time saver over running each challenge in order.&lt;/p&gt;
&lt;p&gt;These challenges are very good at teaching me things about coding. I have got to think about data structures, what is the best way to store this information, classes and methods and return types, how to output data to the screen, how to input/import data.&lt;/p&gt;
&lt;p&gt;Before I try and work on the next challenge lets have a look at the first challenge:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Santa is trying to deliver presents in a large apartment building, 
but he can’t find the right floor – 
the directions he got are a little confusing. 
He starts on the ground floor (floor 0) 
and then follows the instructions one character at a time.

An opening parenthesis, (, means he should go up one floor, and a closing parenthesis, ), 
means he should go down one floor.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This is a simple loop through a long string of ( and ) and keep track of the floor number you are on to calculate what floor Santa finishes on. The second part of the challenge asks at what point in your input string does santa reach the basement (floor -1)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Roddenberry comic</title>
      <link>https://www.funkysi1701.com/posts/2015/roddenberry-comic/</link>
      <pubDate>Thu, 10 Dec 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/roddenberry-comic/</guid>
      <description>&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://www.funkysi1701.com/images/1-523x400.webp&#34; loading=&#34;lazy&#34;
   width=&#34;523&#34; height=&#34;400&#34;
   /&gt;

&lt;/p&gt;
&lt;p&gt;The Oatmeal created a comic which you really should check out. It can be found &lt;a href=&#34;http://theoatmeal.com/comics/plane&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;here&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;The comic tells the story of a plane crash, in which the 25 year old co-pilot goes back into the burning plane to rescue passengers and lead a group of survivors through the desert to find help.&lt;/p&gt;
&lt;p&gt;The co-pilot was named Gene Roddenberry, and after these events he stopped being a pilot and became a writer and eventually created Star Trek.&lt;/p&gt;
&lt;p&gt;In these uncertain times when you are stranded in the desert, get out and help someone, it may change the world.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>SQL Server Management Studio</title>
      <link>https://www.funkysi1701.com/posts/2015/sql-server-management-studio/</link>
      <pubDate>Thu, 03 Dec 2015 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/sql-server-management-studio/</guid>
      <description>&lt;p&gt;I use SQL Server Management Studio all the time for writing queries, getting data and general SQL development.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;SQL Server Management Studio&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/12/sql-server-2012-management-studio-splash-screen.png?resize=529%2C360&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;I have enjoyed seeing the improvements that each new version of SQL Server Management Studio (SSMS) introduced. One great improvement was intellisense.&lt;/p&gt;
&lt;p&gt;This feature saves typing and reduces errors by automatically suggesting tables, column names or other database objects.&lt;/p&gt;
&lt;p&gt;A common query that I get asked to write is provide a spreadsheet that gives the information that satisfies certain criteria. This is easy to do in SSMS, you can write the query, click execute and the rows that satisfy the criteria are displayed. These rows can then be easily copy/pasted into Excel or other spreadsheets.&lt;/p&gt;
&lt;p&gt;A common data item that gets stored in databases is addresses and addresses often contain line breaks to make the data display better. In the earlier versions of SSMS, when you copied and pasted these line breaks were ignored and the data displayed the same in SSMS as it did in Excel. However in the more recent version, theses line breaks got copied across breaking your spreadsheet and making it hard to see what data corresponded with what.&lt;/p&gt;
&lt;p&gt;Now I don’t know if this should be described as introducing a bug or fixing one. I can easily argue both sides. If your data contains a line break and you copy this data it should include the line break in the destination, but if it does that it displays badly in Excel.&lt;/p&gt;
&lt;p&gt;The fix I have been using until recently is to use the following TSQL command in my queries.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;REPLACE&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;REPLACE&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;str, CHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;13&lt;/span&gt;), &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;), CHAR(10), &amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This command replaces any line breaks with an empty string. Both Char(10) and Char(13) are needed because you can have different types of line breaks. This is great if you are writing the script from scratch but isn’t great if your are running a stored procedure or your query has a lot of columns.&lt;/p&gt;
&lt;p&gt;The answer to this is to use Visual Studio to run your SQL query. In Visual Studio you can write and run queries via Server Explorer and the results produced don’t contain line breaks. I have only just discovered this solution, but so far it has worked and is very easy to do, plus as I do most of my development in Visual Studio anyway it saves me having to open SSMS to test my queries.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Black Friday Deals</title>
      <link>https://www.funkysi1701.com/posts/2015/black-friday-deals/</link>
      <pubDate>Fri, 27 Nov 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/black-friday-deals/</guid>
      <description>&lt;h2 id=&#34;over-50-off-this-black-friday&#34;&gt;Over 50% Off this Black Friday!&lt;a class=&#34;anchor ms-1&#34; href=&#34;#over-50-off-this-black-friday&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/11/86910937_t053ll31.jpg?w=660&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Yes your heard it correctly even &lt;a href=&#34;https://www.funkysi1701.com&#34;&gt;www.funkysi1701.com&lt;/a&gt;
 has amazing offers.&lt;/p&gt;
&lt;p&gt;It is like the whole world has gone “Black Friday” mad, with every company in the world offering amazing and unmissable deals.&lt;/p&gt;
&lt;p&gt;So in an attempt to cash in on all the Black Friday fuss I will write a quick blog post about it.&lt;/p&gt;
&lt;p&gt;I mentioned 50% off well this month I have blogged 50% less than usual. There is one main reason for this, my new born son James is taking a lot of my time and energy and I think it will take a few months of sporadic blog posts before I get the balance right.&lt;/p&gt;
&lt;p&gt;I am not a big fan of spending just for the sake of it. Encouraging people to spend money they don’t have, on things they don’t need shouldn’t be encouraged. However times are hard so companies need to do what they need to, to try and make money.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Star Trek is back (in 2017)</title>
      <link>https://www.funkysi1701.com/posts/2015/star-trek-is-back-in-2017/</link>
      <pubDate>Thu, 12 Nov 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/star-trek-is-back-in-2017/</guid>
      <description>&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;3f448330857e4ca7ba40ab5465a3c2cb62cdb98c&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/11/3f448330857e4ca7ba40ab5465a3c2cb62cdb98c.png?resize=620%2C260&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;As you have probably heard Star Trek is coming back to TV. I recently joined with the Sci Fi Waffle podcast to discuss.&lt;/p&gt;
&lt;p&gt;Sci Fi Waffle: Episode 12 – STAR TREK IS BACK!!&lt;/p&gt;
&lt;p&gt;In this episode we discuss the great news that Star Trek IS BACK!!.&lt;/p&gt;
&lt;p&gt;Shawn and I are joined again by James Roberts and TrekMates News feed Editor Simon Foster to speculate about the announcement of a new Star Trek TV series due to debut in January 2017.&lt;/p&gt;
&lt;p&gt;James can be found on our sister podcast &lt;a href=&#34;http://www.trekmate.org.uk/category/the-battle-bridge/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;The Battle Bridge&lt;/a&gt;
 and Simon can be found on Twitter &lt;a href=&#34;https://twitter.com/funkysi1701&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;@funkysi1701&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;To listen go &lt;a href=&#34;http://www.trekmate.org.uk/sci-fi-waffle-episode-11-star-trek-is-back/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;http://www.trekmate.org.uk/sci-fi-waffle-episode-11-star-trek-is-back/&lt;/a&gt;
, to leave feedback go &lt;a href=&#34;http://forum.trekmatefamily.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;http://forum.trekmatefamily.com/&lt;/a&gt;
&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How to speak to the whole world</title>
      <link>https://www.funkysi1701.com/posts/2015/how-to-speak-to-the-whole-world/</link>
      <pubDate>Thu, 05 Nov 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/how-to-speak-to-the-whole-world/</guid>
      <description>&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/10/world.png?w=648&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Having a website is an easy way to reach people across the globe. This website has reached people in almost every continent.&lt;/p&gt;
&lt;p&gt;I have had visitors in each of the following countries.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;United States&lt;/li&gt;
&lt;li&gt;United Kingdom&lt;/li&gt;
&lt;li&gt;Canada&lt;/li&gt;
&lt;li&gt;Germany&lt;/li&gt;
&lt;li&gt;Australia&lt;/li&gt;
&lt;li&gt;India&lt;/li&gt;
&lt;li&gt;France&lt;/li&gt;
&lt;li&gt;Vietnam&lt;/li&gt;
&lt;li&gt;Netherlands&lt;/li&gt;
&lt;li&gt;Poland&lt;/li&gt;
&lt;li&gt;China&lt;/li&gt;
&lt;li&gt;Russia&lt;/li&gt;
&lt;li&gt;Sweden&lt;/li&gt;
&lt;li&gt;European Union&lt;/li&gt;
&lt;li&gt;New Zealand&lt;/li&gt;
&lt;li&gt;Hungary&lt;/li&gt;
&lt;li&gt;Norway&lt;/li&gt;
&lt;li&gt;Spain&lt;/li&gt;
&lt;li&gt;Brazil&lt;/li&gt;
&lt;li&gt;Hong Kong SAR China&lt;/li&gt;
&lt;li&gt;Belgium&lt;/li&gt;
&lt;li&gt;Denmark&lt;/li&gt;
&lt;li&gt;Italy&lt;/li&gt;
&lt;li&gt;Switzerland&lt;/li&gt;
&lt;li&gt;Finland&lt;/li&gt;
&lt;li&gt;Turkey&lt;/li&gt;
&lt;li&gt;Romania&lt;/li&gt;
&lt;li&gt;Singapore&lt;/li&gt;
&lt;li&gt;Israel&lt;/li&gt;
&lt;li&gt;Indonesia&lt;/li&gt;
&lt;li&gt;Serbia&lt;/li&gt;
&lt;li&gt;South Africa&lt;/li&gt;
&lt;li&gt;Lithuania&lt;/li&gt;
&lt;li&gt;Mexico&lt;/li&gt;
&lt;li&gt;Ireland&lt;/li&gt;
&lt;li&gt;South Korea&lt;/li&gt;
&lt;li&gt;Taiwan&lt;/li&gt;
&lt;li&gt;Greece&lt;/li&gt;
&lt;li&gt;Bulgaria&lt;/li&gt;
&lt;li&gt;Ukraine&lt;/li&gt;
&lt;li&gt;Japan&lt;/li&gt;
&lt;li&gt;Austria&lt;/li&gt;
&lt;li&gt;Kenya&lt;/li&gt;
&lt;li&gt;Portugal&lt;/li&gt;
&lt;li&gt;Czech Republic&lt;/li&gt;
&lt;li&gt;Colombia&lt;/li&gt;
&lt;li&gt;Philippines&lt;/li&gt;
&lt;li&gt;United Arab Emirates&lt;/li&gt;
&lt;li&gt;Moldova&lt;/li&gt;
&lt;li&gt;Slovenia&lt;/li&gt;
&lt;li&gt;Malaysia&lt;/li&gt;
&lt;li&gt;Ghana&lt;/li&gt;
&lt;li&gt;Argentina&lt;/li&gt;
&lt;li&gt;Venezuela&lt;/li&gt;
&lt;li&gt;Bangladesh&lt;/li&gt;
&lt;li&gt;Iceland&lt;/li&gt;
&lt;li&gt;Croatia&lt;/li&gt;
&lt;li&gt;Panama&lt;/li&gt;
&lt;li&gt;Belarus&lt;/li&gt;
&lt;li&gt;Slovakia&lt;/li&gt;
&lt;li&gt;Albania&lt;/li&gt;
&lt;li&gt;Kazakhstan&lt;/li&gt;
&lt;li&gt;Algeria&lt;/li&gt;
&lt;li&gt;Puerto Rico&lt;/li&gt;
&lt;li&gt;Thailand&lt;/li&gt;
&lt;li&gt;Estonia&lt;/li&gt;
&lt;li&gt;U.S. Virgin Islands&lt;/li&gt;
&lt;li&gt;Pakistan&lt;/li&gt;
&lt;li&gt;Latvia&lt;/li&gt;
&lt;li&gt;Chile&lt;/li&gt;
&lt;li&gt;Sri Lanka&lt;/li&gt;
&lt;li&gt;Malta&lt;/li&gt;
&lt;li&gt;Costa Rica&lt;/li&gt;
&lt;li&gt;Morocco&lt;/li&gt;
&lt;li&gt;Ethiopia&lt;/li&gt;
&lt;li&gt;Réunion&lt;/li&gt;
&lt;li&gt;Uruguay&lt;/li&gt;
&lt;li&gt;Honduras&lt;/li&gt;
&lt;li&gt;Cyprus&lt;/li&gt;
&lt;li&gt;Tunisia&lt;/li&gt;
&lt;li&gt;Nepal&lt;/li&gt;
&lt;li&gt;Cameroon&lt;/li&gt;
&lt;li&gt;Paraguay&lt;/li&gt;
&lt;li&gt;Gambia&lt;/li&gt;
&lt;li&gt;Peru&lt;/li&gt;
&lt;li&gt;Mauritius&lt;/li&gt;
&lt;li&gt;Bermuda&lt;/li&gt;
&lt;li&gt;Cambodia&lt;/li&gt;
&lt;li&gt;Jersey&lt;/li&gt;
&lt;li&gt;Egypt&lt;/li&gt;
&lt;li&gt;Macedonia&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;How cool is that! If you know anyone from any country not mentioned above, send them a link to this page and lets see if we can get this blog seen in even more countries.&lt;/p&gt;
&lt;p&gt;Only a few years ago it would have been incredibly difficult to communicate your ideas to the whole world, now it is available to everyone at a touch of a button.&lt;/p&gt;
&lt;p&gt;The internet has a lot to answer for. On the one hand it is blamed for a decrease of communication between people as they stare at their devices all the time, but on the other hand it has greatly improved communication over larger distances like the use of Skype or the ability to broadcast your ideas on websites and social media.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Top 10 Warp 11 Songs</title>
      <link>https://www.funkysi1701.com/posts/2015/top-10-warp-11-songs/</link>
      <pubDate>Thu, 29 Oct 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/top-10-warp-11-songs/</guid>
      <description>&lt;h2 id=&#34;i-dont-want-to-go-to-work-just-want-to-hang-with-captain-kirk&#34;&gt;I don’t want to go to work Just want to hang with Captain Kirk&lt;a class=&#34;anchor ms-1&#34; href=&#34;#i-dont-want-to-go-to-work-just-want-to-hang-with-captain-kirk&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I am a big Warp 11 fan. Warp 11 are a Star Trek rock band from Sacramento, California. Their songs often feature bad language, sex and drinking but always feature references to Star Trek characters and episodes and a good dose of humour.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/10/redAlertCover_02.jpg?w=250&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;I first listened to Warp 11 in about 2004 and have listened to every album they have released since. The second album Red Alert is probably my favourite but all their albums have a few tracks which I love. They have just released their seventh album and to celebrate this I will list my favourite tracks.&lt;/p&gt;
&lt;p&gt;All lyrics are by Warp 11 and no infringement is intended, if you like what you see go to their website (&lt;a href=&#34;https://www.warp11.com&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;www.warp11.com&lt;/a&gt;
), or buy their music. Also Warp 11 if you are reading this, come to the UK, I would love to hear you perform live.&lt;/p&gt;
&lt;ol start=&#34;10&#34;&gt;
&lt;li&gt;&lt;strong&gt;It’s Dead Jim&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;From the fourth album &lt;strong&gt;It’s Dead Jim&lt;/strong&gt;. This song came out after Enterprise was cancelled and is all about the fact there was no more new trek being made. It was a bleak time to be a trekkie and I shared Warp 11’s sadness in this song.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;First they took my TOS
Then they took my TNG
Said “bon voyage” to Voyager
Now there’s nothing left for me

Decommissioned DS9
Now there’s no more Enterprise
Erased the animated show
Yeah, she met a quick demise

The final frontier has been finalized
There ain’t no coming back
It’s getting no reprise
It boldly came and went
Got no Trek to represent
I never thought the day
Would come that I had to say
It’s dead Jim

Space is cold and so am I
Just like Kirk my show has died
Everything has gone awry
I guess it’s time to say goodbye

‘Cause Scotty’s gone and so is Bones
They took their final voyage home
And I guess I’ve always known
That some day I’d be alone

Tore down the sets today
Gave the plastic ears away
Sold the props on eBay
Left my life in disarray

It’s dead Jim
Until they bring it back again
&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;9&#34;&gt;
&lt;li&gt;&lt;strong&gt;7 of Mine&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;From the second album &lt;strong&gt;Red Alert&lt;/strong&gt;. 7 of 9 is one sexy character so it is no surprise that Warp 11 chose to sing about that in a few songs and I think this is probably the best example.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Flesh and bone and silicone
You’re all by yourself, but you’re never alone
You’re pretty smooth, for a chick full of wires
So cold to the touch
But you set me on fire

Assimilate me
Dominate me
Short circuit my mind
Energize me
Your thighs always rise me
Let’s go out and make your gears grind
Seven of mine

One minute you’re cruel
And then you’re kind
You gave me a virus, but baby I don’t mind
‘Cause I self destruct when I see your behind
I’ll show you the difference between seven and nine

Chorus

Well, life and love are so absurd
And assimilation is the final word
Resistance is futile can’t you see
So, come on now baby and assimilate me
I’ll give you an identity
Locutus ain’t got nothing on me, oh yeah

Let’s grab a shuttle and go to your cube
You bring the oil and honey I’ll bring the lube
It’s not monogamy
‘Cause in the end
When I’m f****** you, I’m f****** all of your friends

Chorus
&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;8&#34;&gt;
&lt;li&gt;&lt;strong&gt;Old Country Dr.(The Ballad Of Bones)&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;From the second album &lt;strong&gt;Red Alert&lt;/strong&gt;. A song dedicated to Bones so of course it is great. The use of harmonica makes you think of the country doctor which is a nice touch. This song gets a sequel as well on one of the later albums.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Well, they call me Bones and I’m third in command
Second in line is a man I just can’t stand
He’s a green blooded, pointy-eared, seven year itch
And when he pon farrs
He’ll try to make me his bitch

Well, I may or may not have divorced my wife
But I damn sure pulled the plug on my daddy’s life
And two months later, well, they found a cure
I’m just an old country doctor on a damned five year tour

The damned teleporter
Yeah, it gives me the creeps
The first time I used it
I couldn’t get it up for weeks
Now my tricorder’s busted
And sick bay just stinks
I guess I’ll just go replicate me a drink

Chorus

Well, Jim is the captain of this here ship
We call her the Enterprise, and the crew’s pretty hip
Yeah, the girls all wear go-go boots and miniskirts
And I spend my days patching all the red shirts

Well, I have been asked to do many a thing
Outside the area of my expertise
Damn it Jim, I know I’ve told you before
Damn it Jim, I know I’ve told you before
Damn it Jim, damn it Jim, I told you before

I’m just an old country doctor on a damned five year tour
Just an old country doctor on a damned five year tour
&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;7&#34;&gt;
&lt;li&gt;&lt;strong&gt;Space Happy&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;From the second album &lt;strong&gt;Red Alert&lt;/strong&gt;. This song is just solid good fun, with a catchy chorus that I can’t help singing along to.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Gonna take a five year tour
Boldly go where no man’s gone before
Gonna travel to the end
And make new friends

Move ahead warp factor ten
Put a miniskirt on my yeoman
Represent the human race
And we’ll make space
A happy place

To boldly go where no man’s gone before
I think I sang that line once before
(But I’m not too sure)
We’ll be so happy – can’t you see?
A zero-g community

Gonna travel to new worlds
Beam on down and meet some green girls
Gonna see what we can see
A fancy-free galaxy

Chorus

Come and take a tour with me
They’ll be no Kahns or Kobiashi
Gonna travel to the end
And make new friends
With aliens

Chorus
&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;6&#34;&gt;
&lt;li&gt;&lt;strong&gt;And Thats Why I’m In A Star Trek Band&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;From the second album &lt;strong&gt;Red Alert&lt;/strong&gt;. Not only does the start of this song make me think of the postman pat theme but it is good fun.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;I love gettin’ hummers from chicks dressed as Klingons
Bumpy heads bobbin’ up and down
Like their necks have a spring on
And I know their teeth hurt
But I still get my thing on

And that’s why
And that’s why
I’m in a Star Trek band

I wanna tag team a stripper with Mr. William Shatner
He’ll take the front and hell, I’ll take the back-ner
And when we blow
We’re gonna reach warp factor

And that’s why
And that’s why
I’m in a Star Trek band

Well, people ask me
Where do I find my joy?
Do I like hot girls, green aliens or young boys?
Well, I got two words for you my friend – Leonard Nimoy

And that’s why
And that’s why
I’m in a Star Trek band

And that’s why
And that’s why
We’re in a Star Trek band
&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;&lt;strong&gt;Everything I Do (I Do With William Shatner)&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;From the second album &lt;strong&gt;Red Alert&lt;/strong&gt;. This was probably the first Warp 11 song I heard and it made me want to listen to the rest. Warp 11 don’t just mention trek, they are actual fans as you can tell from the references that litter their songs.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Everything I do, I do with William Shatner
Loosing all my hair while my belly’s growing fat-ner
And when I drink too much
He holds my hair in his hands
And while I’m blowing chunks
He treats me like the captain

Oh, when we get together we boldly go
Talk about our favorite episodes
I don’t want to go to work
Just want to hang with Captain Kirk
And if I had my way I’d make it so

Everything I do, I do with William Shatner
We drink a couple of brews
Go to the Laundromat-ner
When our clothes are dry
We fold them up together
‘Cause everything I do, I do with William Shatner

Chorus

Hey, spend more time with him than George Takei
Say full speed ahead and we’re on our way
He is so mysterious
His middle name’s Tiberius
And he’ll make me his cabin boy someday

Hey Bill – Let’s go get a tan
Hey Bill – And a green woman
Hey Bill – We’ll kill some Romulans
Hey Bill – I’m your number one fan

‘Cause everything I do, I do with William Shatner
We go to the rodeo and put on our cowboy hat-ners
When we paint the town
We buy each other dinner
We’re fully functional
Just like Brent Spiner

Everything I do, I do with William Shatner
And don’t you wish that you could do it too
&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;&lt;strong&gt;What would William Shatner do?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;From the fifth album &lt;strong&gt;I Don’t Want to Go to Heaven as Long as They Have Vulcans in Hell&lt;/strong&gt;. Everyone’s been in situations where they would like to keep there fandom a secret. And what would William Shatner do?&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;I’ve got a girl, the coolest girl in the world
But she ain’t fly for the guys in sci-fi
And I’m a guy with a model Enterprise
Imagine her surprise if she ever finds out

I’ve got a queen, but she only wears blue jeans
And I am a guy in Kirk t-shirt
Black boots and a red miniskirt
I’ll be in world of hurt if she ever finds out

I’ve got to think about it
I’ve got to work it through
If she learns my dark secret
What would William Shatner do?

I’ve got a chick, in bed a lunatic
Won’t be my whore if she knows I love Star Wars
And I know only one thing for sure
I’ll never score If she ever finds out

I’ve got to make a choice now
Deceive her or tell her true
I know Vulcans never lie but
What would William Shatner do?

I love War of the Worlds, got a b**** for green girls
Alien nations, deep space stations
I love flying saucers, say “live long and prosper”
“May the force be with you”, Mr. Sulu

I want to be your man, “by your command”
Don’t want us to be undone, “danger Will Robinson!”
And if I decree “beedee beedee bee”
Does that mean we’ll be through?
What would William Shatner do?
&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;&lt;strong&gt;Trekie Girl&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;From the second album &lt;strong&gt;Red Alert&lt;/strong&gt;. When I first listened to this song I was a single young man, so of course I dreamed about finding my own Trekie Girl. My wife now shares my love of Trek and looks extremely hot in a starfleet uniform.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;She knows every episode
She wears the boots that go-go-go
She’s got a red miniskirt
She makes me play Captain Kirk

Trekkie girl, Trekkie girl
We go to conventions
She gives me erections
Girl – my Trekkie girl
She paints her skin green
And it’s not Halloween
She rocks my brave new world

She always acts so logical
She drives a Volvo Iike it’s our space shuttle (of love)
She looks just like Britney Spears
Just add a few pounds and some pointy ears

Trekkie girl, Trekkie girl
She loves outer space
Has a black and white face
Oh, girl – my Trekkie girl
I’m her Leonard Nimoy
She’s the real McCoy
She’s got a Spock haircut with curls

And on some nights she tells me
Put my symbiote inside her
She separates my saucer
Yeah, she knows just what to say
And on nights when I loose power
Well it doesn’t even phaser
She grabs my captain’s log
Torpedoes away

She knows every episode
She wears the boots that go-go-go
She’s got a red miniskirt
She makes me play Captain Kirk

Trekkie girl, Trekkie girl
We go to conventions
She gives me erections
Girl – my Trekkie girl
She paints her skin green
And it’s not Halloween

Oh, girl – my Trekkie girl
She loves outer space
Has a black and white face
Oh, girl – my Trekkie girl
I’m her Leonard Nimoy
She’s the real McCoy
My girl – Trekkie girl
&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;&lt;strong&gt;A Song for People Who Never Watch Star Trek&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;From the third album &lt;strong&gt;Boldly go down on me&lt;/strong&gt;. This really tells you all you need to know about original series trek, plus I like singing the first line of this song to my son (also called James)&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;There was this guy
His name was Jim
You can call him Kirk
Or the Captain
He had a tan
And lots of women
Every episode
He got to blow his l***

He worked with Spock
He was a rock
No emotion
Nothing could rattle him
His blood was green
And Pon Farr could make him scream
And lose control
Though that’s illogical

Each week they’d all warp through space
Fight an alien race
And the Vulcan would pinch a neck

If you want to learn more
Go to the video store
Or just listen to this
Song for people who never watch Star Trek

Then there was Bones
Dr. McCoy
Worked with Nurse Chapel
And removed the red shirt shrapnel

Chased the miniskirts
Screaming, “Dammit, Kirk!”
Wait that wasn’t him
He was screaming, “Dammit Jim!”

Each week on the Enterprise
All the red shirts would die
But no one noticed or got upset

And the next generation
Will watch in syndication
Or just listen to this
Song for people who never watch Star Trek

And for three seasons
You know what they’d do
They’d boldly go
With the rest of their crew

Like Scotty
He was a Scot
And Chekov
He screamed a lot
And Uhura
And Sulu
But let’s face it
After Kirk, Spock and McCoy
Who gives a f*** about the rest of the crew?
&lt;/code&gt;&lt;/pre&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;The Saddest Song Ever Written About Star Trek&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;From the fourth album &lt;strong&gt;It’s Dead Jim&lt;/strong&gt;. This song really encapsulates the sadness of Star Trek’s cancellation and the passing away of some of Star Treks greats.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;It was a warm summer’s night when I sat down to write
The prettiest song ever written about Star Trek

The sky was clear
Full of stars above
I thought of Kirk and his crew
And their mission of love
And I sang the first verse
Of the prettiest song ever written about Star Trek

When the words came out
Everything was wrong
For those who’d boldly go
Had already gone
‘Cause the show was cancelled
And the dream was dead
And a red alert started wailing in my head
And I realized I had written
The saddest song ever written
About Star Trek

Now the sky was dark
Devoid of love
And Roddenberry’s ashes were floating up above
Raining down on a man
Singing the saddest song ever written about Star Trek

And now Bones is nothing but bones
He finally went and took his final voyage home
And Scotty’s body just couldn’t take much more
And I’m sure this is the saddest
Song ever written about Star Trek

I thought about space
And the final frontier
And I shed a tear as I finished
The saddest song ever written about Star Trek
&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    
    <item>
      <title>James goes on an adventure with Daddy</title>
      <link>https://www.funkysi1701.com/posts/2015/james-goes-on-an-adventure-with-daddy/</link>
      <pubDate>Thu, 22 Oct 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/james-goes-on-an-adventure-with-daddy/</guid>
      <description>&lt;p&gt;This weekend I took James on an adventure. As he is only 8 weeks old it was a fairly low key adventure but hopefully he enjoyed himself.&lt;/p&gt;
&lt;p&gt;St Michael le Belfrey have been organizing an event for Dads once a month and this month I wanted to give it a go. I have been looking forward to going for a while.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/10/12074836_10153714959677792_5717618456858661253_n.jpg?w=960&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Looking after a baby is woman’s work. Now I am not being sexist but men are just not equipped. We can’t feed them, we don’t form the same emotional bonds and I suspect I am sleeping through the worst of his crying.&lt;/p&gt;
&lt;p&gt;That said I still want to help and be involved in looking after my son. But my natural inclination is to let mummy do most things and help where needed. Going to this dads event was my first chance to do things without mummy being around.&lt;/p&gt;
&lt;p&gt;So after James had his first feed and his bag had been filled with bottles of milk, nappies, change of clothes and all the other essential accessories for looking after a baby, I left the house with him strapped to my chest.&lt;/p&gt;
&lt;p&gt;The event was very low key. Once I got there I unloaded James from my chest and was left to spend time with him with the occasional chat from other dads, offers of coffee and sausage sandwiches from the organizers.&lt;/p&gt;
&lt;p&gt;James loves staring at the ceiling and the Storehouse had lots of bright lights for him to stare at. He also got to say hello to one of the other babies he has met before at church and the mums group my wife goes to. But it was not all smooth sailing, James didn’t like me sitting down, so I had to stand up holding him close to keep him calm. If I tried to sit down and offer him his bottle he would get grumpy.&lt;/p&gt;
&lt;p&gt;I think it is great that there are events like this for parents. A lot of events are targeted at mothers which is as it should be as they have the majority of work to do, but dads need the odd event to support them as well. Hopefully me and James will be back for more adventures like this.&lt;/p&gt;
&lt;p&gt;One of the things I am looking forward to as James gets older is taking him to places and spending time 1 to 1 with him like I did with my father. I don’t know what his interests will be but whatever it is I want to be there to encourage him.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Backing up SQL databases to Azure</title>
      <link>https://www.funkysi1701.com/posts/2015/backing-up-sql-databases-to-azure/</link>
      <pubDate>Thu, 15 Oct 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/backing-up-sql-databases-to-azure/</guid>
      <description>&lt;p&gt;I recently read a blog post by &lt;a href=&#34;http://blog.sqlauthority.com/2015/10/06/sql-server-steps-to-backup-to-windows-azure-storage/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Pinal Dave&lt;/a&gt;
 about how you can backup straight to Azure Storage. The procedure he described is only available for SQL Server 2014 or later.&lt;/p&gt;
&lt;p&gt;I won’t go into detail of this method as Pinal describes it better than I can, but the basic of it requires setting up credentials and then running a backup command that includes the URL of the storage container on Azure.&lt;/p&gt;
&lt;p&gt;Unfortunately I am running SQL Server 2005 so this process will not work for me but it did start me thinking of what ways there might be for me to use.&lt;/p&gt;
&lt;p&gt;The next thing I tried was &lt;a href=&#34;https://www.microsoft.com/en-us/download/details.aspx?id=40740&amp;amp;WT.mc_id=Blog_SQL_Announce_DI&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Microsoft SQL Server Backup to Microsoft Azure Tool&lt;/a&gt;
. Unfortunately I did not get this tool to work correctly on my setup. However it sounds like a flexible tool that allows compression and encryption of your backup files. This tool redirects your backup files to your Azure Storage so even if I had got it to work correctly it would not have been an ideal solution as I want local copies of my backup files as well.&lt;/p&gt;
&lt;p&gt;After this I started to look at powershell again. Following on from my recent success with &lt;a href=&#34;http://www.funkysi1701.com/2015/10/01/copying-settings-to-an-azure-website/&#34;&gt;powershell&lt;/a&gt;
 I know how to connect to my Azure account so all I needed to script was copying a file from my server to Azure.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Get-ChildItem *.bak -File -Recurse | Set-AzureStorageBlobContent -Container $DestContainer -Force
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This command gets all the backup files in a directory (the recurse switch looks in sub directories as well) and then pipes them to the Set-AzureStorageBlobContent command. This command uploads them to the storage container defined in $DestContainer. I have added the Force switch so that it will replace any files on Azure which have the same name.&lt;/p&gt;
&lt;p&gt;I have only been using this script for the last few days but so far it has been working well. Now if I completely loose all data from the office I can restore from any other location using the data saved on Azure. A great improvement to my disaster recovery policy.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The Hunted, TNG S3 E11, The Battle Bridge</title>
      <link>https://www.funkysi1701.com/posts/2015/the-hunted-tng-s3-e11-the-battle-bridge/</link>
      <pubDate>Thu, 08 Oct 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/the-hunted-tng-s3-e11-the-battle-bridge/</guid>
      <description>&lt;p&gt;My latest podcast can be found &lt;a href=&#34;http://www.trekmate.org.uk/the-hunted-tng-s3-e11-the-battle-bridge/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;http://www.trekmate.org.uk/the-hunted-tng-s3-e11-the-battle-bridge/&lt;/a&gt;
 and feedback can be left on the trekmate forums &lt;a href=&#34;http://forum.trekmatefamily.com/2015/10/the-hunted-tng-s3-e11-review-the-battle-bridge/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;http://forum.trekmatefamily.com/2015/10/the-hunted-tng-s3-e11-review-the-battle-bridge/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;While the Enterprise-D is reviewing a seemingly idyllic planet’s application for Federation membership, an escaped prisoner leads its crew to discover an ugly secret: the government’s shameful treatment of its war veterans.&lt;/p&gt;
&lt;p&gt;Today James and Lou discuss (The Hunted) and what we think of it and much more as well as listener feedback with tonight’s guest host Simon.&lt;/p&gt;
&lt;p&gt;Credit: Main Title Theme (TV Edit) was arranged by &lt;a href=&#34;http://en.memory-alpha.org/wiki/Dennis_McCarthy&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Dennis McCarthy&lt;/a&gt;
 and composed by &lt;a href=&#34;http://en.memory-alpha.org/wiki/Jerry_Goldsmith&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Jerry Goldsmith&lt;/a&gt;
 and &lt;a href=&#34;http://en.memory-alpha.org/wiki/Alexander_Courage/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Alexander Courage&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;You can download the MP3 version of this show by &lt;a href=&#34;http://media.blubrry.com/trekmate/p/media.blubrry.com/previouslyalpha/p/media.blubrry.com/trekmatesupplemental/p/media.blubrry.com/loutrekshow/p/media.techpodcasts.com/loutrekshow/p/www.trekmate.org.uk/battlebridge/tbb-s3e11-the_hunted.mp3&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;clicking here&lt;/a&gt;
.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Copying settings to an Azure Website</title>
      <link>https://www.funkysi1701.com/posts/2015/copying-settings-to-an-azure-website/</link>
      <pubDate>Thu, 01 Oct 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/copying-settings-to-an-azure-website/</guid>
      <description>&lt;p&gt;The Software as a Service (SaaS) website that I work on has been sold to lots of clients now. Which is great news.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/09/2275.app-1.png?w=550&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;However the more Azure websites we have, the more websites we have to administer, especially if like us you take advantage of Traffic Manager which requires multiple website in different regions. Azure has some great options for making this administration easier. One job is adding all the settings onto the Azure portal, so far I have been manually adding these, but a quicker way is to use powershell.&lt;/p&gt;
&lt;h2 id=&#34;powershell&#34;&gt;PowerShell&lt;a class=&#34;anchor ms-1&#34; href=&#34;#powershell&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;PowerShell is everywhere these days. You can use it to control Servers, Active Directory and Exchange. So it is no surprise that you can use it to control Azure.&lt;/p&gt;
&lt;p&gt;Open a powershell window and run the following command.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Get-AzurePublishSettingsFile
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This command opens an IE window which you can login to Azure and download a file which contains settings that Azure can use. Save the *.publishsettings file and run the following command.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Import-AzurePublishSettingsFile &amp;#34;C:\MyPublishSettings\mysubscriptions.publishsettings&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This imports your Azure settings so that PowerShell can do clever things.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Select-AzureSubscription -Default &amp;#34;mysubscription&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This selects which of your Azure subscriptions to use. Now run the following to import settings into PowerShell.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$s = @{&amp;#34;DebugEmailAccount&amp;#34;=&amp;#34;test@example.com&amp;#34;;&amp;#34;SiteWarningBannerText&amp;#34;=&amp;#34;&amp;#34;}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And finally run the following to import this settings into the Azure website you specified.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Set-AzureWebsite azure-websitename -AppSettings $s
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sounds easy doesn’t it. Well it is. The hardest part is getting the settings in the correct format to be imported but this is only string manipulation.&lt;/p&gt;
&lt;p&gt;For my project I already have a build script which populates a settings.config file with all these settings, so I have just duplicated this to create a settings.config.importtoAzure file. Next time I have a website to create, I can create it on Azure and run the above script, pasting in the settings file that my build has already produced for me.&lt;/p&gt;
&lt;p&gt;This only scratches the surface of what you can do with Azure and PowerShell, hopefully I will do far more in the future.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Adding Internet Connection Resiliency</title>
      <link>https://www.funkysi1701.com/posts/2015/adding-internet-connection-resiliency/</link>
      <pubDate>Thu, 24 Sep 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/adding-internet-connection-resiliency/</guid>
      <description>&lt;p&gt;I have been asked to investigate adding a fail over internet connection to one of our offices.&lt;/p&gt;
&lt;p&gt;Currently this office is connected via a wireless link with our head office. Unfortunately we have recently experienced some poor performance with this connection, this has now been corrected but like all technology there is the chance of it failing in some way in the future and causing loss of business because of it.&lt;/p&gt;
&lt;h2 id=&#34;internet-connection&#34;&gt;Internet Connection&lt;a class=&#34;anchor ms-1&#34; href=&#34;#internet-connection&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is one of my first considerations. I need a reliable internet connection and there are a lot of options to consider, lets look at a few.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/08/14091d1357164106-internet-connection-drops-every-couple-minutes-cable-sxchu-internet1.jpg?resize=660%2C252&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ADSL Connection&lt;/strong&gt; This is your standard internet connection that most homes have, you get around 20Mb/s download but only 2Mb/s upload for a fairly low price per month. Speeds are dependent on area and the quality and distance from your exchange, some rural areas have speeds much lower than this. As this connection is for an office I want the best connection I can afford so would rather not go down this option if I can avoid it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;FTTC (Fibre to the Cabinet)&lt;/strong&gt; This is what ISPs typically mean when they say superfast broadband. The cables that have been laid to your exchange cabinet have been upgraded to fibre optic cables which are capable of much faster transfer speeds (eg 40Mb/s download and 10Mb/s upload). This is my ideal choice, however BT Openreach are responsible for upgrading the country to these cables and they are not very quick about it. A few years back when investigating this FTTC had almost reached our office, but when I investigated today nothing seems to have progressed. Both FTTC and ADSL require a phone line into the office to run on.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Leased Line&lt;/strong&gt; This is where your ISP connects a dedicated line to your office which provides you a much faster connection (upload and download speeds are the same) but this is very expensive. We have this for our head office as this is where our servers are located and the faster speed benefits the entire company. We do not want to do this for every branch office as it will be too expensive.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Spur from a Leased Line&lt;/strong&gt; It could be possible to branch or spur off the leased line to our second office. This would be one leased line that terminates in two locations instead of one. However due to the distances involved I do not think this will be possible in my case and may end up costing as much as a second leased line.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ISP&lt;/strong&gt; As well as the type of connection I need to decide who will provide it. There are hundreds of ISPs out there but I like to use ISPs that have a good reputation or I have used in the past and have been happy with. I do not stick with one ISP for all my connections as I like to have some connections that continue to work should that ISP be experiencing problems. ISPs that I would recommend are YDS, Eclipse and PlusNet&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Money Off&lt;/strong&gt; While I am talking about internet connections the government has been offering a scheme offering businesses money off upgrading their connections to a superfast connection (either FTTC or Leased Line) More information can be found on your councils website, If you have an office in York have a look here for more details. We got £3000 off installation so worth investigating if you qualify.&lt;/p&gt;
&lt;h2 id=&#34;vpn-connection&#34;&gt;VPN Connection&lt;a class=&#34;anchor ms-1&#34; href=&#34;#vpn-connection&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Offices require access to far more resources than just the internet. This particular office requires access to our email and database servers as a bare minimum. One way to access a remote offices network resources is through a VPN (Virtual Private Network) connection. So my next consideration is how to establish a VPN link between our offices.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Software&lt;/strong&gt; Windows Server includes RRAS (Routing and Remote Access Service) which you can use to configure a VPN connection. One important thing to note is that the server needs at least two network connections, one on the internet with a public IP and one on the internal network.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hardware&lt;/strong&gt; The more expensive routers often have settings that allow the configuration of a VPN connection.&lt;/p&gt;
&lt;p&gt;I have used both of these methods in the past. RRAS is a pain to work with but has evolved with the newer versions of windows server, so may not be as bad as I remember. Using a router to do VPN introduces its own set of problems and there is no guarantee of avoiding RRAS, you may still need it to authenticate the VPN provided by your router.&lt;/p&gt;
&lt;h2 id=&#34;multiple-connection-handling&#34;&gt;Multiple Connection Handling&lt;a class=&#34;anchor ms-1&#34; href=&#34;#multiple-connection-handling&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Internet connectivity is being provided in two ways, the primary way is via a Wireless link and the second way is via one of the options above.&lt;/p&gt;
&lt;p&gt;There are lots of options to deal with multiple connections, do I want to load balance both connections and use them all the time, do I want to fail over onto the second connection only if the first one fails, or do I want it to be a manual process or switching over to the backup network if problems occur.&lt;/p&gt;
&lt;p&gt;As you can see there are lots of different technologies to consider before I can add resiliency to this office and I haven’t even started to think about if an additional server will be required.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Unmanaged Database Deployment</title>
      <link>https://www.funkysi1701.com/posts/2015/unmanaged-database-deployment/</link>
      <pubDate>Thu, 10 Sep 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/unmanaged-database-deployment/</guid>
      <description>&lt;p&gt;For the past few months I have been deploying changes to my companies database every couple of weeks or so. Over a weekend when the database was not being used I would make a backup of the database, load up visual studio, deploy the database changes and copy a couple of front-end files.&lt;/p&gt;
&lt;p&gt;My weekends and evenings have recently become a bit more precious to me since the arrival of my son James. At suitable times to run the database upgrade I am either, asleep, about to fall asleep or be spending time with James.&lt;/p&gt;
&lt;p&gt;This entire deployment can be set to run at a time of my choosing using SQL Server Jobs, (not sure why I never thought of doing this before). I still need to check everything is working after it has run. The job can send me an email if it encounters any problems so I can still ensure the company has the minimum of problems but has more frequent changes.&lt;/p&gt;
&lt;h2 id=&#34;unmanaged-database-deployment&#34;&gt;Unmanaged Database Deployment&lt;a class=&#34;anchor ms-1&#34; href=&#34;#unmanaged-database-deployment&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;OK so what do I need to do to set this up.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/09/deploy.jpg?resize=263%2C300&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Test all your code changes are working correctly on a backup of the database and everything is committed to source control.&lt;/li&gt;
&lt;li&gt;Backup everything that is going to be changed so it can be rolled back in case of a problem. I don’t rely on the daily backup jobs for this, I do my own. Maybe I am a bit paranoid, or maybe I am just being cautious.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BACKUP &lt;span style=&#34;color:#66d9ef&#34;&gt;DATABASE&lt;/span&gt; DBName &lt;span style=&#34;color:#66d9ef&#34;&gt;TO&lt;/span&gt; DISK&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;E:\SQL Backups\Filename.bak&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I would include in the backup file name the date and time of the deployment for easy reference later on. For the front-end files these are backed up daily and only ever change during a deployment so I am going to rely on the day to day backups, plus they are in source control so in a worse case scenario I can look there.&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;From Visual Studio create a deployment script using the publish option and save as a file on your database server.&lt;/li&gt;
&lt;li&gt;Create a SQL Server Job and give it a descriptive name.&lt;/li&gt;
&lt;li&gt;In steps create a step called backup and enter the T-SQL code above. Set this to stop on failure and continue on success.&lt;/li&gt;
&lt;li&gt;Create a second step called upgrade of type operating system with the following code.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sqlcmd -S (local) -i &amp;#34;E:\SQL Backups\deploy_test.sql&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The -S parameter is the name of your SQL Server instance and the -i parameter is the path to the sql script you generated from Visual Studio above. Set this job to quit reporting success or failure.&lt;/p&gt;
&lt;ol start=&#34;7&#34;&gt;
&lt;li&gt;In schedule create a date time you want the job to run, make sure this is a one time job as you don’t want it to try and run again possibly causing problems.&lt;/li&gt;
&lt;li&gt;In notifications I have set to email on completion, you can set it to email on failure only. I would prefer to know the outcome of the job regardless.&lt;/li&gt;
&lt;li&gt;Using SQL Server jobs to copy files over the network is possible but is not trivial to setup so I am going to use windows task scheduler for this.&lt;/li&gt;
&lt;li&gt;Create a job in task scheduler to copy all the ADPs or ADEs that have been changed. If the SQL job fails you will need to copy the old versions of these back but that is simple enough to do.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This process can be expanded to check code out of source control and do even more automated deployments but for now this is good enough for my purposes.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Baby Magic and Becoming a Father</title>
      <link>https://www.funkysi1701.com/posts/2015/baby-magic-and-becoming-a-father/</link>
      <pubDate>Thu, 03 Sep 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/baby-magic-and-becoming-a-father/</guid>
      <description>&lt;p&gt;I am pleased to announce the birth of James David Martin Foster weighing 9 lb 12 on 19th August 2015.&lt;/p&gt;
&lt;p&gt;Mother and Baby (and Father) are doing well.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/07/james5.jpg?resize=300%2C225&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;I am not a baby person, I hate children and I run a mile from other people’s babies.&lt;/p&gt;
&lt;p&gt;But James performed some magic on me and now I will do anything for him. If you have had children you probably know what I am talking about and if you haven’t you are probably like me 24 hours before James arrived.&lt;/p&gt;
&lt;p&gt;During the pregnancy I had been living in denial that I would become a father, despite the wife speaking about nothing else and our home filing with baby equipment. It was only minutes before I first saw my son that I changed.&lt;/p&gt;
&lt;p&gt;Due to James’s large size, the birth wasn’t easy. After about an hour of pushing the midwife called in a team of doctors and nurses to help and I think it was at this point that it started to hit me. I am not an emotional man, if anything I tend to repress my feelings but I completely and utterly failed to do that on this occasion. By the time the baby had been placed on my wife’s chest tears of joy were streaming down my face and this continued for some time. Moments after birth James had a tight grip on my finger. His tiny hands were like miniature versions of my own hands.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/08/jameshand.jpg?resize=169%2C300&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;I have been asked what it felt like holding James in my arms for the first time, this happened on the following day. I am not sure if I can put it into words, but a few adjectives come to mind, amazing, great, fantastic, humbling. James depends on me (and his mother) for everything and his existence has put a new spin on everything I do. I want to be there for him, help him learn stuff, provide for him and love him.&lt;/p&gt;
&lt;p&gt;I have been working very hard recently, spending my free time writing this blog, learning stuff and doing other work. The reasons for this hard work are now clear, I work so I can provide for James and so I can spend my free time with him.&lt;/p&gt;
&lt;p&gt;Before James arrived I had it in my head that his mother would do the majority of the caring for him. This is not going to happen now that I have met James. I want to cuddle him, change his nappies, dress him, hold his hand, take him to school, watch TV with him, stroke his head when he is ill, tell him about my life experiences, introduce him to wine, tell him about girls, help him move home, etc.&lt;/p&gt;
&lt;p&gt;I am not saying being a parent is going to be easy. I am pretty clueless about what is in store for us, but already I am worrying if he is OK, trying to calm him down when he is upset and being woken in the early hours.&lt;/p&gt;
&lt;p&gt;Anyway only time will tell if I continue being this positive about fatherhood, but so far I am loving it. Normal blog posts will hopefully resume over the next few weeks (or when I have time).&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Due Dates</title>
      <link>https://www.funkysi1701.com/posts/2015/due-dates/</link>
      <pubDate>Mon, 17 Aug 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/due-dates/</guid>
      <description>&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/08/928f90bcd221f78a30f18541a5ca2e7f.jpg?w=404&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;


As I write this I have less than 2 days until the due date for the birth of my first child.&lt;/p&gt;
&lt;p&gt;Its a very exciting time, but it is also infuriating waiting for it to arrive. Even in the 21st century science can not predict with any accuracy when a baby is going to arrive and we just have to wait for mother nature to do its thing.&lt;/p&gt;
&lt;p&gt;I feel like I am stuck in limbo at the moment I have lots of work to do, lots of development changes to do on the databases, but I also know that at a moments notice I need to drop what I am doing and try and be a father.&lt;/p&gt;
&lt;p&gt;Due dates for babies is based on average pregnancies lasting 40 weeks, but there is no such thing as an average pregnancy. But to keep this blog post on topic I somehow need to compare due dates for pregnancy with software development.&lt;/p&gt;
&lt;p&gt;In software development we often get asked for estimates on when a particular development task will be finished. Estimates in software development are very difficult to make accurate as there are so many variables that you do not know the answer to until you start getting stuck into doing the work. One technique is to try and split the work down into small steps and estimate how long each small step will take and then add them all together. But even this technique still has a large margin of error.&lt;/p&gt;
&lt;p&gt;What would it be like if when management asked we gave an estimate similar to what pregnant women receive? Instead of a deadline when all work has to be finished by, you have a date when there is a 50% chance of the work being finished.&lt;/p&gt;
&lt;p&gt;I think management would have a difficult time dealing with this amount of uncertainty, I certainly am waiting for this baby to arrive.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How complex are my stored procedures?</title>
      <link>https://www.funkysi1701.com/posts/2015/how-complex-are-my-stored-procedures/</link>
      <pubDate>Thu, 13 Aug 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/how-complex-are-my-stored-procedures/</guid>
      <description>&lt;p&gt;Recently me and my development team have been looking at performance and how to improve it.&lt;/p&gt;
&lt;p&gt;One area of improvement we have identified is with our stored procedures, which we plan to rewrite. But how do we identify which are the easiest to rewrite and which are the hardest?&lt;/p&gt;
&lt;p&gt;My first thought was maybe to count the number of times each keyword is used and rank them somehow. eg each JOIN gets 5, OUTER APPLY gets 20, each term in WHERE gets 1, and then combine that with the length of the query and how many parameters.&lt;/p&gt;
&lt;p&gt;However doing a bit of googling I came across the following &lt;a href=&#34;https://aalamrangi.wordpress.com/2012/12/24/calculate-tsql-stored-procedure-complexity&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;blog&lt;/a&gt;
 and &lt;a href=&#34;https://gallery.technet.microsoft.com/Calculate-TSQL-Stored-831b683a&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;sql script&lt;/a&gt;
. This script analyses the stored procedures in terms of number of lines of code, number of parameters and number of dependencies.&lt;/p&gt;
&lt;p&gt;The complexity is divided into SIMPLE, MEDIUM and COMPLEX.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;WHEN NumberOfLines * NumberOfDependencies * NumberOfParameters &amp;lt; 5000 THEN ‘Simple’
WHEN NumberOfLines * NumberOfDependencies * NumberOfParameters &amp;lt; 10000 THEN ‘Medium’
ELSE ‘Complex’
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/08/reportscreenshot1.png?w=674&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;This gives a fairly good estimate of which stored procedures are the most complex and which would probably take the longest time to rewrite.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>ICYMI What does it mean?</title>
      <link>https://www.funkysi1701.com/posts/2015/icymi-what-does-it-mean/</link>
      <pubDate>Mon, 10 Aug 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/icymi-what-does-it-mean/</guid>
      <description>&lt;p&gt;For a while now I have seen ICYMI splattered around the internet. I had no idea what it meant so just ignored it but I have finally had enough and I googled for a definition and I now know what it means.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ICYMI – In Case You Missed It
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/08/in-case-you-missed-it-small.jpg?w=400&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;


ICYMI is often used on social media sites to indicate articles that you might have missed.&lt;/p&gt;
&lt;p&gt;Software Development is littered with acronyms and technical terms that I don’t always know the meaning of.&lt;/p&gt;
&lt;p&gt;When reading it is easy to ignore them and try and understand the rest of the article. However there are loads of resources out there that can explain technical terms in a wide variety of different ways.&lt;/p&gt;
&lt;p&gt;I have tried to explain a few different terms and concepts on this &lt;a href=&#34;http://www.funkysi1701.com/&#34;&gt;blog&lt;/a&gt;
. In the process of writing them I often do a bit of research and read a variety of different definitions, some confuse the heck out of me, while others make me go ahh that makes sense now.&lt;/p&gt;
&lt;p&gt;When reading to learn, don’t be afraid to dig deeper and understand it all, don’t read the same terms again and again not understanding them like I did with ICYMI.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Common git commands</title>
      <link>https://www.funkysi1701.com/posts/2015/common-git-commands/</link>
      <pubDate>Thu, 06 Aug 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/common-git-commands/</guid>
      <description>&lt;p&gt;I use git as my source control system. Here are some of the most common git commands in no particular order.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Check Out a git Repository	&lt;strong&gt;git clone /path/to/repository&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Add files to commit	&lt;strong&gt;git add &lt;filename&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Commit files to &lt;strong&gt;git	git commit -m “Commit message”&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Push changes to server	&lt;strong&gt;git push origin master&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Show status	&lt;strong&gt;git status&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Create new branch	&lt;strong&gt;git checkout -b &lt;branchname&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Switch to a branch	&lt;strong&gt;git checkout &lt;branchname&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Get remote changes	&lt;strong&gt;git pull&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Merge a different branch into the current one	&lt;strong&gt;git merge &lt;branchname&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;View merge conflicts	&lt;strong&gt;git diff&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Temporarily stash uncommitted changes	&lt;strong&gt;git stash&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Undo a commit	&lt;strong&gt;git reset –hard &lt;commit&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Show details about a commit	&lt;strong&gt;git show &lt;commit&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Show version history of current branch	&lt;strong&gt;git log&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Gets all remote branches	&lt;strong&gt;git fetch origin&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Most of the time I use the &lt;a href=&#34;https://sourceforge.net/projects/gitextensions/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;git extensions&lt;/a&gt;
 tools to do my git work, but there are times when only the command line will do.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Volunteering for a Technical Team</title>
      <link>https://www.funkysi1701.com/posts/2015/volunteering-for-a-technical-team/</link>
      <pubDate>Mon, 03 Aug 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/volunteering-for-a-technical-team/</guid>
      <description>&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/07/20150802_113719.jpg?resize=1024%2C576&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;


For the past few years I have volunteered on the technical team at my local church &lt;a href=&#34;http://www.belfrey.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;St Michael le Belfrey&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;For the church to function well it requires volunteers in all sorts of roles, people to welcome visitors, people to pray, people to play music, people to look after children and many other roles.&lt;/p&gt;
&lt;p&gt;My natural ability lies more with technology than with people so when I decided that I wanted to get more involved it was the technical team that I volunteered for. The technical team is split into two main parts, the PA team which concerns itself with ensuring everyone can hear everything OK and the Projection team which concerns itself with everything that gets projected. I have no knowledge about what sounds good and what doesn’t so it was the projection team that I joined and have been involved with.&lt;/p&gt;
&lt;p&gt;The church has three projectors, one big one and two slightly smaller ones for the side aisles, and a PC located at the back of church which is what the projectionist uses to control what gets projected. There are many things that get projected, lyrics to songs, PowerPoint presentations and the occasional video and to make things easy one piece of software is used to control all of this &lt;a href=&#34;https://www.easyworship.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;EasyWorship&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;EasyWorship contains a huge database of song lyrics, so you can quickly select what ever is being sung and project the lyrics on screen. It also allows the addition of PowerPoint files, image or video files and even a web page and they can be projected. EasyWorship allows different things to be queued up in order and that order can be saved as a schedule.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/07/CFMwY_UUgAAc2k2.jpg?resize=300%2C225&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;The projectionist’s job is to follow along with the order of service and project things onto screen at the right time. Simple! No not really. The worship leader will skip songs, play songs in a different order, add new songs, videos will fail to play, easy worship will freeze up or crash or the liturgy that the vicar wants isn’t in the EasyWorship database.&lt;/p&gt;
&lt;p&gt;You need to be on your toes as a projectionist but over the years I have become a good projectionist and have really enjoyed my time doing this. You can see me having a laugh with the Head of Music and Worship on the right.&lt;/p&gt;
&lt;p&gt;More recently I have taken on a bigger role for the projection team. I have been coordinating the rota for the volunteers on the projection team. This has given me new challenges, but it has been great to work closely with the Technical Manager and more recently the Head of Music and Worship and get to know the whole team better. The biggest problem that the team has is insufficient volunteers, it had this problem when I joined the team and it has this problem today. If you are reading this consider if this is something you could get involved with? The team has some really hard working people who do an excellent job each week, just wish we had a few more to ease everyone’s work load.&lt;/p&gt;
&lt;p&gt;I am taking a break from the projection team as my wife is due to give birth to my first child in the next few days. I have had a great time, I have worked with some great people and for the most part I will miss volunteering. There are of course things that have not been great, volunteers that have left the team, changes at the church, and many early mornings when I would rather still be in bed but I am glad that I have been involved.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Upper Pylon 2 – 1 x 09: The Passenger</title>
      <link>https://www.funkysi1701.com/posts/2015/upper-pylon-2-1-x-09-the-passenger/</link>
      <pubDate>Thu, 30 Jul 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/upper-pylon-2-1-x-09-the-passenger/</guid>
      <description>&lt;p&gt;I recorded another podcast the other week it can be found &lt;a href=&#34;http://www.trekmate.org.uk/upper-pylon-2-1-x-09-the-passenger/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;http://www.trekmate.org.uk/upper-pylon-2-1-x-09-the-passenger/&lt;/a&gt;
 and feedback about it can be left on the trekmate forums &lt;a href=&#34;http://forum.trekmatefamily.com/2015/07/thoughts-on-up2s-the-passenger-or-vantika-x-33/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;http://forum.trekmatefamily.com/2015/07/thoughts-on-up2s-the-passenger-or-vantika-x-33/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/07/Bashir-Choked.jpg&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;This week on Upper Pylon 2, we are joined by our first UK guest, Simon (aka &lt;a href=&#34;https://twitter.com/funkysi1701&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;funkysi1701&lt;/a&gt;
) as we take a look at the Bashir-centric “mystery” episode, “The Passenger.”&lt;/p&gt;
&lt;p&gt;When a former prisioner, Rao Vantika (a name you’ll hear COUNTLESS times throughout the episode) is killed, his pursuer believes that the late murderer is not really dead, and continues her investigation at DS9 while an important shipment is scheduled to arrive. Will Vantika reappear, and if so, who will he appear as? Well, if you’ve seen the opening of the episode, it really isn’t all that hard to deduce. But join the UP2 crew as we dissect this little caper.&lt;/p&gt;
&lt;p&gt;As always, be sure to leave us your feedback about the episode!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>10 facts about Windows 10</title>
      <link>https://www.funkysi1701.com/posts/2015/10-facts-about-windows-10/</link>
      <pubDate>Wed, 29 Jul 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/10-facts-about-windows-10/</guid>
      <description>&lt;p&gt;Today Microsoft release Windows 10 so what else can I talk about? I like many technology people are very excited today. This version of window is the first that Microsoft have release for free.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/07/Windows-10_Product-Family.jpg?resize=1024%2C576&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;10 You heard that correct Windows 10 is &lt;strong&gt;free&lt;/strong&gt;. If you upgrade your device to windows 10 before 29th July 2016 it is free and will continue working on that device forever.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Upgrade to Windows 10 within the first year and it is yours free, forever. 
No subscriptions, no additional costs.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;9 As with any upgrade always backup your computer and any important files before you do anything. Microsoft and any IT expert will tell you this. For a great guide to upgrading see Scott Hansleman’s &lt;a href=&#34;http://www.hanselman.com/blog/GettingStartedWithWindows10.aspx&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;blog&lt;/a&gt;
. I have upgraded my laptop without any problems but there will always be exceptions so take extra care.&lt;/p&gt;
&lt;p&gt;8 Windows 10 is the &lt;strong&gt;LAST&lt;/strong&gt; version of windows. I don’t know what this means but I can take a guess.&lt;/p&gt;
&lt;p&gt;Typically Microsoft has created a new version of windows every few years. With every new version there has come headaches and problems as people try to make software and hardware work with the next version. Microsoft is instead going to try and release updates and patches to the operating system to keep things up to date.&lt;/p&gt;
&lt;p&gt;However I can see that only working for so long. Eventually Microsoft will make something new but it is unlikely to be called Windows. Maybe it will be something hosted in the Cloud, as they have a really strong presence with Azure which is only going to grow as time goes on.&lt;/p&gt;
&lt;p&gt;7 Windows 10 is available in 7 different flavours.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows 10 Home – equivalent to the Home editions we have had since XP. This version is designed for your typical consumer.&lt;/li&gt;
&lt;li&gt;Windows 10 Mobile – this version is designed to run on phones and tablets. Unlike previous Phone versions, everything you can find on the desktop OS should be available on the phone (but optimised for the smaller screens)&lt;/li&gt;
&lt;li&gt;Windows 10 Pro – this is the version I will be testing with my work PCs. It is designed for small businesses and allows domain joining.&lt;/li&gt;
&lt;li&gt;Windows 10 Enterprise – this version is only available via Volume Licensing so not easily available to the typical user but is aimed at larger businesses.&lt;/li&gt;
&lt;li&gt;Windows 10 Education – another version that is only available via Volume Licensing but targeted at schools and universities.&lt;/li&gt;
&lt;li&gt;Windows 10 Mobile Enterprise – this version is for mobile and tablets in the business world. Standard policies can be applied to all your employees mobile devices.&lt;/li&gt;
&lt;li&gt;Windows 10 IoT Core – this is an interesting version designed to run on hardware and Internet of Things (IoT) devices. I would quite like to play with this version on my Raspberry Pi&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;6 Windows 10 introduces a brand new web browser called Edge. For years web developers have hated Internet Explorer, for its lack of support for the latest web standards. Internet Explorer 6 caused many users to migrate away to browsers like firefox and later Chrome and despite Microsoft’s best effort with the later versions people have not moved back. Edge is an attempt at a fresh start.&lt;/p&gt;
&lt;p&gt;5 In 2011 Apple introduced the personal assistant Siri, well now Microsoft are bringing us &lt;strong&gt;Cortana&lt;/strong&gt; the windows equivalent. With Cortana you can ask your computer to do anything, set reminders, search the internet, answer questions, anything. With advanced voice recognition you can speak as well as type your questions. Cortana is now part of Windows 10.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/05/win10.jpg?resize=300%2C181&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;4 Windows 10 brings back the start menu. The start menu you have always used to access programs works the same but features of the windows 8 start screen have been incorporated into it.&lt;/p&gt;
&lt;p&gt;3 Windows 10 is more &lt;strong&gt;secure&lt;/strong&gt;. Security patches are frequently released for all operating systems, but windows 10 has been designed with security in mind. For businesses there are options to completely lock down your users environment only allowing ‘white listed’ programs to run.&lt;/p&gt;
&lt;p&gt;2 &lt;strong&gt;Continuum&lt;/strong&gt; is one of the most revolutionary things about Windows 10. Continuum is the notion that one computing experience is continued regardless of the device used or the location. Continuum will automatically adjust your screen to make the best use of its size. Tablets and phones have the tiled view and start screen, if you connect a keyboard and monitor it will behave like a full blown PC. This is mind bending, that a phone running windows 10 can do as much as your laptop.&lt;/p&gt;
&lt;p&gt;1 Today I am off to a Windows 10 launch event where I expect many of these features will be discussed and most likely many more.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Writing better Git commit messages</title>
      <link>https://www.funkysi1701.com/posts/2015/writing-better-git-commit-messages/</link>
      <pubDate>Sat, 25 Jul 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/writing-better-git-commit-messages/</guid>
      <description>&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/07/git_commit.png?w=439&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;I always use source control for my coding changes, however some of my commit messages leave something to be desired.&lt;/p&gt;
&lt;p&gt;I always try to write a commit message but I often think that the change themselves should be enough to indicate what I did. I also don’t need to include who made the change or the time and date and that gets included automatically.&lt;/p&gt;
&lt;p&gt;Here are some tips I have found that may help me in the future.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Ask yourself why you are making this change. The Who, When and What are already being covered so it is only the why that needs including in the commit message.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If your commit breaks something or causes side affects or a new dependency this should be included in the commit message. If your commit breaks functionality, consider if you really need to commit it yet, maybe only commit once fixed?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If your commit includes a long list of changes consider if the commit needs splitting into several commits. It is easy to only commit one or two files write a specific commit message and then commit the rest of the changes separately.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Consider including a subject for larger commits. The following comes from the git manual.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Though not required, it’s a good idea to begin the commit message with a single short 
(less than 50 character) line summarizing the change, followed by a blank line and then 
a more thorough description. The text up to the first blank line in a commit message 
is treated as the commit title, and that title is used throughout Git.
&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;If you use a subject follow the following conventions:&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Limit of 50 characters&lt;/li&gt;
&lt;li&gt;Start with a capital letter&lt;/li&gt;
&lt;li&gt;Do not end with a full stop&lt;/li&gt;
&lt;li&gt;Use the imperative mood i.e. write as if issuing a command&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>My Love/Hate Relationship with Microsoft Access</title>
      <link>https://www.funkysi1701.com/posts/2015/microsoft-access/</link>
      <pubDate>Fri, 24 Jul 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/microsoft-access/</guid>
      <description>&lt;p&gt;For historical reasons I use Microsoft Access as the front-end for all my line of business databases.&lt;/p&gt;
&lt;p&gt;Access allows you to create an ADP file that can connect to your SQL Server database. However Office has dropped support for this, so the last version of office that I can use is Office 2010.&lt;/p&gt;
&lt;p&gt;Before I start hating on Access there are some good things about the platform. Users with very little knowledge can create a database fairly quickly. Development time is also fairly low as it doesn’t take long to create a new form, and add a few buttons which open different reports.&lt;/p&gt;
&lt;p&gt;For the last 5 years or so I have built a range of different forms in Access, (and even if I do say so myself), I have got quite good at creating forms that users can be more productive with. Access has the concept of a subform which is a form embedded in a form, each form can be connected to a different query and can be connected to each other so it is relatively easy to create something quite powerful.&lt;/p&gt;
&lt;p&gt;Access report are an easy way to create professional looking reports that can be sent out to clients, or used by management and they also have the concept of subreports, (same as subforms but embedded in a report), this means you don’t have to write one query to pull back every piece of data that shows up in a report.&lt;/p&gt;
&lt;p&gt;VBA or Visual Basic for Access allows you easily do things programmatically, like run something if something is selected or a button is clicked. This is not the easiest programming language to work with, however once you have used it for a while you get used to its quirks. My favourite function is IIF, the syntax is fairly simple IIF(expr, truepart, falsepart), if expr evaluates to true the truepart is executed (executed can be as simple as displaying certain text in certain conditions), if it is false the falsepart is executed, and you can also chain them together which I have done to produce something very complex looking.&lt;/p&gt;
&lt;p&gt;Now for the negative side of things. Access creates a binary ADP file, binary files can not be version controlled in git or subversion. This is a big problem as I want to keep track of every change I make. It also means that branching or working with others on big projects is also difficult.&lt;/p&gt;
&lt;p&gt;One work around I have found to this problem is &lt;a href=&#34;https://accesssvn.codeplex.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;AccessSVN&lt;/a&gt;
. This program takes an ADP and creates text files of every form and report. It also can create an ADP from these files as well, however I have had varying success with this feature so I prefer to just create the text files if possible. What I do after I have made a change to the ADP is to run AccessSVN, create text files and commit these to source control. You can then see what controls have been changed or added. It also helps with bugs as I have found that sometimes while testing access will apply a filter to a form, which will break things if deployed, which is very annoying.&lt;/p&gt;
&lt;p&gt;Access can only do what access was designed to do. There are some advanced features that we would like to add to our databases. Things like sending emails or uploading reports to a website. This is not Access fault as it was never designed to be able to do such things but I am often asked about what is possible.&lt;/p&gt;
&lt;p&gt;End of support for Office 2010 is approaching and I have plans to stop using Access but until then I need to keep supporting our existing front ends.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>7 Warning Signs that you’re a Bad Programmer</title>
      <link>https://www.funkysi1701.com/posts/2015/7-warning-signs-that-youre-a-bad-programmer/</link>
      <pubDate>Thu, 23 Jul 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/7-warning-signs-that-youre-a-bad-programmer/</guid>
      <description>&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/07/you_are_coding_it_wrong.png?w=359&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Am I a good programmer or a bad programmer?&lt;/p&gt;
&lt;p&gt;Here are 7 signs that might mean you are more towards the bad end of the scale.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You fail to plan before you start coding&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I am very guilty of this, I love to jump into the code before thinking. But I am slowly starting to see the advantages of sketching a few things out before I write any code.&lt;/p&gt;
&lt;p&gt;Most of my coding recently has been SQL based and I am starting to like sketching out table designs.&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;You fail to use version control&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I have blogged about using version control in the past but it really is a very useful technology. It not only keeps track of every file in your solution and stores its entire history, but you can separate different versions into branches and see who changed what and when (and if the commit message is detailed enough why).&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;You use bad variable names&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Whats wrong with variable1 and variable2 as variable names? Variables should be named after what they do or what they contain, but it is very easy to start copy and pasting them and before you know it you have a variable1 and variable2 situation. Remember that Visual Studio has some powerful refactoring tools so relatively easy to get them back in order.&lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;You repeat your code&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I’ve been reading Pragmatic Programmer and one of their first tips was DRY – Don’t Repeat Yourself. They go to extremes with nothing being repeated anywhere in your code, but I don’t think you need to go too far, you can be reasonable. If you have the same code repeated four times, then creating a function for this code will dramatically improve your code.&lt;/p&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;You struggle to understand your own code&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Why did I do it this way? I feel like I am always trying to remember the reasons I chose to code the way I did previously. Part of the reason for this is that I am constantly learning at the moment, but there is more that I can do to help myself understand in the future.&lt;/p&gt;
&lt;ol start=&#34;6&#34;&gt;
&lt;li&gt;You are selfish and don’t share&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I am not selfish, if I learn something really cool I have to tell someone. I like writing stuff on here to share with the world. I am thinking of news ways to train my staff.&lt;/p&gt;
&lt;ol start=&#34;7&#34;&gt;
&lt;li&gt;You work on multiple projects&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Yes Guilty as charged with this one. I have multiple projects that I am working on at work, I also have a fair few personal projects that I would like to work on. Not sure I completely agree that multiple projects equals bad programmer.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Things to know before working on your database</title>
      <link>https://www.funkysi1701.com/posts/2015/things-to-know-before-working-on-your-databasethings-to-know-before-working-on-your-database/</link>
      <pubDate>Mon, 20 Jul 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/things-to-know-before-working-on-your-databasethings-to-know-before-working-on-your-database/</guid>
      <description>&lt;p&gt;I recently saw this blog &lt;a href=&#34;http://www.brentozar.com/archive/2015/07/questions-to-ask-before-you-touch-a-database-server/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;post&lt;/a&gt;
 by &lt;a href=&#34;http://www.brentozar.com/team/brent-ozar/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Brent Ozar&lt;/a&gt;
 that I thought I might discuss.&lt;/p&gt;
&lt;p&gt;Brent listed 13 questions to ask about a database before you start working with it. I am going to go through these 13 questions and expand on them based on my experiences.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Is this database in production now?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I think it should go without saying that the first thing you should find out is if your database is in production. If its not in production you can do what you like and no one will notice.
I know what databases are in production and which aren’t where I work so I can answer this one.&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;&lt;strong&gt;If this goes down, what apps go down with it?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;What apps are running on what databases is a good second question. I have at least one database which has multiple front end apps. At first glance you would think that that these two apps are not connected but they are, I need to be careful with both of these apps to make sure they don’t break each other.
I know what apps run off what databases.&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;&lt;strong&gt;When those apps go down, is there potential for loss of life or money?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is a difficult question so I will split it into two. Loss of life, my databases don’t control life support machines or nuclear weapons so my first instinct would be to say no. However it is not that straightforward, what if your app allowed contractors to know the location of dangers inside a property they were working in. Once your app goes down, they could have an accident due to lack of information.
Loss of money, this one is more straightforward. Time is money in the business world so any time that your app is down and your employees are not able to work is a loss of money. If your database is linked to an eCommerce site, the loss of money could be extremely high.
I know what affect downtime will have on my users and business.&lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;&lt;strong&gt;How sensitive are these apps to temporary slowdowns?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Similar to the previous question, a slowdown can be as serious as downtime for some applications.
Luckily most of my apps are internal only so are not seriously affected by slowness.&lt;/p&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;&lt;strong&gt;When was the last successful backup?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I manage the backup schedule for all my databases so I know exactly when each one was last backed up. When ever I do anything to a production database I will run a backup so I can roll back in case of problems. As part of developing changes I run my changes on a backup of the data. I can script all my changes and repeatedly run them against a backup until I am sure no problems will occur.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/07/uf010206.jpg&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;ol start=&#34;6&#34;&gt;
&lt;li&gt;&lt;strong&gt;When was the last successful restore test?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;More important than a backup is testing restoring your databases. If you can’t restore data then your backup is useless. I try to test restoring my backups at least weekly so I know that I can rely on my backups.&lt;/p&gt;
&lt;ol start=&#34;7&#34;&gt;
&lt;li&gt;&lt;strong&gt;Is everyone okay losing data back to the last successful backup?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If disaster strikes you could loose all data between now and the time of your last backup. But all is not lost transactional backups can be scheduled throughout the day, in my case the most data we could loose is 15 minutes. This could be configured to be more or less frequent depending on your data. But remember the previous question and make sure you test a restore of your transactional backups, if you can’t restore from them you will be forced to restore from the last successful backup.&lt;/p&gt;
&lt;ol start=&#34;8&#34;&gt;
&lt;li&gt;&lt;strong&gt;When was the last successful clean corruption test?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Corruption can be a killer if it is not found quickly. If you need to restore to the last backup before corruption occurred this could result in a significant amount of data loss. To check for corruption you need to run DBCC regularly.&lt;/p&gt;
&lt;ol start=&#34;9&#34;&gt;
&lt;li&gt;&lt;strong&gt;Do we have a development or staging environment where I can test my changes first?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If the answer to this is no, then your next job is to setup a development or staging area. Having a development environment makes development a lot easier and I don’t think I could manage to do all the changes I have done recently without one.&lt;/p&gt;
&lt;ol start=&#34;10&#34;&gt;
&lt;li&gt;&lt;strong&gt;Is there any documentation for why the server was configured this way?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I really wish we had more documentation about configurations as it would make finding out why thing were setup the way they are. So unfortunately the answer to this question is No.&lt;/p&gt;
&lt;ol start=&#34;11&#34;&gt;
&lt;li&gt;&lt;strong&gt;What changes am I not allowed to make?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Depending on what your app does, where it is hosted, how quick the changes are needed and many other factors will all restrict what changes you can make. Historical decisions on the database can also affect what changes can be made, if the database has been structured in a certain way, it may be very difficult to restructure it in a more efficient way.&lt;/p&gt;
&lt;ol start=&#34;12&#34;&gt;
&lt;li&gt;&lt;strong&gt;Who can test that my changes fixed the problem?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is an interesting question, from experience the best people to speak to about problems with the database are the users. If they can show you how to reproduce a problem, you should be able to fix this problem, after that you can probably get them to verify that it has been fixed.&lt;/p&gt;
&lt;ol start=&#34;13&#34;&gt;
&lt;li&gt;&lt;strong&gt;Who can test that the apps still work as designed, and that my changes didn’t have unintended side effects?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is an extension of the previous question. The main users of your app should be your first port of call to find out if the app works as expected. However exploring side affects and undesired features is something that I would test as part of the development process. It has taken a while but I have constructed a detailed check list that can be used for testing so I know that most bugs can be found before release.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>New Horizons Pluto Spacecraft</title>
      <link>https://www.funkysi1701.com/posts/2015/new-horizons-pluto-spacecraft/</link>
      <pubDate>Tue, 14 Jul 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/new-horizons-pluto-spacecraft/</guid>
      <description>&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/07/84270464_p_lorri_fullframe_color.png?w=976&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;To explore Strange New Worlds, well today the NASA spacecraft New Horizons has been doing just that. This is the most detailed photograph yet of the furthest planet we have ever explored, Pluto.&lt;/p&gt;
&lt;p&gt;New Horizons was launched on 19th January 2006. It has been travelling for 3463 days (9.5 years).&lt;/p&gt;
&lt;p&gt;In 2006 we were still using Windows XP and Office 2003. In 2006 I wasn’t even working in IT. As a software developer it is hard to imagine writing software that won’t be used for another 9.5 years.&lt;/p&gt;
&lt;p&gt;The spacecraft carries two computer systems: the Command and Data Handling system and the Guidance and Control processor. Each of the two systems is duplicated for redundancy, for a total of four computers. The processor used for its flight computers is the Mongoose-V, a 12 MHz radiation-hardened version of the MIPS R3000 CPU. Multiple clocks and timing routines are implemented in hardware and software to help prevent faults and downtime. To conserve heat and mass, spacecraft and instrument electronics are housed together in IEMs (integrated electronics modules). There are two redundant IEMs. Including other functions such as instrument and radio electronics, each IEM contains 9 boards. The processor distributes operating commands to each subsystem, collects and processes instrument data, and sequences information sent back to Earth. It also runs the advanced “autonomy” algorithms that allow the spacecraft to check the status of each system and, if necessary, correct any problems, switch to backup systems or contact operators on Earth for help.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/07/Mission-Spacecraft-structure.jpg?resize=300%2C218&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;For data storage, New Horizons carries two low-power solid-state recorders (one backup) that can hold up to 8 gigabytes each. The main processor collects, compresses, reformats, sorts and stores science and housekeeping (telemetry) data on the recorder – similar to a flash memory card for a digital camera – for transmission to Earth through the telecommunications subsystem.&lt;/p&gt;
&lt;p&gt;Communication with the spacecraft is via X band. The craft had a communication rate of 38 kbit/s at Jupiter; at Pluto’s distance, a rate of approximately 1000 bit/s. To put this speed into context, the size of the image at the top of this page is 649kb and would take over 86 minutes to travel from Pluto to Earth, (I am sure the actual image was much larger and took even longer to reach us.) Besides the low bandwidth, Pluto’s distance also causes a latency of about 4.5 hours (one-way). The 70 m (230 ft) NASA Deep Space Network (DSN) dishes are used to relay commands once it is beyond Jupiter. It will take 16 months to send the full set of Pluto encounter science data back to Earth.&lt;/p&gt;
&lt;p&gt;Most software encounters a problem from time to time, but the software on board this spacecraft has to keep running for almost a decade. Due to the distances involved its not possible to upload any code tweaks. Any commands that are sent to the spacecraft will take 4.5 hours to even get there so there needs to be a huge amount of autonomy and redundancy to cope with such a massive journey.&lt;/p&gt;
&lt;p&gt;I can’t even imagine how you would begin to write the software to run such a craft. I don’t think I have written any code that is as old as is running on the New Horizons craft, and if I had I would guess the quality would be quite poor certainly not good enough to work non stop for a decade.&lt;/p&gt;
&lt;p&gt;There are some incredibly clever people out there who have been involved in this project. Congratulations team you have every right on being proud as the data starts to trickle back to earth.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How to upgrade to Windows 10</title>
      <link>https://www.funkysi1701.com/posts/2015/how-to-upgrade-to-windows-10/</link>
      <pubDate>Sat, 11 Jul 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/how-to-upgrade-to-windows-10/</guid>
      <description>&lt;p&gt;Microsoft are releasing a new operating system on July 29th called Windows 10.&lt;/p&gt;
&lt;p&gt;If you have questions about Windows 10 watch this video by &lt;a href=&#34;https://www.hanselman.com/blog/Windows10IsComingheresWhatToTellNontechnicalParent.aspx&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Scott Hansleman&lt;/a&gt;
. He explains how to upgrade from Windows 7 and 8 to Windows 10 and what to expect after you upgrade.&lt;/p&gt;
&lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/nuCpdlMFvUY&#34; title=&#34;YouTube video player&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;My advice to everyone is that you backup your devices before you upgrade, this is good practice before you install any software or updates.&lt;/p&gt;
&lt;p&gt;Microsoft are offering Windows 10 for free for a whole year, so don’t panic. Take your time, backup all your important files and when you are ready install Windows 10. Nothing is going to stop working after July 29th if you don’t have the latest operating system on your machine.&lt;/p&gt;
&lt;p&gt;I hope this helps answer some of your questions about what to do at the end of the month. If not feel free to write a comment or contact me with your questions.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Why do we call them bugs?</title>
      <link>https://www.funkysi1701.com/posts/2015/why-do-we-call-them-bugs/</link>
      <pubDate>Tue, 07 Jul 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/why-do-we-call-them-bugs/</guid>
      <description>&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/07/11666093_10153470803062792_4914668365512645054_n.jpg?w=960&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;On my way home from the office I spotted this little chap. In my expert opinion it is a &amp;ldquo;bug&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;This particular &amp;ldquo;bug&amp;rdquo; is harmlessly sitting outside, but have you ever wondered why computer problems are often named after this little chap (and his friends)?&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/07/H96566k.jpg?resize=300%2C236&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;The first recorded bug report was in 1947 when Grace Hopper found a moth between the relays of a Harvard Mark II, this moth was then tapped in the log book as evidence.&lt;/p&gt;
&lt;p&gt;Since then the process of removing bugs has been called &amp;ldquo;debugging&amp;rdquo;. However bugs had existed in electrical devices before this.&lt;/p&gt;
&lt;p&gt;In the early days of telegraphy, there were two types of keyers. The older “manual” keyers which required the operator to code the dots and dashes. And the newer, semi-automatic keyers that would send a string of dots automatically. These semi-automatic keyers were called &amp;ldquo;bugs&amp;rdquo;. One of the most common brands of these keyers, the Vibroplex, used a graphic of a beetle.&lt;/p&gt;
&lt;p&gt;Luckily the bugs I deal with don’t have legs or wings and are just errors in computer code. When I debug code I need to look at the inner workings of the code, looking for problems, most often it is a typo or piece of logic that doesn’t match up. But the relationship between computer bugs and living bugs does continue, the bug tracking software bugzilla uses a cartoon bug as its logo.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Agile Software Development</title>
      <link>https://www.funkysi1701.com/posts/2015/agile-software-development/</link>
      <pubDate>Sat, 04 Jul 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/agile-software-development/</guid>
      <description>&lt;p&gt;I have heard the term &lt;strong&gt;Agile Software Development&lt;/strong&gt; quite a bit, but lets see if we can define it and see if I do any of the processes involved with it.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/07/Agile-Marketing-Series-What-is-Agile-Marketing.png?w=579&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;The dictionary defines ‘Agile’ as mentally quick, or nimble, or quick in movement.&lt;/p&gt;
&lt;p&gt;In 2001 The Manifesto for Agile Software Development first introduced the term agile. The manifesto is based on 12 principles.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Customer satisfaction by early and continuous delivery of useful software&lt;/li&gt;
&lt;li&gt;Welcome changing requirements, even late in development&lt;/li&gt;
&lt;li&gt;Working software is delivered frequently (weeks rather than months)&lt;/li&gt;
&lt;li&gt;Close, daily cooperation between business people and developers&lt;/li&gt;
&lt;li&gt;Projects are built around motivated individuals, who should be trusted&lt;/li&gt;
&lt;li&gt;Face-to-face conversation is the best form of communication (co-location)&lt;/li&gt;
&lt;li&gt;Working software is the principal measure of progress&lt;/li&gt;
&lt;li&gt;Sustainable development, able to maintain a constant pace&lt;/li&gt;
&lt;li&gt;Continuous attention to technical excellence and good design&lt;/li&gt;
&lt;li&gt;Simplicity—the art of maximizing the amount of work not done—is essential&lt;/li&gt;
&lt;li&gt;Self-organizing teams&lt;/li&gt;
&lt;li&gt;Regular adaptation to changing circumstance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lets go through this list one by one and examine what I understand of it and how I might have used it in the past.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Customer satisfaction by early and continuous delivery of useful software&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;My boss bombards me with hundreds of changes that she wants straight away, I keep her reasonably happy by giving her regular small improvements. Yesterday I released some changes, and two weeks before that I released another chunk, on Monday I will find out that I haven’t included feature Y, so in another couple of weeks feature Y will be delivered. This is my understanding of delivering continuous improvements to my software.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Welcome changing requirements, even late in development&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Lets ignore the word welcome, as changing requirements are really annoying. I designed a system to track how far through a 5 step process you were, after I deployed that change it was discovered that the process was actually 18 steps. Annoying as this was, my design allowed the easy addition of these extra stages.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Working software is delivered frequently&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Yes, I do this, see my comments above. If you make a single change and then deploy it, bug fixes are easy as most of it is still in your head. If you spend 6 months making 1000 changes, it will take you extra time to remind yourself what you did and why.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Close, daily cooperation between business people and developers&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I don’t do this daily but I regularly demo my changes to other departments and directors so I can gather feedback and further revise my changes. Before I start work I always try to understand what is needed and how they want it to work and try and figure out what they need not what they want (different things)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Projects are built around motivated individuals, who should be trusted&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Not sure I understand this one. There are people that use my projects that I always go to, to find out how it is being used. There are also people that are not interested in change, it is always far more difficult to convince them of the value of what I am working on.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Face-to-face conversation is the best form of communication&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When I was an IT support guy, I used to like going up to someone’s desk and seeing them experience the problem, it could usually be fixed in a couple of clicks. However when you had a call from a remote office and had to talk through trying different things it could take hours to fix. The same can be said of deploying a new feature, if you talk to your users and explain what has been added they are far more likely to use it, than if you send them an email listing what you have done.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Working software is the principal measure of progress&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If a Manager can click two buttons to find out how busy their department is, when before they only had out of date spreadsheets, this is a clear measure of progress. Any time spent on code that never gets deployed doesn’t improve anything, its only when that code starts being used has progress been made.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sustainable development, able to maintain a constant pace&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I am pretty sure I don’t do this. I work harder at some times than others. Sometimes there are other projects or other demands on my time and so development on a particular project will decrease and there are times when I eat, sleep, dream about a project.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Continuous attention to technical excellence and good design&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I do strive towards good design and with each deployment aim to improve the quality of code in production. However my limited knowledge means that I don’t always produce the best code but it is improving. If I look at some work I have done in the past, I would definitely do some of that differently if working on it now.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Simplicity—the art of maximizing the amount of work not done—is essential&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When I first read this one, it made no sense to me. However I believe it can be restated as minimising the amount of work done. Recently I was writing SQL code and I had about 4 or 5 different queries to produce the report that was needed. Every time the requirements changed it was a long slog through each of these queries to update them. In the end I had to rewrite this whole process using one query, it took some time but was simpler and is now easier and quicker to maintain. The simpler the code is the easier and quicker it is to maintain, and you have less work to do.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Self-organizing teams&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Not sure this applies to me as I work in a team of one. I do try and keep myself organised but not sure if that qualifies as self-organizing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Regular adaptation to changing circumstance&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Very similar to the second point about changing requirements but I think also includes changes required due to problems you encounter along the way. A simple example of this is when you encounter a problem, there are lots of different ways to solve it. If you can’t solve something in the database layer, then it might be solved with a script or in the user interface.&lt;/p&gt;
&lt;p&gt;So in summary I am not only a developer but very close to being an Agile developer as well, assuming these 12 points are what is needed to be ‘Agile’&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Developer Personality Test</title>
      <link>https://www.funkysi1701.com/posts/2015/developer-personality-test/</link>
      <pubDate>Thu, 02 Jul 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/developer-personality-test/</guid>
      <description>&lt;p&gt;I was sent a &lt;a href=&#34;https://www.surveygizmo.com/s3/1883619/Developer-Personality-Test&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;link&lt;/a&gt;
 to a developer personality test earlier. The test aims to give you a look at your developer personality similar to the famous Myers-Briggs personality test. A shorter version of this test can be found &lt;a href=&#34;https://www.surveygizmo.com/s3/1900187/Short-Developer-Personality-Test&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;here&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;Myers-Briggs tells you if you are &lt;strong&gt;Introvert (I)&lt;/strong&gt; or &lt;strong&gt;Extrovert (E)&lt;/strong&gt;, &lt;strong&gt;Feeling (F)&lt;/strong&gt; or &lt;strong&gt;Thinking (T)&lt;/strong&gt;, &lt;strong&gt;Perception (P)&lt;/strong&gt; or &lt;strong&gt;Judging (J)&lt;/strong&gt; and &lt;strong&gt;Sensing (S)&lt;/strong&gt; or &lt;strong&gt;Intuition (N)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This test however tells you if you are:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Independent vs Collaborative&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Abstract vs Low-Level&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Frontier vs Conservative&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Generalist vs Specialist&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Idealist vs Pragmatist&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/07/19etmksoopu2ojpg.jpg&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Independent:&lt;/strong&gt;
You prefer to spend most of your time working in an isolated environment.  You rarely want to collaborate because you have a better chance of solving problems on your own.  If you do have to collaborate on the direction of a project, you dislike it when you have to defend your position or when others try to muddy your plans for the project.  It’s better to have one strong vision for a project from the lead programmer on that project.  Having a large team or allowing others to have significant control over the project risks communication errors, a muddied code base, and inefficiencies.  If one developer has a firm grasp on the entire codebase, they’ll be much better at fixing and improving it quickly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Collaborative:&lt;/strong&gt;
Good code doesn’t happen in a vacuum.  You need a team to keep you energized and on your toes so that you’re constantly improving the project code using the entire team’s varied experience and strengths.  You like to talk frequently with colleagues and discuss ideas so that you can learn from others and spark ideas.  It doesn’t matter what their experience level is, you can always learn something by including everyone.  A solo coder can’t possibly code a large software project with the speed and quality that a team can.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Abstract:&lt;/strong&gt;
You prefer to write in languages and frameworks that simplify development as much as possible and use as few characters and lines of code as possible. The trajectory of software development has always been toward making life easier and error-free. Programming has always been about adding more abstraction layers to simplify tasks, so why not trust the technology on your layer and don’t worry about handling the lower layers?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Low-Level:&lt;/strong&gt;
The more abstraction tools and high-level languages we build, the further we get from understanding and controlling the deeper components in our programs.  This means lower performance and endless bug searches.  Developers today need to have a stronger understanding of compilers, memory management, pointer arithmetic, and other low-level topics.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Frontiers:&lt;/strong&gt;
You like to work at the cutting edge.  Using too many old languages and technologies bores you, and it severely hinders your software’s potential to keep outdated technologies in it for too long. Developers need keep their ears to the ground for new technologies and new versions of tools that they already use.  Even if the community and maturity of the project isn’t at a level that most enterprises would consider “safe,” you’re willing to be an early adopter if you believe the community and the technology has momentum.  Development technology is changing faster every day, and we need to constantly be adopting new tools and methods to keep up.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conservative:&lt;/strong&gt;
It seems like every 10 years we forget all the problems we solved in the previous decade and start to build ‘new’ tools that solve the same problems, even though there is a perfectly good solution that has existed for years.  Enterprises have it right when they make conservative decisions about their technology stack. Why would you hang your business on a technology with only a few years of maturity in just a handful of production use cases?  Technologies like PHP, Java, and SQL have been mainstays of the development industry for years, and it takes a lot of time for new technologies to make it into that maturity tier.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Generalist:&lt;/strong&gt;
You like to be known as a “Jack of all Trades” and a reference for others on your team. You jump at every chance to enhance your skills in a wide variety technology topics, not just the ones that apply to your day to day work.  You don’t always know when it might be useful to have these extra skills, but when the time comes, you are ready.  If more developers took the time to learn other skills outside of the ones relevant to their project, they’d work more seamlessly with the rest of their organization because they’d have more empathy and understanding of the challenges that their colleagues face.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Specialist:&lt;/strong&gt;
If you’re a Jack of all Trades, you’re a master of none. Mastery in one or two areas is what makes you valuable.  What’s the point of learning skills for other jobs you don’t have and can’t control? When you plan for a project or do technical research, it’s always focused on something you’re working on. You don’t get side-tracked. If you learn a new skill, it’s because the project requires that you do it. Most or all of your hobby projects are also building your mastery of the skills you use at your job.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Idealist:&lt;/strong&gt;
You believe in the power of well-defined processes. It’s crucial to an organization’s success that they create and follow appropriate and effective processes for building software. Trying to improvise or play it by ear invites the possibility of workflow errors that can decrease the quality of the software or even cause major product failures. Planning is also extremely important to you.  You like to research all of the things you will need to know before starting a project.  It’s important to find out the best architecture for your software beforehand, and then strictly implement that architecture with objective best practices.  The more planning and scaffolding you do in the beginning, the less overall work you will have to do to complete the software.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pragmatist:&lt;/strong&gt;
Speed is your best weapon in a competitive industry, and to quickly prototype and build new products, you need to have a flexible, pragmatic process.  You don’t have a few months to plan your projects, you need to just start coding and a good path for the project will reveal itself.  Great products are made through frequent feedback and releases, so why shouldn’t your plan be just as adaptable? Your plan should be adapted to changes in the software, and your expertise should be adapted to the project. You shouldn’t spend your precious time studying a problem that you’re not certain to run into while coding your projects.  Trying to build test coverage for every possible scenario and having long meetings throughout the process are a waste of time and distract you from doing more productive work.&lt;/p&gt;
&lt;p&gt;I am not going to admit where I came in this test as being a newbie developer my answers are very subjective and I don’t believe I have enough experience to really say where I lie on many of these issues.&lt;/p&gt;
&lt;p&gt;I only have experience of working on my own and in very small teams, while I think working in a bigger team would have benefits I have no experience of this.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Sudoku Challenge</title>
      <link>https://www.funkysi1701.com/posts/2015/sudoku-challenge/</link>
      <pubDate>Fri, 26 Jun 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/sudoku-challenge/</guid>
      <description>&lt;p&gt;Last night I went to a Code Dojo at Leeds Sharp (the coding user group I have started going to). A Code Dojo is a programming challenge that people work on usually in pairs.&lt;/p&gt;
&lt;p&gt;The challenge that we worked on was to code a solution to the puzzle game Sudoku. The code we worked with can be found on github.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/06/2000px-Sudoku-by-L2G-20050714.svg_.png?resize=660%2C660&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;I don’t know much about Sudoku but the game goes like this. You start with a 9×9 grid, and the idea is to fill in all the missing numbers.&lt;/p&gt;
&lt;p&gt;Each Row can only use each digit 1 to 9 once, each column can only use each digit 1 to 9 once and each subgrid (3×3) can only use each digit once.&lt;/p&gt;
&lt;p&gt;I worked with Richard one of the Leeds Sharp organisers, we started by trying to loop through each empty cell and insert values in a brute force attack, but this approach didn’t get us very far (literally as the application crashed!)&lt;/p&gt;
&lt;p&gt;The approach that we needed to use was to loop through calculating possible values.&lt;/p&gt;
&lt;p&gt;It was only when I sat down at this dojo did I realise how much I still have to learn, but while talking with Richard about different approaches and different coding structures I started to learn.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Fathers Day</title>
      <link>https://www.funkysi1701.com/posts/2015/fathers-day/</link>
      <pubDate>Sun, 21 Jun 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/fathers-day/</guid>
      <description>&lt;p&gt;In the UK today is Fathers Day. Happy Fathers Day Dad!&lt;/p&gt;
&lt;p&gt;I thought I might talk about how he encouraged my interest in technology, especially as in about 8 weeks I will become a parent and will have someone to encourage and inspire.&lt;/p&gt;
&lt;p&gt;I am going to sound really old but when I was born there was no internet, no mobile phones and computers more often appeared in sci-fi than in your home.&lt;/p&gt;
&lt;p&gt;The first computer I remember us owning was a Lynx. A quick google reveals there were a number of different models, I have no idea what we had but here is what I found.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/06/PRODPIC-2926.jpg?resize=300%2C185&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;In March 1983 the Lynx 48K was released, in September this was upgraded to 96K. In December 1983 a new Lynx was released with 128K. To put these numbers in perspective on my desktop is an image file that is 123K! The CPU in this computer was rated at between 4 and 6Mhz. (Modern PCs have CPUs around the 1.5Ghz or 1500Mhz)&lt;/p&gt;
&lt;p&gt;The Lynx we had, didn’t have a disk drive or a mouse. Programs were loaded from audio tapes (Audio tape was a form of data storage that came before CDs where data was stored on magnetic tape, most often used for music) The tapes we had would often get stuck and data wouldn’t load. The answer to this was to fast-forward/rewind the tape or hit the tape on your leg. For some reason this is a memory I still have of my dad hitting a tape on his leg to get a game or something else to load on the lynx. We also had a joystick for playing some of the games. I believe we also had an early thermal printer.&lt;/p&gt;
&lt;p&gt;My memory of the Lynx is in black and white. The reason for this is that the Lynx was connected to an old black and white TV, it was a special treat when we connected the main colour TV to the Lynx.&lt;/p&gt;
&lt;p&gt;We had a wide range of games for the Lynx, I can remember Jet Set Willy, and Diggerman. But there were also programs which my father had created. The Lynx had a form of BASIC where you can write you own programs and my father spent many hours writing programs for me and my sister. (We actually never realized this at the time)&lt;/p&gt;
&lt;p&gt;With that as my introduction to computers is it any wonder that I do what I do now? Now what should I do for my child to encourage them in a similar way?&lt;/p&gt;
&lt;p&gt;As a family we never owned a games console. Not sure if this was a financial or moral choice but it is something I will have to think about. I want my child to be knowledgeable about computers and able to compete in the competitive job market, but I also want them to know about science and nature and to enjoy their childhood. Lots of technology choices to make over the next few years.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>50th Blog Post</title>
      <link>https://www.funkysi1701.com/posts/2015/50th-blog-post/</link>
      <pubDate>Wed, 17 Jun 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/50th-blog-post/</guid>
      <description>&lt;p&gt;WOW! I have reached the milestone of 50 blog posts.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/06/top-50-2012.jpg&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;I have tried to blog at least every week and I have learnt a lot. I have talked about my work, technology, things I have learnt, things I want to do and many more things. It is too soon to tell if my blog is going to be a success, but I think I am starting to find my ‘blog’ voice and I intend to keep on blogging.&lt;/p&gt;
&lt;p&gt;To celebrate here are some of my highlights.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.funkysi1701.com/2015/05/30/user-groups-and-f/&#34;&gt;User Groups and F#&lt;/a&gt;
 By far my most popular blog post. I talk about my first visit to the Leeds Sharp group and an introduction to the F# language.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://www.funkysi1701.com/2015/03/25/monitoring-screens/&#34;&gt;Monitoring Screens&lt;/a&gt;
 I talk about creating a big screen of vital monitoring information.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://www.funkysi1701.com/2015/02/13/ten-forward-episode-135-anti-firbob-is-back-or-simons-desert-island-trek/&#34;&gt;Ten Forward Episode #135&lt;/a&gt;
 – Simon’s Desert Island Trek My appearance on the Ten Forward Podcast&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://www.funkysi1701.com/2015/04/05/building-something-with-a-raspberry-pi/&#34;&gt;Building something with a Raspberry Pi&lt;/a&gt;
 I blog about getting a Raspberry Pi to play around with&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://www.funkysi1701.com/2015/02/23/improving-your-blog/&#34;&gt;Improving your Blog&lt;/a&gt;
 John Sonmez tries to help my blog improve&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://www.funkysi1701.com/2015/01/16/javascript-progress/&#34;&gt;Javascript progress&lt;/a&gt;
 About learning javascript&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://www.funkysi1701.com/2015/04/11/the-raspberry-pi-adventure-starts/&#34;&gt;The Raspberry Pi Adventure Starts&lt;/a&gt;
 I get a Raspberry Pi and start building something with it&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://www.funkysi1701.com/2015/04/21/weakest-database-design/&#34;&gt;Weakest Database Design&lt;/a&gt;
 I talk about database design&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://www.funkysi1701.com/2015/05/17/trying-windows-10/&#34;&gt;Trying Windows 10&lt;/a&gt;
 I talk about my experience with the latest windows operating system&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://www.funkysi1701.com/2015/02/04/laziness/&#34;&gt;Laziness&lt;/a&gt;
 I talk about the extreme ways IT Professionals go to be more lazy&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>Requirement Gathering</title>
      <link>https://www.funkysi1701.com/posts/2015/requirement-gathering/</link>
      <pubDate>Tue, 16 Jun 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/requirement-gathering/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Why is it so hard to find out exactly what is needed when designing changes to a system?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/06/Requirements-Gathering-User-Experience-UX-Project-Cartoon.jpg&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;When adding functionality to databases I always like to dive in and start adding extra columns and new tables. But at some point you need to find out what is needed.&lt;/p&gt;
&lt;p&gt;The process of gathering requirements that I have followed goes something like this.&lt;/p&gt;
&lt;p&gt;My boss tells me that we need a system to solve x problem. This is the broad overview of what is needed.&lt;/p&gt;
&lt;p&gt;Next I need to find out specifically how the system is being used and what things need adding. Discussing the specifics with my boss often results in a high level of confusion. I always try to speak with the users that will be using this system on a daily basis. If I create something that isn’t liked people will avoid using it and it won’t solve the original problem so I always think it is very important to speak to the day to day user.&lt;/p&gt;
&lt;p&gt;After I have an idea of what is needed, I build something. Once I have something that sort of works, I will try and demonstrate this to the user to gather feedback. This feedback is invaluable as it will often reveal if I am going in the right direction and reveal missing requirements that need to be incorporated in the finished solution.&lt;/p&gt;
&lt;p&gt;I will often repeat the last stage a few times especially if there is a big change needed, once I am happy I will demonstrate to my boss before deploying the solution.&lt;/p&gt;
&lt;p&gt;After deployment there is often a period of fixing issues and gathering feedback before I can consider the project finished.&lt;/p&gt;
&lt;p&gt;This whole process is very time consuming as there is a period of changes being tweaked back and forth following feedback. A better way is to gather a detailed specification of what is needed and work towards delivering that.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Runaway SQL Log growth</title>
      <link>https://www.funkysi1701.com/posts/2015/runaway-sql-log-growth/</link>
      <pubDate>Fri, 12 Jun 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/runaway-sql-log-growth/</guid>
      <description>&lt;p&gt;Today is my day off, but I wake up and have a quick look at &lt;a href=&#34;https://www.funkysi1701.com/posts/i-love-nagios/&#34;&gt;nagios&lt;/a&gt;
 to see if there is anything I need to worry about. Yes there is, SQL Server has run out of disk space on its data disk.&lt;/p&gt;
&lt;p&gt;I race downstairs and VPN onto the server to find out what has happened. One of my monitoring databases has had runaway log growth and is over 80Gb is size.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BACKUP LOG [DBName] &lt;span style=&#34;color:#66d9ef&#34;&gt;WITH&lt;/span&gt; TRUNCATE_ONLY  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DBCC SHRINKFILE(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;DBName_Log&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Free disk space is back to normal, all users will be unaware of the problem and everything is fine again. I create a daily job that runs the above code, that way it should stay a manageable size.&lt;/p&gt;
&lt;p&gt;Next I need to find out why it happened and to prevent it happening again in the future (Next time I have a day off I want to lie in!)&lt;/p&gt;
&lt;p&gt;I check the SQL logs and notice&lt;/p&gt;
&lt;p&gt;BACKUP LOG WITH TRUNCATE_ONLY or WITH NO_LOG is deprecated. The simple recovery model should be used to automatically truncate the transaction log.&lt;/p&gt;
&lt;p&gt;Then I remember what I have done to cause this issue. I have a separate disk for my backup files and earlier in the week I noticed this disk was filling up, a large amount of space was taken up by transactional backup files. I thought I don’t need to backup the transactions for this non critical database, I will just do a full backup at the start of everyday.&lt;/p&gt;
&lt;p&gt;However what I forgot is that a transactional backup keeps the log file under control, once this backup was stopped the log file grew uncontrollably. The answer, change the database from FULL mode to SIMPLE.&lt;a href=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/06/image002.png&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;image002&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/06/image002-300x270.png?resize=300%2C270&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;This is my understanding of how backups work in FULL mode. A full backup is done at the start of the day which resets the log file, then changes in the database are stored in the log file, this is backed up into a transactional backup and the log file gets reset. If you have regular transactional backups throughout the day the log file doesn’t grow too much, however with no transactional backups your log file contains an entire days worth of changes and so for a monitoring database this could be quite large.&lt;/p&gt;
&lt;p&gt;In SIMPLE mode you can’t do transactional backups and the log doesn’t grow uncontrollably. This shouldn’t be used for production databases as if there is a problem you could loose data.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Don’t Live with Broken Windows</title>
      <link>https://www.funkysi1701.com/posts/2015/pragmatic-programmer-broken-windows/</link>
      <pubDate>Mon, 08 Jun 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/pragmatic-programmer-broken-windows/</guid>
      <description>&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/06/1-ucIHdOcnByPsF5eX0j_mhg.jpeg?resize=1024%2C696&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Last night I started reading &lt;a href=&#34;https://www.amazon.com/Pragmatic-Programmer-Journeyman-Master-ebook/dp/B003GCTQAE/ref=mt_kindle?_encoding=UTF8&amp;amp;me=&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;The Pragmatic Programmer by Andrew Hunt and David Thomas&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;One practical tip that immediately jumped out at me as useful in my quest to be a better programmer: &lt;strong&gt;Don’t live with broken windows&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/06/tpp.jpg?w=1324&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;The theory goes like this: an abandoned building with a single broken window attracts additional broken windows, graffiti, litter, and a sense that no one cares about this building. However this can be avoided if the authorities repair the window straight away.&lt;/p&gt;
&lt;p&gt;You can apply this theory to other walks of life, too, like keeping your kitchen clean. After you’ve spent hours cleaning your kitchen to make it spotless, you make an effort to keep it clean. But if your kitchen is piled high with dirty pans, leaving out an extra mug or dirty bowl isn’t going to feel like it makes any difference.&lt;/p&gt;
&lt;p&gt;The software engineering implications of this theory are that if you take care to keep your code tidy, it will stay that way. If you know something is broken but never make time to fix it, other bugs and issues will creep into it, until it’s a mess that no one dares touch.&lt;/p&gt;
&lt;p&gt;We have a website that is starting to get a bit buggy. It’s not broken, but it’s been a while since anyone has given it any love. Bits of its functionality are starting to get flaky.&lt;/p&gt;
&lt;p&gt;Being the only programmer in my place of work, I seldom have time to think about this website — let alone sit down and maintain it.&lt;/p&gt;
&lt;p&gt;But the number of related support calls have been gradually increasing — more windows are breaking — and I’m spending more and more time patching its bugs to keep people happy.&lt;/p&gt;
&lt;p&gt;Know that I’m aware of the broken windows principle, I know exactly what to do: sit down with this website for a couple of days and find out what exactly is causing these issues.&lt;/p&gt;
&lt;p&gt;Then I’ll rebuild the flaky bits, replace the proverbial cracked glass, and wash down a few walls while I’m at it.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>I’m a developer now</title>
      <link>https://www.funkysi1701.com/posts/2015/im-a-developer-now/</link>
      <pubDate>Wed, 03 Jun 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/im-a-developer-now/</guid>
      <description>&lt;p&gt;For a while now I have been at the door of describing myself as a developer, but I think I have finally gone through that door.&lt;/p&gt;
&lt;p&gt;It is all a state of mind, its not about having x amount of knowledge, its just about saying “Yeah, I’m a developer now.”&lt;/p&gt;
&lt;p&gt;One thing that pushed me through that door, was an application form for something in which I ticked the software developer box instead of the IT Manager box.&lt;/p&gt;
&lt;p&gt;The other thing is some of the tasks I worked on recently. One of our databases has a Web Service running that supplies a website with some figures, and we found out recently that this needed changing due to a change on this website. Our contractor quoted us to do this work, I think it was 8 hours. My boss said why don’t you have a go at doing it instead and save us money.&lt;/p&gt;
&lt;p&gt;So I had a go, thinking this will take me a couple of days at least, as I will have to figure out how the code works and end up not understanding it. But no I had the changes done in less time than the contractor had quoted us. Go Me! I will say that these changes have yet to be fully tested, so I still might end up spending more time on this.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>User Groups and F#</title>
      <link>https://www.funkysi1701.com/posts/2015/user-groups-and-f/</link>
      <pubDate>Sat, 30 May 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/user-groups-and-f/</guid>
      <description>&lt;p&gt;For a while I have been threatening to try a user group. Well this week I went to my first meeting.&lt;/p&gt;
&lt;p&gt;The user group I went to is called &lt;a href=&#34;https://www.meetup.com/Leeds-Sharp/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Leeds Sharp&lt;/a&gt;
 who are celebrating their third birthday, happy birthday guys and thanks for the cake.&lt;/p&gt;
&lt;p&gt;The talk was all about F#. I know nothing about &lt;a href=&#34;https://fsharp.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;F#&lt;/a&gt;
 other than it is in visual studio. The speaker was &lt;a href=&#34;https://twitter.com/ptrelford&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Phil Trelford&lt;/a&gt;
 an expert in F# and former game developer who regularly speaks at conferences. Phil is an expert programmer, one of his stories was that while he had a broken arm, he wrote a copy of Excel in F#. Even with two hands I wouldn’t know where to start on something like that.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/05/CGHJLlbWEAAbl14.jpg?w=1024&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;There are plenty of advantages to using F# over C#, fewer lines of code was one. In Phil’s example he had some C# code which was about 30 lines but the F# was 2, part of the reason for this is F# has no {}.&lt;/p&gt;
&lt;p&gt;I found myself thinking this must be too good to be true there must be some disadvantages to using F#?&lt;/p&gt;
&lt;p&gt;I don’t know what they are yet, I am guessing you need to play around with the language a bit to really understand them.&lt;/p&gt;
&lt;p&gt;One claim that was made was that F# has less bugs. I am unsure how this can be true. Code is written by humans, humans will make mistakes which ever language they choose, there will be bugs.&lt;/p&gt;
&lt;p&gt;After the group I came away with a few things to try out. Try the F# tutorial that can be found in Visual Studio, try a Koan, this is a piece of code that contains failing tests, in the process of fixing the tests you learn the language, come back next time to Leeds Sharp and learn something else.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Visual Studio</title>
      <link>https://www.funkysi1701.com/posts/2015/visual-studio/</link>
      <pubDate>Tue, 26 May 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/visual-studio/</guid>
      <description>&lt;p&gt;I recently replaced my installation of Visual Studio 2013 with Visual Studio 2015 RC.&lt;/p&gt;
&lt;p&gt;I like the new version, I am not a Visual Studio expert so it will probably take me a while to find all the good stuff but here are some initial thoughts.&lt;/p&gt;
&lt;p&gt;Being as my MSDN subscription is still valid I have installed the professional version to take advantage of its extra features like CodeLens.&lt;/p&gt;
&lt;p&gt;One of the first things I spotted was that the integration with Azure has been improved. In the last version it was difficult to sign in to Azure with the correct credentials, especially if you have more than one Azure account. Now you can add multiple Accounts and Subscriptions.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/05/i1.png&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;CodeLens is a feature that has been around in Visual Studio since 2013, but in 2015 it is available in Professional meaning more people have access to it.&lt;/p&gt;
&lt;p&gt;CodeLens gives coders useful information at a glance. Above each class/method is listed how many references there are. If you click on the number of references you can see where that class or method is referenced in the rest of your code. Useful to be able to see which methods or classes are not being used.&lt;/p&gt;
&lt;p&gt;Next CodeLens shows who (according to git) last changed the class or method and how many days ago that was. Clicking on it shows a cool graph of when changes have happened and who did them.&lt;/p&gt;
&lt;p&gt;Next you can see the number of changes that have been made, basically a source control history, but without having to load up your git client.&lt;/p&gt;
&lt;p&gt;For code that doesn’t contain classes or methods such as T_SQL you can see at the bottom of your code window the last two CodeLens information to help you track down what changes have happened recently.&lt;/p&gt;
&lt;p&gt;The last new feature that I have noticed is the Light Bulbs that keep showing up all over my code. I think the Light Bulbs might be called Quick Actions, but whatever they are called they are suggestions on how to improve your code. So far they have suggested to be to get rid of using references that are not used, simplify a fully qualified name, drop unneeded this keywords. I am sure more will popup as I do more coding.&lt;/p&gt;
&lt;p&gt;These improvements to Visual Studio I like, and I am sure there are many more that I haven’t noticed. I expect support for the vNext .net framework is also in there somewhere which hopefully I can play around with soon.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Overflow</title>
      <link>https://www.funkysi1701.com/posts/2015/overflow/</link>
      <pubDate>Fri, 22 May 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/overflow/</guid>
      <description>&lt;p&gt;Today I encountered a new error.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/05/error.jpg?w=385&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Run-time error ‘6’: Overflow doesn’t really tell me much. The error was occurring in the Access ADP front-end of our main database. It was only occurring for one particular Id number which was really confusing me.&lt;/p&gt;
&lt;p&gt;First thing I tried was to remove the most recent changes I had made, this made no difference. So time to look at the VBA code that was run just before the error.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Dim iPropertyId As Integer
iPropertyId = DLookup(“PropertyId”, “Survey”, “[ProjectNo]=” &amp;amp; Me.ProjectNo)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;All looks good, even running the Dlookup query in SQL Management Studio threw no errors.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; PropertyId &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; dbo.Survey &lt;span style=&#34;color:#66d9ef&#34;&gt;WHERE&lt;/span&gt; ProjectNo &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next thing I tried was explicitly setting iPropertyId to the problematic Id, still the same error.&lt;/p&gt;
&lt;p&gt;This made me look at the error message again. Overflow suggest something being too big, but what could it be.&lt;/p&gt;
&lt;p&gt;Integer has a size limit of 32,767 and the value I was trying to pass into iProperty was 32779. This was what was causing the problem, my database had grown to such a size that Integer was too small, I needed to change it to a Long Integer. Long has a size of 2,147,483,647 so my database should keep working for a while more.&lt;/p&gt;
&lt;p&gt;The famous programming help website &lt;a href=&#34;https://stackoverflow.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Stack Overflow&lt;/a&gt;
 is named after such an error. This error shows how difficult it is to decide what variable type to use, as you don’t know how quickly your database will grow.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Trying windows 10</title>
      <link>https://www.funkysi1701.com/posts/2015/trying-windows-10/</link>
      <pubDate>Sun, 17 May 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/trying-windows-10/</guid>
      <description>&lt;p&gt;My laptop has been getting a bit cluttered up with stuff so this weekend I gave it a reset.&lt;/p&gt;
&lt;p&gt;As I am using windows 8 this was much easier than doing a format reinstall which I have done many times with previous OSes. Open settings and select recovery and after about 4 hours everything was back to factory settings.&lt;/p&gt;
&lt;p&gt;I then installed a few updates and then installed the windows 10 preview. One of the requirements for windows 10 is Windows 8 Update (the one that came after 8.1), it took a few reboots and updates until I got that installed.&lt;/p&gt;
&lt;p&gt;I had purchased the pro pack which gives you the same features as windows 8 pro but I didn’t notice until after I installed 10 that this hadn’t been installed. I will need to roll back to windows 8 apply the update and then reinstall 10 again. I can’t really be bothered to do that, so I will live without HyperV for now. As it is I have done a lot of sitting around waiting for things to finish installing.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/05/win10.jpg?w=888&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;I much prefer Windows 10 to Windows 8, an earlier preview had an issue with drivers for my second screen but that appears to have been resolved now. The start menu is back and I prefer it, to being taken to that extra screen of options that windows 8 had.&lt;/p&gt;
&lt;p&gt;I prefer the email client that windows 8 had to the windows 10 version as my work emails don’t work with it. I assume this is due to how my exchange server has been configured and maybe a later preview will allow my email to work or failing that I will have to get emails at work fixed properly.&lt;/p&gt;
&lt;p&gt;All apps now open in windows which is much nicer. Cortana is very similar to Google Home on my phone where I can talk and ask it stuff. But I never use this sort of feature apart from testing it.&lt;/p&gt;
&lt;p&gt;The new web browser has some nice features like the option to scribble over a web page but nothing that special that I think I will change my default browser from Chrome. It will be interesting to see how it performs in browser stats.&lt;/p&gt;
&lt;p&gt;I am part way through installing Visual Studio 2015 RC, but I think that will have to be a separate post.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>As A Service</title>
      <link>https://www.funkysi1701.com/posts/2015/as-a-service/</link>
      <pubDate>Sat, 16 May 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/as-a-service/</guid>
      <description>&lt;p&gt;In Cloud Computing there are a lot of terms that end aas or As a Service. Most of these I hadn’t heard of until I started writing this list.&lt;/p&gt;
&lt;p&gt;Any service that is delivered over the internet instead of hosted locally on your network or PC could in theory be described as an As a Service.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/05/19656ee.jpg?w=841&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PaaS Platform As a Service&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is one of the big ones. Microsoft Azure provides a Platform as a Service which I am familiar with. Platform as a Service is where a provider provides a platform where you can build apps or websites.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SaaS Software As a Service&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Another popular one. Software as a Service can be as simple as a website that runs a service that a customer wants to use, I work for a company that provides a SaaS product.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;IaaS Infrastructure As a Service&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The last of the big ones. A good example of IaaS is a Virtual Machine which can either be hosted on a server somewhere (a private cloud) or on the internet via a company such as Azure (public cloud) The Pizza as a Service diagram illustrates the differences between Saas, PaaS and Iaas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NaaS Network As a Service&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is just a type of IaaS that specializes in providing networking. Anything that provides network connectivity could be included in this category.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CaaS Communications As a Service&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Another subtype of IaaS this time specializing in communications, this could include Voice over IP or other similar technologies.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;MONaaS Monitoring As a Service&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you have a SaaS, PaaS or IaaS you will most likely want to monitor that it is working, I certainly do. This is something that is often included in your IaaS or PaaS package. Azure has various tools for monitoring and this could be included in this category.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BaaS Backup As a Service&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;With the growth of cloud storage and the decrease in its cost, backing up to the cloud is a very attractive option. Any service that allows you to backup and restore from the internet can be included in this category. Your provider needs to manage your backups for it to be truly BaaS rather than just another place to store your files.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DaaS Desktop As a Service&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is where your desktop is visualized and stored in the cloud. I know very little about this as I have never used it, but I would imagine you need a strong internet connection for it to work reliably.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DBaaS Database As a Service&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is a simple one if your database is stored in the cloud like Azure SQL Database then it fits into this category. If you run your own sql server install on a VM then it doesn’t fit in this category as you are still managing it yourself and is IaaS&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HaaS Hardware As a Service&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;HaaS this is another subcategory of IaaS which concentrates on hardware.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;IDaaS Identity As a Service&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is where the management of who you are is managed in the cloud. Single Sign-On could be achieved if a website redirected determining if you are who you say you are to a particular IDaaS. Azure Active Directory is an example of this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SaaS Storage As a Service&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You get the idea now, storing files on a remote cloud product is an example of Storage as a Service. DropBox or OneDrive are good examples of this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;FoaaS F Off As a Service&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;.NetRocks mentioned this a few weeks ago and is a joke As a Service. &lt;a href=&#34;http://foaas.herokuapp.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;http://foaas.herokuapp.com/&lt;/a&gt;
 The idea is that you can use this service to tell people to F off.&lt;/p&gt;
&lt;p&gt;Writing this blog post has given me a better understanding of all the aaS that are out there. I am sure I haven’t explained some of these very well and no doubt missed some off.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Top 25 Star Trek Characters</title>
      <link>https://www.funkysi1701.com/posts/2015/top-25-star-trek-characters/</link>
      <pubDate>Sun, 10 May 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/top-25-star-trek-characters/</guid>
      <description>&lt;p&gt;I am  going to take a break this week from talking about technology to talk about Star Trek.&lt;/p&gt;
&lt;p&gt;I have just listened to a &lt;a href=&#34;http://www.trekmate.org.uk/ten-forward-episode-146-lists-are-dumb-but-this-episode-is-not/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;podcast&lt;/a&gt;
 where they consider this &lt;a href=&#34;https://uk.ign.com/articles/2009/05/08/top-25-star-trek-characters&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;list&lt;/a&gt;
 of great Star Trek Characters. I am now going to try and come up with my own top 25 characters. Here we go.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Spock&lt;/strong&gt;. My number one star trek character is Spock. Leonard Nimoy who recently passed away brilliantly brought this character to life. We have the inner turmoil that many of us can associate with, we have a journey to become more human, we have the pursuit of logic. We have the great interplay between him and McCoy and Kirk.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/02/Spock_2293.jpg&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Data&lt;/strong&gt;. My second number one star trek character, well OK, second star trek character is Data. His weekly exploration of what it meant to be human is star trek’s best exploration of the human condition. There are so many moments which make me like Data but I think when I builds his daughter, Lal is possibly my favourite.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Picard&lt;/strong&gt;. The Captain of the Enterprise. You want to know about leadership or diplomacy you watch Captain Picard in action. If only more of our world leaders could be like Captain Picard we would have all our Earthly problems sorted by tea-time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Kirk&lt;/strong&gt;. The original captain of the Enterprise, not so much a Diplomat but could talk a computer to death in minutes. A fun guy to be around as long as you didn’t work in security or want a long lasting relationship with him, (sorry ladies this guy is married to the Enterprise)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Worf&lt;/strong&gt;. Our favourite Klingon. The most honourable man on this list and could handle himself in a battle. Also popular with the ladies if Troi and Dax have anything to say about it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sisko&lt;/strong&gt;. Our third captain, but Sisko had much more on his plate than the others. He had a Son to bring up, he lost his wife, he was in the middle of the biggest war the Federation has ever seen (at least on screen anyway), he became a religous icon and later a God.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;7 of 9&lt;/strong&gt;. The sexy borg from Voyager what’s not to like? Also brought some much needed conflict to the Voyager crew.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Garak&lt;/strong&gt;. The plain and simple tailor from DS9. But is he also a spy? There are so many layers to Garak you have no idea what to believe.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;McCoy&lt;/strong&gt;. Bones to his friends. A great Doctor but even greater friend to Jim Kirk and Spock (not that either of them would admit it.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;EMH&lt;/strong&gt;. Please state the nature of the medical emergency, started the show off as just another piece of technology and ended up one of the crews most important characters.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Janeway&lt;/strong&gt; Coffee Addict and defeated the Borg our first female captain.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Dukat&lt;/strong&gt;. DS9s regular bad guy. Started off Bad, then softened to be a good guy for a bit and then signed an alliance that started a war, in the middle of that he went crazy and ended up going to the Bajoran Hell&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Weyoun&lt;/strong&gt;. The leader of the dominion from the Gamma Quadrant. Was a clone so he could be killed off a few times and still come back. Had some great interplay with Dukat and later Damar.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Damar&lt;/strong&gt;. Started life as Dukat’s lieutenant and rose in rank to leader of his people, before switching sides to lead a rebellion.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Scotty&lt;/strong&gt;. You cannae change the laws of Physics. An engineer that weekly performed miracles, more often because or large repair estimates.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Barclay&lt;/strong&gt;. The only Starfleet office that was unsure of himself and couldn’t talk to people (Oh a bit like me then)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Riker&lt;/strong&gt; The Captain Kirk of Picard’s crew, could inspire his crew and was popular with the ladies, but looks better with a beard.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;O’Brien&lt;/strong&gt;. The everyman of DS9. He constantly had a station that was falling apart but he managed to keep it going, a bit like how I feel sometimes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Quark/Rom/Nog&lt;/strong&gt;. These three Ferengi made the Ferengi good again. Nog started off as comic relief and ended up a Starfleet officer after turning his back on the acquisition of profit. Rom like his son turned his back on profit to fix things, and Quark was the businessman always had his eye for profit.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Odo&lt;/strong&gt;. The shape shifting outsider that maintained order. Was truly an outsider with no idea where he had come from, but eventually he came to tolerate and even love us Solids.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Martok&lt;/strong&gt; Klingon with one eye that welcomed Worf into his house after his second dis-commendation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Zefram Cochrane&lt;/strong&gt; Without this guy there would be no Star Trek. Invented the warp drive and enjoying to drink.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Uhura&lt;/strong&gt; Just a communications officer, but in reality was so much more. One of the first black women on television and inspired a generation to better themselves, was the other half of the first inter-racial kiss&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mirror Universe Hoshi&lt;/strong&gt;. Our universe Hoshi Sato was timid and scared of warp drive, the mirror universe version ended up empress of an entire Empire.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Kai Winn&lt;/strong&gt; Power currupts and Absolute power corrupts absolutely and Kai Winn is a prime example of this, so blinded by power she couldn’t hear what her precious Gods were telling her and ended up sleeping with he arch enemy.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>Using your Rubber Duck</title>
      <link>https://www.funkysi1701.com/posts/2015/rubber-duck/</link>
      <pubDate>Mon, 04 May 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/rubber-duck/</guid>
      <description>&lt;p&gt;Rubber Duck is a process in development where you talk through an issue with an inanimate object such as a Rubber Duck. It gets its name from the book The Pragmatic Programmer where it was first used.&lt;/p&gt;
&lt;p&gt;I am the only programmer where I work and often I find myself with a question that I can’t find the answer to. I do however have a few friends who are far more knowledgeable than I am about this sort of thing. I often find myself explaining my problem via an email to them. During the process of writing this email I have to explain my problem and this sometime reveals the problem and I don’t even need to send the email. At other times by the time they have replied to me, my brain has moved on with the problem sufficiently that I am close to a solution if I am not already there.&lt;/p&gt;
&lt;p&gt;Other people use different items as their ‘Rubber Duck’, people on the &lt;a href=&#34;http://discourse.codenewbie.org/t/whats-your-rubber-duck/61&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;code newbie forum&lt;/a&gt;
 have used items such as a cat, stuffed octopus, a Lego minfig, or just plain old talking to yourself.&lt;/p&gt;
&lt;p&gt;Being the only programmer in my office is difficult. A simple what do you think of this question that could be asked across the office has to be done inside my head and I may think a needlessly complex solution is better than a simple one just because I haven’t thought of the simpler version yet. There are of course advantages to being the only programmer, I can do what I want and learn any technology I like, but I am starting to think the advantages of programming in a group are outweighing programming alone.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>I might actually like SQL Server</title>
      <link>https://www.funkysi1701.com/posts/2015/i-might-actually-like-sql-server/</link>
      <pubDate>Thu, 23 Apr 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/i-might-actually-like-sql-server/</guid>
      <description>&lt;p&gt;How did this happen I think I may actually like SQL Server now?&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/04/download.jpg&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;I remember a few years back when I used to grumble about writing a SQL query that included a JOIN. For some reason back then I could never get my head around JOINs.&lt;/p&gt;
&lt;p&gt;Today is a totally different story. I wrote a deployment script that did the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;dropped a database,&lt;/li&gt;
&lt;li&gt;restored a database from a backup file,&lt;/li&gt;
&lt;li&gt;Created a database table,&lt;/li&gt;
&lt;li&gt;copied the contents of a table into this table,&lt;/li&gt;
&lt;li&gt;disabled and re-enabled some triggers,&lt;/li&gt;
&lt;li&gt;dropped some constraints and columns from a table&lt;/li&gt;
&lt;li&gt;and renamed some columns.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It’s not like I woke up this morning with SQL Server knowledge. For many years I have been adding extra features and changing functionality to our line of business database and over time my SQL confidence has grown.&lt;/p&gt;
&lt;p&gt;For every single one of the steps above I googled and looked up the SQL syntax (every time I write an insert or update statement I look up the syntax, one day it will stick in my brain!) I think the main reason is once you have used SQL for a while you get to see how it works and can split it down into small steps.&lt;/p&gt;
&lt;p&gt;As I &lt;a href=&#34;http://www.funkysi1701.com/2015/04/21/weakest-database-design/&#34;&gt;blogged&lt;/a&gt;
 the other day I am currently working on improving a bad database and today I wanted to test the deployment process. All my changes are in a SSDT project so I took a backup of my database and tried to publish.&lt;/p&gt;
&lt;p&gt;Error! Your changes will result in data loss, no surprises there as I was expecting that error. The main culprit for this was a trigger I wrote but I didn’t find that out until the end of the day.&lt;/p&gt;
&lt;p&gt;As I was working on a backup I could do what I like including destructive changes. I tried creating a pre deployment script. I thought if that runs first, I can persuade SSDT that it matches SQL Server and therefore no data is being lost.&lt;/p&gt;
&lt;p&gt;This didn’t work, but I had created the start of my script mentioned above. I had steps 3 and 4. Lets try running my script first and then try running the deployment of my SSDT project. To get this to work I am going to have to rebuild my database a few times, I did this manually with SQL Management studio a couple of times until I thought, I could add this to my script – that’s step 1 and 2 done.&lt;/p&gt;
&lt;p&gt;Then I got some errors about triggers so I tried disabling them and re-enabling them after it had finished. That’s step 5.&lt;/p&gt;
&lt;p&gt;Finally I needed to drop some columns, this resulted in an error about a constraint. A few trial and error run through’s to find out which constraints I needed to drop and then I could drop the columns.&lt;/p&gt;
&lt;p&gt;The last step was to rename some columns. I thought after this I can run publish from visual studio. No it still complained about data loss. I dropped another trigger and then I could run everything without any errors.&lt;/p&gt;
&lt;p&gt;Wohoo! Aren’t I clever. A simplified version of my code is below&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;USE master &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;–&lt;/span&gt;can&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;’&lt;/span&gt;t &lt;span style=&#34;color:#66d9ef&#34;&gt;drop&lt;/span&gt; the &lt;span style=&#34;color:#66d9ef&#34;&gt;database&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; its &lt;span style=&#34;color:#66d9ef&#34;&gt;open&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;–&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;Step &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;DROP&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;DATABASE&lt;/span&gt; DBName
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;–&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;Step &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;RESTORE &lt;span style=&#34;color:#66d9ef&#34;&gt;DATABASE&lt;/span&gt; DBName &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; DISK&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;’&lt;/span&gt;E:&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;DBName.bak&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;’&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;WITH&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;MOVE&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;‘&lt;/span&gt;DBName_dat&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;’&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TO&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;‘&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;C&lt;/span&gt;:&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;Program Files (x86)&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;Microsoft &lt;span style=&#34;color:#66d9ef&#34;&gt;SQL&lt;/span&gt; Server&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;MSSQL12.MSSQLSERVER&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;MSSQL&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;DATA&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;DBName.mdf&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;’&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;MOVE&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;‘&lt;/span&gt;DBName_log&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;’&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TO&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;‘&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;C&lt;/span&gt;:&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;Program Files (x86)&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;Microsoft &lt;span style=&#34;color:#66d9ef&#34;&gt;SQL&lt;/span&gt; Server&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;MSSQL12.MSSQLSERVER&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;MSSQL&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;DATA&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;DBName.ldf&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;’&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;REPLACE&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;STATS&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;USE DBName &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;–&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;swap back &lt;span style=&#34;color:#66d9ef&#34;&gt;to&lt;/span&gt; the &lt;span style=&#34;color:#66d9ef&#34;&gt;database&lt;/span&gt; you just restored
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;–&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;Step &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TABLE&lt;/span&gt; TName2 (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ID INT &lt;span style=&#34;color:#66d9ef&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Name NVARCHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;50&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Address NVARCHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;50&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;City NVARCHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;50&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Postcode NVARCHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;50&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;–&lt;/span&gt;Step &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DISABLE &lt;span style=&#34;color:#66d9ef&#34;&gt;TRIGGER&lt;/span&gt; TR_Trigger &lt;span style=&#34;color:#66d9ef&#34;&gt;ON&lt;/span&gt; TName1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;GO&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;–&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;Step &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;INSERT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;INTO&lt;/span&gt; TName2 (Id,Name)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; Id, Name &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; TName1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;GO&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;–&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;Step &lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;ALTER&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TABLE&lt;/span&gt; TName1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;DROP&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;CONSTRAINT&lt;/span&gt; [DF_Id], [DF_Name]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;GO&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;ALTER&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TABLE&lt;/span&gt; TName1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;DROP&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;COLUMN&lt;/span&gt; Id, Name
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;GO&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;–&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;Step &lt;span style=&#34;color:#ae81ff&#34;&gt;7&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sp_RENAME &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;‘&lt;/span&gt;TName1.City&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;’&lt;/span&gt;, &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;‘&lt;/span&gt;Area&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;’&lt;/span&gt; , &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;‘&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;COLUMN&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;’&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;GO&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;–&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;drop&lt;/span&gt; that &lt;span style=&#34;color:#66d9ef&#34;&gt;last&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;trigger&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;DROP&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TRIGGER&lt;/span&gt; TR_Trigger2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;GO&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;–&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;Step &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ENABLE &lt;span style=&#34;color:#66d9ef&#34;&gt;TRIGGER&lt;/span&gt; TR_Trigger &lt;span style=&#34;color:#66d9ef&#34;&gt;ON&lt;/span&gt; TName1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Weakest Database Design</title>
      <link>https://www.funkysi1701.com/posts/2015/weakest-database-design/</link>
      <pubDate>Tue, 21 Apr 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/weakest-database-design/</guid>
      <description>&lt;p&gt;I have been recently working on a database that hasn’t been designed but has been hacked together by lots of people over the years.&lt;/p&gt;
&lt;p&gt;It started life as an Microsoft Access database created by my director to keep track of all the projects that our company does. It was not much more than one table listing everything. At some point the data and frontend was split with the data being stored in SQL Server and the front end being an Microsoft Access ADP.&lt;/p&gt;
&lt;p&gt;Over the years more and more columns have been added to this table that it long ago became pretty much unmanageable. A few normalized tables exist but for the most part everything is stored in this one table which makes querying it very difficult. At the last count there were 81 columns in this one database table.&lt;/p&gt;
&lt;p&gt;Attempts to improve this database have been tried before but due to the fact that the whole company basically runs off this database and no one person knows everything that the database needs to do causes any changes to be very difficult. I suspect it may be beyond my abilities but I am going to give it a go.&lt;/p&gt;
&lt;p&gt;One advantage I have is version control. All the tables and the structure is in version control, so when I break things I can roll them back. Any changes to the front end are also in source control, these are harder to roll back in case of problems but not impossible.&lt;/p&gt;
&lt;p&gt;I have met with department heads to try and establish which of the 81 columns are being used and which could be dropped. Database design shouldn’t be a democracy, your databases should be designed in a way to store your data most efficiently. In this case it felt a bit like the database was playing “the weakest link” with everyone voting off unpopular columns. “You are the weakest database column. Goodbye!” After much discussion I have over 30 columns that can be dropped and 10 or so that require further investigation.&lt;/p&gt;
&lt;p&gt;Using the Visual Studio project of the database, I removed the columns. This generated thousands of errors as most columns are included in loads of views and stored procedures. All these references need removing, so not a small job. This is made worse by the fact that the views and stored procedures are in a mess, and it is very hard to read the T-SQL code and see what is doing what. Part of my next job is going to be tidying up all these queries so I can see what’s what.&lt;/p&gt;
&lt;p&gt;The advantage of using the Visual Studio project to do these changes is that I can generate a SQL script of the changes and I can rerun a few times and test restoring different columns as it is unlikely to be a smooth deployment.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Security Camera with Raspberry Pi Camera</title>
      <link>https://www.funkysi1701.com/posts/2015/security-camera-with-raspberry-pi-camera/</link>
      <pubDate>Wed, 15 Apr 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/security-camera-with-raspberry-pi-camera/</guid>
      <description>&lt;p&gt;So my first Raspberry Pi project is a security camera. If you have read my previous Raspberry Pi posts you will know that I have been playing  about with the camera but I had one or two problems with Pidora so I am using Raspbian for this example.&lt;/p&gt;
&lt;p&gt;To take a photo with the camera module you can use the command raspistill, this has lots of options you can view the full list by just running the command with no arguments. I will list a few options I have used.&lt;/p&gt;
&lt;p&gt;-o filename : this outputs an image to a file with name filename
-vf : vertical flip
-hf: horizontal flip these are useful if the camera is upside down etc
-q number: quality of jpg image between 0 and 100, the default image size is around 3 Mb, I reduced it to quality = 10 which gave me an image size of 300Kb which is more reasonable
-a text: annotate you image with some text, I found that the text needed to start with a character, numbers only failed for me.&lt;/p&gt;
&lt;p&gt;I want to script the creation of images, so I decided to name the files my script created with the time and date.&lt;/p&gt;
&lt;p&gt;This is fairly easy with a bash script.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;DATE=$(date +”%Y-%m-%d_%H%M”)
raspistill -q 10 -vf -hf -a a$DATE -o /var/www/$DATE.jpg
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The first $DATE is the date I have added to the image itself, because of the problem I encountered with annotating numbers only I have added an extra a to the start of this.&lt;/p&gt;
&lt;p&gt;It is now very easy to get CRON to run this script every few minutes, I decided to run it every 2 minutes.&lt;/p&gt;
&lt;p&gt;My next script tidies up so you don’t get overrun with images.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;cd /var/www
ls *.jpg &amp;gt; stills.txt
mencoder -nosound -ovc lavc -lavcopts vcodec=mpeg4:aspect=16/9:vbitrate=8000000 -vf scale=1920:1080 -o timelapse.avi -mf type=jpeg:fps=24 mf://@stills.txt
rm /var/www/*.jpg
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The third line in this script does something really rather clever it creates a video from all the images you have taken. In order for this to work you will need to install mencoder (sudo apt-get install mencoder)&lt;/p&gt;
&lt;p&gt;This is all rather good but wouldn’t it be rather cool if this images were uploaded somewhere. If someone was up to no good and they might want to disable your security camera. My first thought was to use something like DropBox, but unfortunately it is not supported by the processor on a raspberry pi. However I have found &lt;a href=&#34;https://copy.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;copy.com&lt;/a&gt;
 to be rather good for syncing files.&lt;/p&gt;
&lt;p&gt;To install just run wget &lt;a href=&#34;http://copy.com/install/linux/Copy.tgz&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;http://copy.com/install/linux/Copy.tgz&lt;/a&gt;
 and extract the file to install the client on your raspberry pi.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./CopyConsole -daemon -u=gary@example.com -p=’mypass’ -root=/home/pi/Copy
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This command syncs the folder you have set in -root with copy.com.&lt;/p&gt;
&lt;p&gt;The last thing I did was create a php file running on the webserver that allows you to scroll through the different images. I experimented with using javascript to auto scroll through the images but I found the manual way more useful. All the files I have written I have added to my &lt;a href=&#34;https://github.com/funkysi/RaspberryPi&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;github&lt;/a&gt;
 page.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The Raspberry Pi Adventure Starts</title>
      <link>https://www.funkysi1701.com/posts/2015/the-raspberry-pi-adventure-starts/</link>
      <pubDate>Sat, 11 Apr 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/the-raspberry-pi-adventure-starts/</guid>
      <description>&lt;p&gt;I am currently buzzing with excitement about my Raspberry Pi. I will try to document here what I have done so far.&lt;/p&gt;
&lt;p&gt;I decided to buy the camera module along with my Pi. It was straightforward to connect them up, lift the connector behind the network port, insert the ribbon cable, push connector back down.&lt;/p&gt;
&lt;p&gt;Next I connected up Keyboard, Mouse, Monitor, SD Card and Power. And my Pi had life.&lt;/p&gt;
&lt;p&gt;I was then given a screen full of options to install, Pidora is an OS which is based on Fedora which I have some experience of so I went with that one.&lt;/p&gt;
&lt;p&gt;After that was installed I was presented with a standard desktop with various programs installed.&lt;/p&gt;
&lt;p&gt;So far I had not plugged in a network cable because that would mean sitting in the hall next to the router, I thought before I do that lets see if wifi will work. I have a usb wifi adapter that I use with my PC, so I plugged that in.&lt;/p&gt;
&lt;p&gt;Nothing happened, having some experience of linux I wasn’t surprised. I went to network connections filled in the name of my wifi connection and its password and it connected. WOW! That was easy.&lt;/p&gt;
&lt;p&gt;So I then installed &lt;a href=&#34;http://www.webmin.com/download.html&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;webmin&lt;/a&gt;
 so I could remotely administer it and updated it with YUM. I also started the SSH service so I can use putty to login to my Pi from the comfort of my laptop. Even better than that I found a SSH client for my smart phone so I can even control my Pi from my phone!&lt;/p&gt;
&lt;p&gt;EDIT: I forgot that in order to get webmin to work I needed to do the following.&lt;/p&gt;
&lt;p&gt;mv /etc/redhat-release /etc/redhat-release.bak
echo “Fedora release 20 (Heisenbug)” &amp;gt; /etc/redhat-release&lt;/p&gt;
&lt;p&gt;OK So now I am able to configure settings on my Pi from a browser or use SSH (Secure SHell) to login to run any command I like.&lt;/p&gt;
&lt;p&gt;Now lets lookup how to use the camera. The &lt;a href=&#34;https://www.raspberrypi.org/documentation/configuration/camera.md&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;documentation&lt;/a&gt;
 says that the camera first needs enabling using the command raspi-config. This command doesn’t exist in Pidora. Lets skip it and see if it works anyway. It does! The command raspistill -v -o test.jpg took a picture of my ceiling.&lt;/p&gt;
&lt;p&gt;Now how do I look at this picture remotely. SSH is a command line only interface, so I can see a 2Mb file has been created. How about installing a web server on my Pi?&lt;/p&gt;
&lt;p&gt;yum install httpd&lt;/p&gt;
&lt;p&gt;This install apache which is the default (and very popular) web server.&lt;/p&gt;
&lt;p&gt;service httpd start&lt;/p&gt;
&lt;p&gt;This starts the web server. Going to http://[IP] where [IP] is the ip address of your raspberry pi will show you the default apache page.&lt;/p&gt;
&lt;p&gt;Now if you run raspistill -v -o /var/www/html/image1.jpg it will create your photo on the web server.&lt;/p&gt;
&lt;p&gt;Not bad for my first steps, the command above could be scheduled and images taken every hour. There is also options for recording video.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Building something with a Raspberry Pi</title>
      <link>https://www.funkysi1701.com/posts/2015/building-something-with-a-raspberry-pi/</link>
      <pubDate>Sun, 05 Apr 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/building-something-with-a-raspberry-pi/</guid>
      <description>&lt;p&gt;Many years ago I spent a lot of time learning about electronics. It was great fun, I can’t remember specific things I built, but learning what resistors and capacitors do was fascinating.&lt;/p&gt;
&lt;p&gt;I haven’t really thought about this much as my interests have been concentrated on computers and programming, but recently my interest has been peaked again.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/04/Raspberry_Pi_-_Model_A.jpg&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;The &lt;a href=&#34;http://www.codenewbie.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;CodeNewbie&lt;/a&gt;
 and &lt;a href=&#34;http://hanselminutes.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Hanselminutes&lt;/a&gt;
 podcasts have been running a month of stuff about making things and doing clever things with hardware called &lt;a href=&#34;http://marchisformakers.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#Marchisformakers&lt;/a&gt;
, this began to start me thinking about this stuff again.&lt;/p&gt;
&lt;p&gt;Yesterday a friend of mine was showing me what he had been doing with a Raspberry Pi and Arduino. It is amazing what you can do with these tiny bits of technology and I was very impressed.&lt;/p&gt;
&lt;p&gt;Now I am thinking what mini project could I play around with and which piece of hardware should I base it on. I don’t know much about the two platforms yet but I have found a &lt;a href=&#34;http://www.codenewbie.org/blogs/everything-you-ever-wanted-to-know-about-arduino-and-raspberry-pi&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;blog&lt;/a&gt;
 post that introduces the two. My current thoughts are to start with the Raspberry Pi, it is a UK technology and it uses a linux OS (which I have some knowledge of).&lt;/p&gt;
&lt;p&gt;Being a windows developer, most of my programming knowledge is with C# and Visual Studio. To use my existing knowledge I could install and use MONO, which means I can program the Raspberry Pi using C# (see &lt;a href=&#34;http://logicalgenetics.com/raspberry-pi-and-mono-hello-world/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;here&lt;/a&gt;
 for more details about MONO on Raspberry Pi).&lt;/p&gt;
&lt;p&gt;But deciding on a language to use, doesn’t help me choose a project. I haven’t even got myself a Raspberry Pi yet so I may decide more once I have had a play around with it. Thoughts so far include getting wi-fi to work on the Raspberry Pi or maybe adding a camera and sticking it somewhere and taking pictures, maybe even build myself a baby monitor (might go down well with the wife if its baby related)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Building a CI Server with TeamCity</title>
      <link>https://www.funkysi1701.com/posts/2015/teamcity/</link>
      <pubDate>Wed, 01 Apr 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/teamcity/</guid>
      <description>&lt;p&gt;TeamCity is a Continuous Integration software package which is very easy to install and set up. So easy I managed it over a weekend.&lt;/p&gt;
&lt;p&gt;First of all I fired up a VM in Azure. I found that a Basic A1 VM was sufficient so running a CI server doesn’t have to be expensive, alternatively you could always set a Virtual or Physical server on your own network, but that of course takes a bit longer to set up.&lt;/p&gt;
&lt;p&gt;Before I get too far you are probably asking what is Continuous Integration. A Continuous Integration server takes your code from your source control repository, it then automatically builds it, runs automated tests against it and can even deploy it to production. The main advantages of this is that you can see the health of you code, you can also test different configurations.&lt;/p&gt;
&lt;p&gt;So once you have a server ready, you need to install a few things. First &lt;a href=&#34;https://www.jetbrains.com/teamcity/download/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;TeamCity&lt;/a&gt;
, just install with the default settings. My project is a Visual Studio project so I also needed to install Visual Studio (They have a free edition which does everything I need now, Thank you Microsoft) and SQL Server Express Edition.&lt;/p&gt;
&lt;p&gt;Once TeamCity is installed the rest of the config can be made via the web interface. To make it easier I pointed a domain at my VM (a CNAME record is probably better as an Azure IP address may change) and opened port 80 in the Azure config. First create a build config and then create a VCS Root, this is where you specify where your source control is. TeamCity supports Github and bitbucket and probably many others. You can specify which branch you want to checkout so you can test out the latest features you have written.&lt;/p&gt;
&lt;p&gt;Next you need to configure the steps needed to build your project, whatever you do in Visual Studio can be configured here. You then need to configure how often the build should run, it can be scheduled at specific times, this is how I remember CI servers being configured but now you can also have builds being triggered after commits to source control, very clever.&lt;/p&gt;
&lt;p&gt;That is just about all I have configured so far. My project has a few NUnit tests written for it, these are scheduled to run after every build. In my case 94 of them are currently failing so I now need to learn how my tests work.&lt;/p&gt;
&lt;p&gt;There are additional deployment steps that can be configured but I have not investigated these yet. Notifications about what CI is doing is also possible usually by email but there are other options available.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Monitoring Screens</title>
      <link>https://www.funkysi1701.com/posts/2015/monitoring-screens/</link>
      <pubDate>Wed, 25 Mar 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/monitoring-screens/</guid>
      <description>&lt;p&gt;We all know that it is important to monitor your servers and services, so you can spot issues before they become problems. I personally have spent a lot of time configuring &lt;a href=&#34;http://www.funkysi1701.com/2014/09/24/i-love-nagios/&#34;&gt;nagios&lt;/a&gt;
 to email me about issues and I have recently been configuring various different alerts in Azure.&lt;/p&gt;
&lt;p&gt;My old boss has this idea that I should have a big monitor screen displaying all the vital stats of my servers and services, I personally disagree with this idea and think that notifications on my phone and email alerts are sufficient. He will no doubt correct my thinking when he reads this, but I believe part of his thinking is to make the monitoring of your infrastructure move visible and make it obvious to anyone that walks past that you have your eye on everything.&lt;/p&gt;
&lt;p&gt;For the purpose of this blog post lets assume he has convinced me and I have convinced my actual boss to spend money on the required technology to do this (No easy feat). What exactly would I display on this screen?&lt;/p&gt;
&lt;p&gt;I have Google Chromecast that I use for streaming various things to my TV, this is a relatively cheap bit of technology that could allow a TV or monitor to display a web page with the required stats displayed.
&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/03/perf.jpg?w=980&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;The two main sources of information that I want to display are New Relic for monitoring my azure websites and Nagios for monitoring my internal servers. New Relic allows you to easily export live performance data as iframes so I quickly threw together a web page full of these graphs. However if you have a static screen on the wall you don’t want to have to scroll to see different information so I needed to come up with another way to display this information.&lt;/p&gt;
&lt;p&gt;My first thought was a slide show. There are lots of javascript scripts that cycle through a series of images like a slideshow, this could be adapted to cycle through a series of iframes and display everything I want.&lt;/p&gt;
&lt;p&gt;My script goes something like this and requires jquery as well as javascript. First of all the script waits for the page to load completely with the ready function, it then defines the urls which will be put into the iframe one at a time. It than counts the number of urls you have. It then loops through changing the contents of the src attribute in the iframe every few seconds, in my example it changes every 9 seconds but once this is used in production you may want to increase this.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;script&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;text/javascript&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;$&lt;/span&gt;(document).&lt;span style=&#34;color:#a6e22e&#34;&gt;ready&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt;(){
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;locations&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;URL1&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;URL2&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;etc&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;len&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;locations&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;length&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;iframe&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;$&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;#frame&amp;#39;&lt;/span&gt;); 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;setInterval&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;iframe&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;attr&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;src&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;locations&lt;/span&gt;[&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;len&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }, &lt;span style=&#34;color:#ae81ff&#34;&gt;9000&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now what information wants to be included in a script like this? Showing too much performance data can almost be as bad as not doing it at all as problems gets drowned out in the noise. For me I have performance of my websites, followed by Nagios problems, followed by the azure status page, followed by memory usage of all my servers and lastly showing number of connections to my databases. Another question to consider is what time scales do you want to graph over, too long and you don’t see what is happening now, but too short and you may only worry about an intermittent issue?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Networking Event</title>
      <link>https://www.funkysi1701.com/posts/2015/networking-event/</link>
      <pubDate>Sun, 22 Mar 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/networking-event/</guid>
      <description>&lt;p&gt;I recently went to an event called ITBoss organised by &lt;a href=&#34;http://www.corecomconsulting.co.uk/blog/archive?tag=276&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Core Com Consulting&lt;/a&gt;
. It was really good, helped partly by a free bar and great food.&lt;/p&gt;
&lt;p&gt;The event was hosted in a pub in central Leeds, so I rushed to the train station from work to get there. And yes I was the first to arrive (Why do I always do that?). The event was targeted at IT Leaders and Managers and was limited to about 20 people.&lt;/p&gt;
&lt;p&gt;To begin with I just chatted to the hosts and other people as we waited for everyone to arrive. Once we got going we had a short presentation about the need for Strategy. Interestingly the next day I suggested a strategy meeting with my director, so something must have sunk in from this.&lt;/p&gt;
&lt;p&gt;The main gist of the talk was that IT leaders need to pop there head up from day to day work to look at where they are going, and this should be matched with the overall direction of the company. I agree with this, recently I have been thinking of what direction our infrastructure needs to go in, it is currently just in my head, but at least that is a start. However our company directors are poor at sharing their long term vision, so it is hard for me to know where the company is going. I need to step up and challenge this behavior, so I can deliver the changes that are needed. Not easy but that is what the best IT leaders are doing.&lt;/p&gt;
&lt;p&gt;After this we broke for food, which was very nice. I had a chat with a couple of people. I found it interesting that one gentleman was surprised that I wanted to get into development. I think I understand why, most of the people in the room where senior managers, while I share their job titles, I don’t share their salaries. He saw development as a demotion, I see it as a promotion.&lt;/p&gt;
&lt;p&gt;After food we had some discussion questions. Mine was the first, How to convince others of the need for change? Some interesting ideas where presented, but it is the need to work closely with others, find out their requirements which is the difficult part not anything technical. The other topics of discussion where relating to recruiting people with skills that you have no knowledge of and around the topic of security and privacy in this modern age. Both were very interesting with lots of viewpoints expressed.&lt;/p&gt;
&lt;p&gt;I enjoyed the evening and hope to go to another at some point. Previous events I have been to have been technical, but lacked the networking that this one had. While I am not very good at networking, at this event it was easy to have a conversation or two with people.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Source Control Fail</title>
      <link>https://www.funkysi1701.com/posts/2015/source-control-fail/</link>
      <pubDate>Mon, 16 Mar 2015 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/source-control-fail/</guid>
      <description>&lt;p&gt;Every developer uses source control, it is a great tool for keeping track of changes to your code, seeing who has done what.&lt;/p&gt;
&lt;p&gt;However I keep messing up, my use of it. I am fairly disciplined when creating new features, all my changes will get committed to source control and when I am happy I will deploy these changes to the live system. But as soon as there is a bug, especially one where the client is chasing for a fix, I will deploy a fix as soon as humanly possible on to the live system.&lt;/p&gt;
&lt;p&gt;At first glance there is nothing wrong with what I have described but what happens the next time I deploy a new feature. Yes the bug the client was complaining about gets deployed with the new feature as the fix was never committed into source control. The client gets angry as the bug he was screaming about is back again.&lt;/p&gt;
&lt;p&gt;Every change you make to the system &lt;strong&gt;MUST&lt;/strong&gt; be committed to source control. If it isn’t that change will look like it never existed. I have worked with source control for over 5 years why do I keep making this rookie mistake over and over.&lt;/p&gt;
&lt;p&gt;Troy Hunt has a &lt;a href=&#34;http://www.troyhunt.com/2011/05/10-commandments-of-good-source-control.html&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;blog post&lt;/a&gt;
 about the 10 commandments of using source control. His number two commandment is “If it’s not in source control, it doesn’t exist” He talks more about code you have written being not saved into source control, but the principal is the same for my example as his.&lt;/p&gt;
&lt;p&gt;There are ways to automatically deploy from source control, however most of the time you don’t want your live database being rebuilt because you fixed a typo. Additional steps will need to be implemented and there is still the chance that you might want to bypass these steps to fix the urgent problem. The only way past this problem is for you and everyone on your team to be disciplined and only ever commit to source control first, and only after that deploy live (either automatically or manually)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Azure Traffic Manager</title>
      <link>https://www.funkysi1701.com/posts/2015/azure-traffic-manager/</link>
      <pubDate>Thu, 12 Mar 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/azure-traffic-manager/</guid>
      <description>&lt;p&gt;I have spent most of the day tweaking my Azure websites. Lots of fun!&lt;/p&gt;
&lt;p&gt;Last week unfortunately Azure had some problems and many websites that were running in the North Europe data centre were unavailable for several hours. And you guessed it my websites were hosted here.&lt;/p&gt;
&lt;p&gt;All hosting providers are going to have downtime from time to time and this is just something you have to take on the chin. The important thing to do in times like these is communicate with your customers about what is going on and that you are doing everything you can to restore service.&lt;/p&gt;
&lt;p&gt;However Azure has some amazing features that you can configure to help manage when downtime occurs.&lt;/p&gt;
&lt;p&gt;Azure is Microsoft’s global cloud platform. And it really is global, there are data centres in North Europe, West Europe, Brazil, Japan, two more in Asia and five in the US. In the event of problems it is highly unlikely that more than one of these would go down at once. If all of these are unavailable, I expect the planet earth is facing some kind of cataclysmic event and the fact that my website is down is not a priority.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/03/IC750592.jpg&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;IC750592&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/03/IC750592.jpg?resize=662%2C347&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/a&gt;
To take advantage of these multiple data centres, Azure has something called a Traffic Manager.&lt;/p&gt;
&lt;p&gt;Traffic Manager has various settings but I am using it in failover mode. This means that if one website goes down, the next one is used.&lt;/p&gt;
&lt;p&gt;All you need to do is create a traffic manager, add two or more websites to it (called endpoints) and choose a page that needs to be monitored so Azure knows which websites are up and which are down.&lt;/p&gt;
&lt;p&gt;If you are using SSL or custom domain names, there are a few extra steps you need to do. Your custom domain name needs pointing at the traffic manager, not the individual websites. The websites themselves have three domain names, the traffic manager address, the azure address and the custom domain name. The SSL certificate can then be assigned to each website that you have added to the traffic manager.&lt;/p&gt;
&lt;p&gt;That was easy wasn’t it, and now if a website goes down traffic manager will use the next one. While testing this, the transition to the next website was almost immediate. I did notice that if you had a browser showing the website open during a problem you sometimes got an error page, I think this was probably due to browser caching, reopening a tab or browser fixed this issue.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Tidying my desktop</title>
      <link>https://www.funkysi1701.com/posts/2015/tidying-my-desktop/</link>
      <pubDate>Wed, 11 Mar 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/tidying-my-desktop/</guid>
      <description>&lt;p&gt;My desktop is always a mess. I constantly download files there and forget all about them.&lt;/p&gt;
&lt;p&gt;Every now and then I copy files into sub directories, so my desktop looks sane for a day or two before it gets out of control again.&lt;/p&gt;
&lt;p&gt;Why don’t I write a script that I can schedule to do this for me. Then my desktop will always be tidy.&lt;/p&gt;
&lt;p&gt;I have written a few simple batch scripts, but of course the best scripting language out there at the moment is PowerShell. Lets use that.&lt;/p&gt;
&lt;p&gt;Windows provides a nice little utility for writing scripts called the Windows PowerShell ISE, so let&amp;rsquo;s start by loading that up.&lt;/p&gt;
&lt;p&gt;PS has lots of help included to help you, just run &lt;strong&gt;Get-Help [name of ps command]&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To move files you can use &lt;strong&gt;Move-Item&lt;/strong&gt; which works very similar to copy, specify source and destination. In my case I moved files based on their file extension.&lt;/p&gt;
&lt;p&gt;Move-Item *.pdf folder&lt;/p&gt;
&lt;p&gt;Now all I need to do is schedule this script to run either every day or so, or maybe every time I login or switch my computer on.&lt;/p&gt;
&lt;p&gt;PowerShell can do lots more interesting things which hopefully I will blog about soon.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Database Deployment</title>
      <link>https://www.funkysi1701.com/posts/2015/database-deployment/</link>
      <pubDate>Thu, 05 Mar 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/database-deployment/</guid>
      <description>&lt;p&gt;One of my jobs is adding extra features to our internal databases. There is a fair amount of risk in doing this. I could make a change to one of the queries in the database that stops the rest of the company using it as they need to. This could be a costly mistake, almost as bad as the database server being inaccessible.&lt;/p&gt;
&lt;p&gt;One way to reduce this risk is to test, test and test the database. First I take a backup of the database and make my changes to that. I can do anything I like to my backup database without worrying that it will affect anyone else. Once I have finished making my changes and I have tested that everything is working exactly as I want, I need to apply my changes to the production database.&lt;/p&gt;
&lt;p&gt;Until recently I made a note of every change that I have made and then made the same change to the production database. But what if I forget to apply one of my changes to production, I have a broken database on my hands, disaster!&lt;/p&gt;
&lt;p&gt;But there is a better way to track database changes. SSDT or SQL Server Data Tools.&lt;/p&gt;
&lt;p&gt;Create a Database project with Visual Studio, you can then point this at your live database. This will scan the database and save scripts for all the Tables, Views, Stored Procedures, Triggers and any other object in the database. This doesn’t import the data, just the structures that contain the data. So no data protection issues or problems because your database is terabytes in size.&lt;/p&gt;
&lt;p&gt;Now comes the really cool part, Visual Studio allows you to build a copy of the database from these scripts. All you need to do is edit the scripts and test like you did before. Once you are happy with your changes and everything is working as you want, you can point your visual studio project back at your production database and it will magically deploy all your changes, or if you are as paranoid as me about breaking things, it will create a script that you can thoroughly analyse before running on your production database.&lt;/p&gt;
&lt;p&gt;I do not know why I never thought of setting this up until recently, it will reduce the number of times I roll out my changes but forget to setup permissions, (these can be scripted) or forget that tiny change I did weeks ago but never rolled out.&lt;/p&gt;
&lt;p&gt;And of course all the changes that you make can be saved in source control, so easy to see what changes have been made and by whom.&lt;/p&gt;
&lt;p&gt;This process even works with complicated database structures, in my case I needed to setup three database projects that depend on each other. Dependencies can be setup, and the test databases can even be built with different names for testing on the production server, (although I wouldn’t recommend it!)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>He’s really not dead as long as we remember him – Leonard Nimoy</title>
      <link>https://www.funkysi1701.com/posts/2015/hes-really-not-dead-as-long-as-we-remember-him/</link>
      <pubDate>Sat, 28 Feb 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/hes-really-not-dead-as-long-as-we-remember-him/</guid>
      <description>&lt;p&gt;n the film Star Trek 2: The Wrath of Khan Spock sacrifices himself to save the Enterprise from destruction. What follows is a very moving funeral scene and his coffin is launched into space. McCoy tells Kirk that he is not dead as long as we remember him.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/02/Spock_2293.jpg?resize=300%2C227&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Yesterday the actor Leonard Nimoy passed away and millions of trekkies around the world are taking comfort in those words.&lt;/p&gt;
&lt;p&gt;Reading social media it is clear that he affected the lives of millions of people with his portrayal of Spock. I have seen tweets from NASA and astronauts saying how they were encouraged by Star Trek. The chip manufacturer Intel even tweeted about his death. I am sure there are many in the science and technology space that could say Mr Spock encouraged them in some way.&lt;/p&gt;
&lt;p&gt;The portrayal of science and technology in Star Trek had an affect on me. I studied Mathematics, Chemistry and Physics at school, I later did a Physics degree. All because the spark of curiosity about how stuff works was encouraged by a TV show. I remember one time while studying physics learning about the hysteresis curve, then Star Trek the next day mentions detecting changes in the hysteresis curve might solve some problem. Wow the stuff I am learning is in Star Trek!&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/02/color_nimoy_headshot.jpg?resize=236%2C300&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Later in my life I got involved in working with computers, and as science officer Mr Spock was the first expert in computers I knew.&lt;/p&gt;
&lt;p&gt;But Mr Spock was half Vulcan and suppressed his emotions. There have been times in my life where I have tried really hard to suppress my emotions. I can think of a time when a family member has died and I needed to shut myself in a room, similar to Spock in Naked Time, and wrestle with my emotions. In recent years I have had a more Data approach of exploring my feelings and my humanity as a Vulcan lifestyle of suppressed emotion is not healthy.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/02/74cc28416b646ae6f87d5a502fbd03b7.jpg?w=500&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Thank you Leonard Nimoy for all that you gave us, although I never met you I can continue to watch and enjoy your work, Live Long and Prosper.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Source Code for Game of Life</title>
      <link>https://www.funkysi1701.com/posts/2015/source-code-for-game-of-life/</link>
      <pubDate>Sat, 21 Feb 2015 09:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/source-code-for-game-of-life/</guid>
      <description>&lt;p&gt;Last week I blogged about the Game of Life.&lt;/p&gt;
&lt;p&gt;Well it took some searching through dead hard drives and old USB storage but I found the program I wrote, and better than that I have figured out how to turn it back into source code.&lt;/p&gt;
&lt;p&gt;The file date is November 2004 and the source code has no comments so I don’t know what was going through my head when I wrote it, or even what some of it does.&lt;/p&gt;
&lt;p&gt;To view the source code download &lt;a href=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/02/Life.src_.zip&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Life.src&lt;/a&gt;
, to download the finished program download &lt;a href=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/02/Life.zip&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Life&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;Life&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/02/Life.jpg&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;I am actually surprised I was expected the code to be much worse than it was, I am not saying it is good, but I can see more than one method and I can’t see any code that obviously is repeated. I can see some terrible variable names. Note to future self don’t use tmp676_674!&lt;/p&gt;
&lt;p&gt;Assuming that I wrote this in 2004 what would  I have been doing then? It was before I started working in IT. (Hard to imagine I know!) It may even have been before I started living with Keith, before he recruited me for my first IT role. I think I was probably working as an administrator for Defra at this point.&lt;/p&gt;
&lt;p&gt;If we put 2004 in technical terms, it was before I joined facebook, Office 2003 and XP would have been installed on my PC, and probably felt brand new.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Cloud Computing</title>
      <link>https://www.funkysi1701.com/posts/2015/cloud-computing/</link>
      <pubDate>Thu, 19 Feb 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/cloud-computing/</guid>
      <description>&lt;p&gt;I work for a company that provides a cloud computing website, but what is Cloud Computing?&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Cloud_computing&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Wikipedia&lt;/a&gt;
 defines it as “Cloud computing involves deploying groups of remote servers and software networks that allow centralized data storage and online access to computer services or resources.”&lt;/p&gt;
&lt;p&gt;Erm. What does that mean? Well in simple terms it means storing you data on a remote server. Any time you submit information onto a website, you are submitting your information to the “Cloud”&lt;/p&gt;
&lt;p&gt;But there is more that the Cloud can do for you. The search giant Google, which also develops the android mobile phone operating system, have developed a range of cloud computing products. The Google Drive product allows you to upload and even create files, these files are saved into the Cloud, once in the cloud they can be accessed from any device that has an internet connection. No longer do you run the risk of your favourite file being on a computer that won’t turn on or being on a dead hard drive, save it to the cloud and you will always have access to it.&lt;/p&gt;
&lt;p&gt;Google isn’t the only one that does this, Microsoft have OneDrive which they are incorporating into the heart of their operating system, Apple and many other companies have released similar products.&lt;/p&gt;
&lt;p&gt;This age of cloud computing allows a clearer separation between your data and your device. It won’t be long before whatever device you are using your files will be there to be worked on. You are in the office working on a spreadsheet, you save it to the Cloud, you can then continue working on it with your tablet while on the road. Just before bed you want to check if you added something to that doc, so you quickly check your phone. How cool is this!&lt;/p&gt;
&lt;p&gt;But if I put my system administer hat on, Cloud computing goes far further than that. Microsoft Azure allows many of the services you would typically have running on your server, saved into the cloud. This has many advantages and allows you to concentrate on other problems while leaving the cloud to look after these services.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Choosing a Blog Theme</title>
      <link>https://www.funkysi1701.com/posts/2015/blog-theme/</link>
      <pubDate>Sun, 15 Feb 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/blog-theme/</guid>
      <description>&lt;p&gt;You may have noticed that my blog has a new home. It can now be found on its own domain &lt;a href=&#34;http://www.funkysi1701.com&#34;&gt;http://www.funkysi1701.com&lt;/a&gt;
. This change not only gives me more flexibility to make any change I like, it also feels good to have a website again. If you had followed my blog, do keep following it at the new location.&lt;/p&gt;
&lt;p&gt;I have also been playing about with giving the site a new look, hope you all like it. I have gone for a more image focussed front page. No doubt in a few weeks I will be bored and change the look again.&lt;/p&gt;
&lt;p&gt;I have recently been reading about blogging and one suggestion is to have a clear theme, or idea of what the blog is about. I am not sure my blog has a clear theme.&lt;/p&gt;
&lt;p&gt;When I started blogging I was more interested in blogging than thinking about what I was blogging about. The vague theme I worked off was to talk about what I do, to answer the question, &amp;ldquo;What do you do?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I think this is a fairly good theme, but it could probably do with some refinement. The best themed blogs are specialist or about something specific. As I am generally learning about development, rather than doing development I think this should be part of what I concentrate my blogs about. A minority of my blogs can continue to be about the other things I spend my time doing, as it’s always good to have a break from the main “meat” of the blog every now and then.&lt;/p&gt;
&lt;p&gt;The people who read my blogs are split between technical people and non-technical people, so I would like to continue to explain what I do in non-technical terms. This is an essential skill for a developer (or SysAdmin) as you will always need to explain what you are doing, or discuss requirements. It is not an easy skill and like development itself, the more I do it the better at it I will become.&lt;/p&gt;
&lt;p&gt;So watch this space for the blogs to come. I know I will be working with Azure over the next few weeks so maybe some blogs about that, maybe some more SQL blogs or maybe about what I learn next.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Ten Forward Episode #135 – Anti Firbob is Back or Simon’s Desert Island Trek</title>
      <link>https://www.funkysi1701.com/posts/2015/ten-forward-episode-135-anti-firbob-is-back-or-simons-desert-island-trek/</link>
      <pubDate>Fri, 13 Feb 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/ten-forward-episode-135-anti-firbob-is-back-or-simons-desert-island-trek/</guid>
      <description>&lt;p&gt;The podcast I recorded the other week has been released, why not have a listen by heading over to &lt;a href=&#34;http://www.trekmate.org.uk/ten-forward-episode-135-anti-firbob-is-back-or-simons-desert-island-trek/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;trekmate.org.uk&lt;/a&gt;
 and comment on their forums&lt;/p&gt;
&lt;p&gt;This week Sina, Chris and Paul welcome Simon Foster, Trek Mate’s News Editor, to do discuss his Desert Island Trek choices.  Paul becomes Firbob, or AntiFirbob, or&amp;hellip;something like that.  Boo hiss Firbob.  Every one listen and decide – Simon or Firbob?&lt;/p&gt;
&lt;p&gt;You can reach Simon here:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/funkysi1701&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;@funkysi1701&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Complaints to @firbob1&lt;/p&gt;
&lt;p&gt;You can reach the rest of the gang here:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/queenkatblue&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;@queenkatblue&lt;/a&gt;
, &lt;a href=&#34;https://twitter.com/chriscantfly&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;@chriscantfly&lt;/a&gt;
, or &lt;a href=&#34;https://www.facebook.com/TenForwardPod&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;facebook.com/TenForwardPod&lt;/a&gt;
&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Game of Life</title>
      <link>https://www.funkysi1701.com/posts/2015/game-of-life/</link>
      <pubDate>Wed, 11 Feb 2015 09:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/game-of-life/</guid>
      <description>&lt;p&gt;Many, many years ago I tried to learn Java. I didn’t get very far but one of the things I built was The Game of Life.&lt;/p&gt;
&lt;p&gt;Unfortunately I can not find the code I wrote, probably a good things as it is probably amusingly bad.&lt;/p&gt;
&lt;p&gt;Now you are probably asking what is the &lt;a href=&#34;https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Game of Life&lt;/a&gt;
? The game of life, sometimes called cellular automation, is a simulation of cells being born and dying. It is sometimes called Conway’s Game of Life after the British mathematician who devised it in 1970.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://www.funkysi1701.com/images/Gospers_glider_gun.gif&#34; loading=&#34;lazy&#34;
   width=&#34;250&#34; height=&#34;180&#34;
   /&gt;

&lt;/p&gt;
&lt;p&gt;The game has several rules:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Any cell with less than three neighbours will die on the next turn&lt;/li&gt;
&lt;li&gt;Any cell with three neighbours lives on to the next turn&lt;/li&gt;
&lt;li&gt;Any cell with more than three neighbours will die on the next turn&lt;/li&gt;
&lt;li&gt;Any dead cell with three live neighbours will be born on the next turn&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now I had not thought about this game until the other day when I came across a &lt;a href=&#34;https://chaosnil.wordpress.com/2015/02/09/new-project-conways-game-of-life-in-every-language/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;blog&lt;/a&gt;
 and a &lt;a href=&#34;https://github.com/chaomodus/gameoflife&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;github page&lt;/a&gt;
 which sparked my interest again. This version is written in javascript, but the blog mentions a desire to build this program in many different languages. I want to build this with visual studio in C# as it should provide a good training exercise.&lt;/p&gt;
&lt;p&gt;There are several problems I need to overcome to achieve this, I am currently trying to work out how to &amp;ldquo;draw&amp;rdquo; the cells. My current thinking is that maybe I can code it using characters to display the cells and then replace with pixels once I have the logic correct. Well lots for me to learn!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Great British Code Off</title>
      <link>https://www.funkysi1701.com/posts/2015/great-british-code-off/</link>
      <pubDate>Sat, 07 Feb 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/great-british-code-off/</guid>
      <description>&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;Great British Code Off&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/02/logo.jpg&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;The Great British Bake Off and The Great British Sewing Bee are very popular TV shows. Each week the contestants take part in a baking or sewing challenge and the judges choose the best and the worst, with the worst having to leave. This is very entertaining as you watch the drama between the contestants and the reactions as the judges tell them they are rubbish.&lt;/p&gt;
&lt;p&gt;Could this simple format be applied to computer programming? I think it could.&lt;/p&gt;
&lt;p&gt;The only developers I know argue about the best way of tackling different problems, despite being friends. I am going to assume that this is typical behaviour and not unique to them. So for this TV show, we will split the contestants into pairs, that way we would get the added drama of how well they work together.&lt;/p&gt;
&lt;p&gt;I am still undecided if the pairs stick together each week with one pair leaving or if we randomize the pairs with one person leaves. The second option would cause there to be a group of three every other week, not sure if this would be a benefit or a curse for that group.&lt;/p&gt;
&lt;p&gt;My friends who are experienced programmers have agreed to be the judges, they both have experience of hiring and firing people, know what to look for in good code, and never agree so should be entertaining enough.&lt;/p&gt;
&lt;p&gt;On the bake off the contestants don’t really know how well they have done until the judges cut into their cake and take a bite. For the code off we could not compile the code until the judges run it, would make coding extra difficult as if the contestants are anything like me, I run my code every five minutes to see what affect that change has made.&lt;/p&gt;
&lt;p&gt;So what challenges can we come up with?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Web Design week&lt;/li&gt;
&lt;li&gt;Stored Procedure week&lt;/li&gt;
&lt;li&gt;Mobile App week&lt;/li&gt;
&lt;li&gt;Loops&lt;/li&gt;
&lt;li&gt;Logic problems&lt;/li&gt;
&lt;li&gt;Bugs weeks&lt;/li&gt;
&lt;li&gt;Performance issues&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I think we are onto a winner here. What does everyone else think?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Laziness</title>
      <link>https://www.funkysi1701.com/posts/2015/laziness/</link>
      <pubDate>Wed, 04 Feb 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/laziness/</guid>
      <description>&lt;p&gt;I am lazy, I won’t try and deny that. When my alarm goes off in the morning, I will snooze it for twenty minutes or so before getting out of bed.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/02/bill-gates-quote.jpg&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;In my work my laziness continues. Remote Desktop (or RDP) is probably my number one laziness tool. For those that don’t know RDP allows you to connect to another computer and access it like you were sat in front of it. So I can be sat at my desk and RDP into any other computer in the office including any server. However this laziness tool does sometimes require a bit of effort sometimes, powering on the target computer, logging on locally, making sure the user account you are using is allowed to use RDP.&lt;/p&gt;
&lt;p&gt;Writing a script is another example of a laziness tool. I often get asked to do tedious and long-winded task, because I am lazy I will go out of my way to learn how to write a script to do this, so that I can run this script and do this long-winded task in a matter of seconds. There are loads of different types of scripts from database SQL scripts, to PowerShell scripts that can do almost anything on your server.&lt;/p&gt;
&lt;p&gt;PowerShell is something Microsoft are really pushing at the moment, you can even write scripts to create new user accounts, so no longer will you have to remember to tick that tickbox for every new user account. And because PowerShell is part of almost all MS technologies you can link Exchange to Active Directory and you don’t even have to remember the right syntax as PowerShell has a built-in help command to tell you how to run that useful command.&lt;/p&gt;
&lt;p&gt;As I am now moving into a more developer role can I continue to be lazy? I sure can. Code should be written once and reused as often as possible and this is one of the features of OOP (Object Oriented Programming).&lt;/p&gt;
&lt;p&gt;It can be as simple as creating a master page so you don’t need to recreate the same code on every one of your webpages. Or every time you find yourself rewriting the same code again, you plug it into a method so it can be called again and again.&lt;/p&gt;
&lt;p&gt;But of course the ultimate way to be lazy is of course get yourself some staff and spend all day getting them to do everything. If you are lucky they may even try and adopt some of these lazy ideas.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Podcasts</title>
      <link>https://www.funkysi1701.com/posts/2015/podcasts/</link>
      <pubDate>Tue, 27 Jan 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/podcasts/</guid>
      <description>&lt;p&gt;For a while now I have been listening to podcasts. For those that don’t know a podcast is an audio file that you can download and listen to, usually about a topic you are interested in. The topics that interest me are obviously Star Trek, Science and Technology and IT stuff. I mainly listen to them in the car when I am driving, but sometimes it will be at home when doing jobs around the house.&lt;/p&gt;
&lt;p&gt;I think the first podcast I listened to was &lt;a href=&#34;http://www.trekmate.org.uk/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Trekmate&lt;/a&gt;
. Trekmate as the name suggests is about Star Trek, it’s a few guys talking about Star Trek. It’s very similar to those conversations you have in the pub with your mates. Trekmate do lots of podcasts, one for almost every flavour of Star Trek out there, I don’t keep up with all of them, but the ones I listen to I really enjoy.&lt;/p&gt;
&lt;p&gt;My favourite podcast that is work related is &lt;a href=&#34;http://www.runasradio.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;RunAs Radio&lt;/a&gt;
. If you are a SysAdmin or have an interest in servers or IT you should listen to this. The host Richard Campbell interviews IT experts about a particular piece of technology, one week it will be Exchange, the next Security, and then SQL Server. Often I will learn something that I will want to try out, some weeks I won’t learn something specific but will give be an insight into which way IT for businesses is going. I think it was probably only after listening to RunAs Radio that are started having more of a long term plan for my IT infrastructure at work.&lt;/p&gt;
&lt;p&gt;As I have blogged about before I am learning Development so obviously I listen to &lt;a href=&#34;http://www.dotnetrocks.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;.NET Rocks&lt;/a&gt;
. This is hosted by Carl Franklin and Richard Campbell (yes the same guy that does RunAs Radio) who talk to developers about code, learning and IT from a more Developer point of view. This is released 3 times a week so is a bit hit and miss sometimes, but most weeks there will be something relevant to me or worth listening to.&lt;/p&gt;
&lt;p&gt;A few days ago I did something for the first time, I was a guest on one of the Trekmate pods, TenForward. I reviewed 5 Star Trek episodes. This was a bit of a leap for me as an introvert I don’t like to be the center of attention and I certainly don’t like how my voice sounds recorded. Hopefully when released people will like it and I will do lots more of these in the future. Once it has been released I will put a link up here so you can all have a listen.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Pair Programming</title>
      <link>https://www.funkysi1701.com/posts/2015/pair-programming/</link>
      <pubDate>Mon, 19 Jan 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/pair-programming/</guid>
      <description>&lt;p&gt;So I have been working through the challenges on the &lt;a href=&#34;http://www.freecodecamp.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;freecodecamp&lt;/a&gt;
 website and one of the unique things that this site does is give you the chance to program with another person.&lt;/p&gt;
&lt;p&gt;I am an introvert and if you were to ask me to pick up the phone and ring someone I will procrastinate a lot before doing it (if I do it at all), I also am not good at speaking with strangers but I have been enjoying the pair programming I have done so far.&lt;/p&gt;
&lt;p&gt;I have only pair programmed a couple of times so far, so I am no expert. The first time was with someone from North America, it was weird to begin with talking to your computer and hearing an american voice respond, but you soon forget that as you concentrate on the problems you are working on.&lt;/p&gt;
&lt;p&gt;The second time was with someone from the Netherlands. This time we tackled some trickier problems. Both times I took more of a back seat but I think contributed useful stuff and I certainly learnt a lot from the other person.&lt;/p&gt;
&lt;p&gt;I think that is the key thing about pair programming, you learn so much about how to look at a problem from another angle, or learn about a function you haven’t heard of before. If you are reading this and it was you that I pair programmed with a big thank you for spending the time with me, I learnt a lot.&lt;/p&gt;
&lt;p&gt;I was trying to pair program again tonight but technical problems prevented me. One problem I have found is finding a partner, was hoping to do some yesterday but no one else was around to partner with.&lt;/p&gt;
&lt;p&gt;I would be interested to learn what companies use pair programming. I imagine a pointy haired boss would say why pay two people to do one job, when you could get them working on different things. However if you want to build up your team and give them loads more skills then pair programming would be great. I also think there are probably some problems that are crying out for pair programming.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Javascript progress</title>
      <link>https://www.funkysi1701.com/posts/2015/javascript-progress/</link>
      <pubDate>Fri, 16 Jan 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/javascript-progress/</guid>
      <description>&lt;p&gt;I got excited earlier this week as I started playing around with the javascript I have been learning.&lt;/p&gt;
&lt;p&gt;I thought I would try and create useful javascript that could be applied to an online filestore. Somewhere that you could upload, delete, edit files and folders and various options to do with your files would popup via javascript or jquery code.&lt;/p&gt;
&lt;p&gt;So far I have created a static HTML page which lists a few dummy files. I have added a button which adds a new row into my table and I have used jquery to highlight any selected files and also when the mouse passes over.&lt;/p&gt;
&lt;p&gt;If you want to follow my progress I have put my files on &lt;a href=&#34;https://github.com/funkysi1701/CodeSamples/tree/master/clouds-js&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;github&lt;/a&gt;
. It’s very basic stuff and I have already got a few lines I would like to refactor but not bad for an evenings work. I have lots of feature ideas to add to this page which should help me learn the basics.&lt;/p&gt;
&lt;p&gt;The trouble with learning all this javascript is that I am starting to get all my programming languages confused. Earlier this week I started writing a for loop in javascript, only problem was I was working on an MS Access ADP (Don’t ask!) which requires the code in VBA. That is never going to work. Oh well.&lt;/p&gt;
&lt;p&gt;If anyone knows good ways to stop myself getting my programming languages all confused do let me know.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Hello World!</title>
      <link>https://www.funkysi1701.com/posts/2015/hello-world-2/</link>
      <pubDate>Sat, 10 Jan 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/hello-world-2/</guid>
      <description>&lt;p&gt;The first program anyone writes in a new language is often really simple and just displays the text “Hello World!”, below are a few examples from languages I have knowledge of.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-C#&#34; data-lang=&#34;C#&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Console.WriteLine(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hello, world!&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-HTML&#34; data-lang=&#34;HTML&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;html&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;head&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;head&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;body&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;p&lt;/span&gt;&amp;gt;Hello, world!&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;body&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;html&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-PHP&#34; data-lang=&#34;PHP&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;php&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Hello, world!&amp;#39;&lt;/span&gt;; &lt;span style=&#34;color:#75715e&#34;&gt;?&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;MsgBox(&amp;#34;Hello, World!&amp;#34;)
&lt;/code&gt;&lt;/pre&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-SQL&#34; data-lang=&#34;SQL&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Hello, world!&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Or maybe&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-SQL&#34; data-lang=&#34;SQL&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;table&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;WHERE&lt;/span&gt; name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Hello World!&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-PowerShell&#34; data-lang=&#34;PowerShell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Hello, world!&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-JavaScript&#34; data-lang=&#34;JavaScript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;console&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Hello, world!&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-BASIC&#34; data-lang=&#34;BASIC&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;PRINT&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hello, world!&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Turns out I know quite a few programming languages. And yes there have been times where I need to stop and think about which language I am writing in.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>My Year of Code</title>
      <link>https://www.funkysi1701.com/posts/2015/my-year-of-code/</link>
      <pubDate>Fri, 09 Jan 2015 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2015/my-year-of-code/</guid>
      <description>&lt;p&gt;There is no escaping the fact that we are in 2015 now. My new years resolution is to do more coding.&lt;/p&gt;
&lt;p&gt;Over Christmas I thought I would have a go at &lt;a href=&#34;http://www.codecademy.com&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;http://www.codecademy.com&lt;/a&gt;
 I completed the javascript course and I was just wondering what I should try next when I saw a tweet about &lt;a href=&#34;http://www.freecodecamp.com&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;http://www.freecodecamp.com&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Since then I have been addicted to doing the exercises that they have, almost everyday I have made a bit of progress.&lt;/p&gt;
&lt;p&gt;But this site is not just about teaching you how to code, it has an active forum where you can ask questions and understand more about what it takes to become a developer.&lt;/p&gt;
&lt;p&gt;Before I started these exercises I didn’t know much javascript or jquery but I am starting to learn quite a few commands that hopefully I can put into use at some point. Whatever development I end up doing I am sure I am going to need javascript at some point.&lt;/p&gt;
&lt;p&gt;One of the tips I have learnt is that you need to practise daily. Did you ever use flash cards to help pass exams? Well there is an electronic version of them now called Anki. Just add a question/answer pair to your deck of cards and review them each day, the ones you find difficult you review more often than the ones you have learnt.&lt;/p&gt;
&lt;p&gt;Hopefully I can keep this up and later in the year I will be well on way to writing lots of useful code.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Looking back at 2014</title>
      <link>https://www.funkysi1701.com/posts/2014/looking-back-at-2014/</link>
      <pubDate>Wed, 31 Dec 2014 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2014/looking-back-at-2014/</guid>
      <description>&lt;p&gt;As today is New Years eve I thought it would be a good chance to look back over the last year.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2014/12/tangle.jpg?resize=300%2C256&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;At the start of the year I finally got agreement for the installation of a 30MB leased line. This was an amazing achievement as I had been really struggling to keep everything working on our ADSL connections and the complexity of the connections was starting to cause problems itself.&lt;/p&gt;
&lt;p&gt;However it was not a smooth process, the site survey revealed a substantial installation cost would be required, however the Council was about to launch a voucher scheme that would give us £3000 off. So most of this was just waiting around for the Council to get things going. By April we had it installed and I have been very happy with the ISP we chose, York Data Service (YDS).&lt;/p&gt;
&lt;p&gt;Also during April this year was the end of support for Windows XP and Office 2003. This didn’t impact us too much, mostly due to my constant nagging of the directors to replace our oldest machines. We now only have a couple of machines still running XP and no machines running Office 2003. Most machines are now running Windows 7, I have one Director running Windows 8 for presentations and a few surveyor tablets running windows 8 as well. Like many businesses I am waiting for Windows 10 next year before doing any more substantial replacement of OS.&lt;/p&gt;
&lt;p&gt;In May it was decided that I would move more into development work, so I got a new desktop PC and Visual Studio. I am very happy with my new machine (subject to dell fixing a problem later today) So far I have only dipped my toe into development work, this is largely due to needing more time to build up others to do what I do.&lt;/p&gt;
&lt;p&gt;In June I made another huge achievement. I got agreement for a new server. This was our first Server 2012 server and allowed us to make huge strides towards virtualizing our services. Once we had this server up and running I was able to decommission two of our Windows Server 2003 machines well before it goes out of support next year.&lt;/p&gt;
&lt;p&gt;I am a huge fan of this new server, I have only used a fraction of its memory. Hyper V is really great and I hope to make progress next year into HyperV replication.&lt;/p&gt;
&lt;p&gt;Also during 2014 we made huge progress with our clouds software. Within the last few weeks it is running on the Azure platform which will not only make it far easier to expand and create new features it will provide us with cost savings. I am looking forward to learning more about Azure as I get deeper into development.&lt;/p&gt;
&lt;p&gt;Wow I achieved a lot didn’t I, on top of this I hired a new IT person and trained him up (still more to do), I have also fixed lots of printers, websites, servers (had a server motherboard die!), and made hundreds of changes to our internal databases.&lt;/p&gt;
&lt;p&gt;I don’t know what is in store for 2015. I expect a lots of the same with hopefully more focus on developing in Visual Studio, training myself and my department and getting the last few tweaks into our internal servers.&lt;/p&gt;
&lt;p&gt;I would also like to thank everyone that I have worked with over the last 12 months (you know who you are), as you made a lot of what I have just described possible.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Happy Christmas</title>
      <link>https://www.funkysi1701.com/posts/2014/happy-christmas/</link>
      <pubDate>Wed, 24 Dec 2014 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2014/happy-christmas/</guid>
      <description>&lt;p&gt;I saw this tweet on twitter.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;He’s making a database,
He’s filtering twice
SELECT * FROM customers WHERE behaviour = Nice
Santa Clause is Coming to town.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This started me thinking surely in a normalized database structure behaviour wouldn’t be stored in the customer table, so I propose the following change.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;He’s making a database,
He’s filtering twice
SELECT * FROM customers WHERE EXISTS (select * from behaviour where behaviour.CustomerId = customers.Id and behaviour.Type = Nice)
Santa Clause is Coming to town.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Happy Christmas everyone, hope you all have restful holidays.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Software Developer Quiz</title>
      <link>https://www.funkysi1701.com/posts/2014/software-developer-quiz/</link>
      <pubDate>Fri, 05 Dec 2014 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2014/software-developer-quiz/</guid>
      <description>&lt;p&gt;Moving house, lack of internet and lack of inspiration has caused a lack of posts recently but hopefully more to come. Been doing some filing and found an old software developer quiz. Thought I would have a go.&lt;/p&gt;
&lt;p&gt;Many thanks to &lt;a href=&#34;https://twitter.com/zogface&#34;&gt;Keith&lt;/a&gt; for originally writing the quiz.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Questions:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Write a function that determines if a string starts with an upper-case letter A-Z&lt;/li&gt;
&lt;li&gt;Write a function that determines the area of a circle given the radius&lt;/li&gt;
&lt;li&gt;Add up all the values in an array of integers&lt;/li&gt;
&lt;li&gt;Given a table called &amp;ldquo;Nodes&amp;rdquo; with the following structure and sample data (see below after questions):
…where ID is the primary key,andParentID references ID, complete the following:
&lt;ul&gt;
&lt;li&gt;write a stored procedure to return all nodes beneath a given node ID&lt;/li&gt;
&lt;li&gt;describe how you might write a query to return all nodes at any depth below a given node ID (i.e. recursively)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Write a function to get the prime numbers up to 1,000,000&lt;/li&gt;
&lt;li&gt;You’ve been given the following code to review (below table)– what comments would you give back to the developer?&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;ParentID&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Depth&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;My Documents&lt;/td&gt;
&lt;td&gt;Folder&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;My Pictures&lt;/td&gt;
&lt;td&gt;Folder&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;My CV&lt;/td&gt;
&lt;td&gt;Document&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Photo of me&lt;/td&gt;
&lt;td&gt;Document&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;PROCEDURE&lt;/span&gt; GetNode
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;NodeId INT
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;AS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;DECLARE&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;ID INT, &lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;ParentID INT, &lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;Name NVARCHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;DECLARE&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;Type&lt;/span&gt; NVARCHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt;), &lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;Depth INT
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;ID &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ID &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; Nodes &lt;span style=&#34;color:#66d9ef&#34;&gt;WHERE&lt;/span&gt; ID &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;ID
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;ParentID &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ParentID &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; Nodes &lt;span style=&#34;color:#66d9ef&#34;&gt;where&lt;/span&gt; ID &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;ID
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;IF&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;EXISTS&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; Nodes &lt;span style=&#34;color:#66d9ef&#34;&gt;WHERE&lt;/span&gt; ID &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;ID &lt;span style=&#34;color:#66d9ef&#34;&gt;AND&lt;/span&gt; Name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;Name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;ELSE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;Name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Name &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; Nodes &lt;span style=&#34;color:#66d9ef&#34;&gt;WHERE&lt;/span&gt; ID &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;ID
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;Type&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;Type&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; Nodes &lt;span style=&#34;color:#66d9ef&#34;&gt;WHERE&lt;/span&gt; ID &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;ID
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;Depth &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Depth &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; Nodes &lt;span style=&#34;color:#66d9ef&#34;&gt;WHERE&lt;/span&gt; ID &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;ID
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;ID, &lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;ParentID, &lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;Name, &lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;Type&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;Depth
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;My Answers:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;bool&lt;/span&gt; GetUpper(&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt;.IsUpper(&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt;[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;]))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; AreaOfCircle(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; radius)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; area = &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  area = Math.PI * radius * radius;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; area;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; SumArray()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;[] MyArray = &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;[&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;] { &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;12&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;9&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;18&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;9&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; Sum = MyArray.Sum();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; Sum;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;create&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;procedure&lt;/span&gt; getnodes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;node int
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;select&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;from&lt;/span&gt; dbo.nodes &lt;span style=&#34;color:#66d9ef&#34;&gt;where&lt;/span&gt; parentid &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;node
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For a recursive query I would write something along the lines of, but it would need to be customised depending on the depth, eg more joins for higher depths&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;select&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;from&lt;/span&gt; dbo.nodes n1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;join&lt;/span&gt; dbo.nodes n2 &lt;span style=&#34;color:#66d9ef&#34;&gt;on&lt;/span&gt; n1.id &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; n2.ParentId
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;join&lt;/span&gt; dbo.nodes n3 &lt;span style=&#34;color:#66d9ef&#34;&gt;on&lt;/span&gt; n2.id &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; n3.ParentId
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;where&lt;/span&gt; n1.parentid &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4544054&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; prime()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Console.WriteLine(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Prime: 1&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; i = &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;; i &amp;lt;= &lt;span style=&#34;color:#ae81ff&#34;&gt;1000000&lt;/span&gt;;i++ )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;bool&lt;/span&gt; isprime = &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; j = &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;; j &amp;lt;i; j++)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(i%j==&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        isprime = &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (isprime)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      Console.WriteLine(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Prime: &amp;#34;&lt;/span&gt;+i);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;No Brackets around parameters, @NodeId parameter never used, select @id = id from dbo.nodes where id = @id is pointless as same id that is passed it being set, Name = NULL should be Name is NULL, no from specified in last query. There are probably more issues as well.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>In the Zone</title>
      <link>https://www.funkysi1701.com/posts/2014/in-the-zone/</link>
      <pubDate>Sun, 02 Nov 2014 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2014/in-the-zone/</guid>
      <description>&lt;p&gt;On Friday night I had the urge to fire up Visual Studio and tomorrow (Monday) I move house.&lt;/p&gt;
&lt;p&gt;What’s with that? Why am I in a programming mood when I have boxes to pack and shelves to take apart?&lt;/p&gt;
&lt;p&gt;For the last few weeks I have been too busy with other things to do much programming or when I had the time I felt more like relaxing than learning anything new.&lt;/p&gt;
&lt;p&gt;How do I get into the programming zone, what was it about this particular weekend that made me want to? Was it just the fact I had no time to concentrate on it, or is there some more useful factor that controls my desire to code?&lt;/p&gt;
&lt;p&gt;I can think of a few factors that I should make note of.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Peace and quiet – Friday night I had the place to myself so I could concentrate and do whatever I wanted.&lt;/li&gt;
&lt;li&gt;Ideas – Before I started I had some ideas, why don’t I try doing x. Once I have a coding idea I need to investigate it and see where it goes.&lt;/li&gt;
&lt;li&gt;Break from routine – Friday night was the start of a whole week away from work, this gives me more time to forget about the daily stress of the office and think about other things.&lt;/li&gt;
&lt;li&gt;Goals – Work annoyed me on Friday and if I want to achieve my goal of working in development more then I need to work at it.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I am not sure how I can put these into practise so that I spend more time on development but we will see. One thing I want to achieve in my new home is a quiet place to concentrate and think without distractions, I have a few options which I will investigate over the next few weeks.&lt;/p&gt;
&lt;p&gt;Anyway need to get back to packing boxes.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>If you had £5000 to spend on technology what would you get?</title>
      <link>https://www.funkysi1701.com/posts/2014/if-you-had-5000-to-spend-on-technology-what-would-you-get/</link>
      <pubDate>Sun, 26 Oct 2014 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2014/if-you-had-5000-to-spend-on-technology-what-would-you-get/</guid>
      <description>&lt;p&gt;I listen to the dot net rocks podcast and they ask this question every show. (If you don’t listen then you should!)&lt;/p&gt;
&lt;p&gt;I don’t know what my answer would be as there are so many gadgets and cool things that I like the sound of.&lt;/p&gt;
&lt;p&gt;I might get a surface pro 3, it’s a tablet with attachable keyboard that’s more powerful than my current laptop. But at £600 it’s expensive so maybe not. Maybe instead I would install a SSD into my existing laptop to increase disk performance.&lt;/p&gt;
&lt;p&gt;I’d like a new car with lots of gadgets built-in. A friend gave me a ride in his new BMW and it’s nice. Bluetooth so I don’t have to have an audio cable to listen to podcasts. Parking sensors so no chance the wife will prang it. Built in satnav etc&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2014/10/google-car.png?w=599&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;While we are on the subject of cars eventually I’d like a google self driving car as I think Google is a better driver than me. Think about it I drive to a friends I have a drink I sleep in the back seat as my car drives me home. Once all cars are automated I believe the roads will be much safer.&lt;/p&gt;
&lt;p&gt;The last thing I would spend on is an intensive training course on development, I would really like to get further in dev and more training would really help. Specifically something that would help solve my current dev problems. I am sure it is possible for me to learn dev with self-study but that requires a discipline I don’t think I have, I easily eat my time up with my current job, wife and other interests.&lt;/p&gt;
&lt;p&gt;I recently had £6500 to spend on improving my employers IT infrastructure. That was really hard. It sounds like a lot of money, but it really isn’t.&lt;/p&gt;
&lt;p&gt;Once I started looking at the problems that I wanted to solve and what hardware I wanted I quickly used it all up and that was before I factored in license and software costs. In the end I just had to order what I wanted and hope that on a future date I could spend on other areas. I got a super powerful server that I could virtualize almost all our existing physical servers with it I needed licences, which left me just enough to get a NAS for file storage.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interview questions</title>
      <link>https://www.funkysi1701.com/posts/2014/interview-questions/</link>
      <pubDate>Thu, 23 Oct 2014 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2014/interview-questions/</guid>
      <description>&lt;p&gt;I have done a few interviews from both sides of the table, I’m not very good at either but thought I would have a go at answering my favourite questions.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2014/10/how-not-to-ace-the-technical-interview.jpg?w=550&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Describe an IT disaster and what you did to turn it around?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The question is all about the turn it around bit. I’ve had lots of answers that emphasise the problem rather than what the candidate did to turn things around.&lt;/p&gt;
&lt;p&gt;My answer would be: on a Saturday I was rearranging the server room and when I came to turn on our main file server and pdc it wouldn’t boot. My plans for the weekend went out the window it was all about getting this server back up. I tried the usual unplug everything and reconnect still nothing. I rang a friend to get a second opinion and between the two of us we formulated a plan of action. I then rang my director to tell her that I was having problems and what I was going to try. (keeping people informed is an essential skill)&lt;/p&gt;
&lt;p&gt;So the server in question was getting power but nothing was happening during boot. The motherboard had died. What I needed to do was connect the raid card to another server so I could copy the data from it to our Nas drive (luckily I had an upgrade plan and this failure had just accelerated it)&lt;/p&gt;
&lt;p&gt;A few hours later the data was copying and I could breathe again. I told my director that I had fixed things but there would be minor issues on Monday.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Describe your strengths and weaknesses?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It wouldn’t be an interview without a strengths and weaknesses question. As an interviewer I want at least one weakness and I want it to actually be a weakness.&lt;/p&gt;
&lt;p&gt;My strengths are my problem solving skills, I can look at a problem and investigate what is going on and find a solution. If its a technology I haven’t used before I can read up about it and find out how it works and then use it to solve the issue.&lt;/p&gt;
&lt;p&gt;My weakness is my interpersonal skills, I am much better at analysing a computer issue than figuring out why one member of my staff is not performing. This is an area that is improving over the last few years I have taken on more responsibility over people and I am learning more about getting the best out of them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Technical Questions&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I have never included technical questions in one of my interviews until recently and I think it is a good way to gauge ability. I often come out of an interview unsure how well that person would perform under the stresses of my job. If I have something down on paper it is a good start.&lt;/p&gt;
&lt;p&gt;But the personality that comes through during the interview must also be considered as most knowledge can be taught.&lt;/p&gt;
&lt;p&gt;A good technical question I have used in the past is write a paragraph explaining DHCP. This question illustrates what their knowledge is like for an essential technology, but it also indicates what their writing style is like. Could the passage they have written be given to a Director or Client?&lt;/p&gt;
&lt;p&gt;Good IT people need both technical knowledge and the ability to communicate at all levels, I still struggle to know if someone is good or not and even sometimes if I am any good.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>To boldly go where no SQL has gone before Part 2</title>
      <link>https://www.funkysi1701.com/posts/2014/to-boldly-go-where-no-sql-has-gone-before-part-2/</link>
      <pubDate>Tue, 21 Oct 2014 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2014/to-boldly-go-where-no-sql-has-gone-before-part-2/</guid>
      <description>&lt;p&gt;Let’s continue looking at a database schema for storing details of every Star Trek Episode. If you are new to databases, a schema is just the design of the structure of the database.&lt;/p&gt;
&lt;p&gt;We have three tables, Episode, EpisodeWriter and Writer. See my last post for more details of these. It has been suggested that a slight change to this structure would enable storage of more of the creative staff.&lt;/p&gt;
&lt;p&gt;Lets rename Writer and call it Credit, and rename EpisodeWriter and call it EpisodeCredit. Now any creative staff member involved in an episode can be stored in the Credit table. Lets alter EpisodeCredit and add an extra column called CreditType. CreditType is just a text field that stores the role that creative person had on that episode, it can be anything from Director, Writer, Actor, Science Consultant etc.&lt;/p&gt;
&lt;p&gt;We now have the ability to store information relating to the episode in the episode table and any creative people in the credit table. What else can we add to the database? How about a table that can be used to record when an episode was last watched. I am probably weird but sometimes I want to watch a Star Trek episode that I like but I haven’t watched in ages.&lt;/p&gt;
&lt;p&gt;The last watched table is really simple and just have a datetime field and episodeId. This can be further expanded to have a userId field if you wanted to keep track of what episodes your friends had been watching.&lt;/p&gt;
&lt;p&gt;Another idea could be to tag episodes with certain themes or topics like Klingon episodes or meaning of life episodes or Kirk talks a computer to death episodes. Again this is fairly simple table containing TagName and EpisodeId.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>To boldly go where no SQL has gone before</title>
      <link>https://www.funkysi1701.com/posts/2014/to-boldly-go-where-no-sql-has-gone-before/</link>
      <pubDate>Sun, 12 Oct 2014 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2014/to-boldly-go-where-no-sql-has-gone-before/</guid>
      <description>&lt;p&gt;My last post proved quite popular so I am wondering if I can combine a post about IT and Star Trek.&lt;/p&gt;
&lt;p&gt;Years ago I used to have lists of Star Trek episodes, which included such information like original air date, production number, episode title and brief description.&lt;/p&gt;
&lt;p&gt;One thing that was hard to keep track of was how many episodes were written by a specific person. This is because episodes are written by multiple people. A column called writer would then need to contain multiple people, another option would be to have columns called writer1, writer2 etc. This wouldn’t help either as you wouldn’t know which column a specific writer had been saved in.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2014/10/manytomany.jpg?w=559&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;The relationship between writer and episode is known as a many to many relationship. An episode can have many writers and a writer can have written many episodes. To achieve this structure in a SQL database you will need three database tables as it is not possible to create a many to many join between two tables. The first table will contain all the episodes, the second table will contain all the writers, the third table known as a junction table, will contain the relationship between the two.&lt;/p&gt;
&lt;p&gt;Let’s do an example so we can see how this would work. Gene Roddenberry creator of Star Trek wrote the pilot episode ‘The Cage’. So Gene would be added to the writers table with an id of 1 and The Cage would be added to the episode table with an id of 1. In the junction table, it has two columns episode and writer, so we would enter 1 and 1 into these columns.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;Select&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;from&lt;/span&gt; Episode e
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;Join&lt;/span&gt; EpisodeWriter ew &lt;span style=&#34;color:#66d9ef&#34;&gt;on&lt;/span&gt; e.id &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ew.EpisodeId
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;Join&lt;/span&gt; Writer w &lt;span style=&#34;color:#66d9ef&#34;&gt;on&lt;/span&gt; w.id &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ew.WriterId
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;But if Gene Coon and Gene Roddenberry had writing credits on The Cage we would need to add Gene Coon to the writing table and add an extra entry to the episodewriter table.&lt;/p&gt;
&lt;p&gt;I am going to do more posts based on this as I expand the database structure to include other information, I may go on to create stored procedures for bringing back certain information or I may use this as an example to talk about coding a user interface.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Destination Star Trek</title>
      <link>https://www.funkysi1701.com/posts/2014/destination-star-trek/</link>
      <pubDate>Sun, 05 Oct 2014 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2014/destination-star-trek/</guid>
      <description>&lt;p&gt;As a break from my usual topics I am going to talk about what I did over the weekend.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2014/10/10670061_10152884492389155_77781042960777157_n.jpg&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;I am a huge star trek fan, so me and my wife Laura went to Destination Star Trek, a convention held in London. This is a picture of us in costume, my wife created a tribble costume (A tribble is an alien race that just consists of a ball of fur) and I am wearing an original series captains uniform. We had a great time.&lt;/p&gt;
&lt;p&gt;There are several things that made this trip special.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Friends&lt;/strong&gt;: After the last convention I remember thinking how much better the convention would be with a group of friends. Shortly afterwards I started listening to the trekmate podcast, eventually this lead to me helping out with their website and making friends via twitter with many of the hosts. This weekend was the first time I met up with them and it was great to put faces to names (or twitter names)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Writers and Directors&lt;/strong&gt;: Star Trek has a great philosophy. In the future human beings will put their differences aside and work together to explore the galaxy, this is one reason why Star Trek is so popular even after almost 50 years. This philosophy has been created by the writers and other creative staff over the years. My favourite Star Trek film is Wrath of Khan which was directed by Nicholas Meyer, this weekend I got my DVD signed by him and was able to tell him how I still enjoyed that film over 30 years after it was made. He said that he really appreciated me saying that. Listening to his talk later on, it was fascinating to hear his insights into making my favourite film. It is the writers and directors that make our favourite characters who they are, the actors themselves aren’t allowed to ad lib, all they do is flesh them out with a bit of emotion or a mannerism, it is the writer that create our favourite lines or situations that we remember.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Seven of Nine&lt;/strong&gt;: During my teenage years I had lots of posters of Seven on my walls. Seven of Nine was the ex-borg that walked around the ship in a skin tight catsuit, but she was also highly intelligent and continued to explore what it was to be human. It was great to have my photo taken with her, even if it was rushed due to the large number of people that wanted their picture taken.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Trivia&lt;/strong&gt;: On the Friday of the convention, Laura took part in the beginners trivia challenge, she won. On Saturday I took part in the intermediate trivia challenge, I did really badly only got 3 correct, On Sunday I took part in the captain level challenge and I won. I really wasn’t expecting that, after I did so badly the day before. Thanks Marc Stamper and Destination Star Trek for organising that it was great fun, and also fun to meet the other trekkies who I had been competing against via twitter.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Party!&lt;/strong&gt;: On Saturday night we went to a party, we had Romulan Ale to drink, we had some of the actors performing songs (James Darren was particularly good), and some of the actors mingled with fans, it was great to see the actors relaxing and if you were lucky you could chat to them, I asked Vaughn Armstrong how he was enjoying the music, he loved it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is just a taste of what I got up to, there was lots more, like seeing alien costumes, listening to talks, sitting on a mockup of the bridge. Only one way to end this post, &lt;strong&gt;Live Long and Prosper!&lt;/strong&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Windows 9 or do I mean 10</title>
      <link>https://www.funkysi1701.com/posts/2014/windows-9-or-do-i-mean-10/</link>
      <pubDate>Wed, 01 Oct 2014 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2014/windows-9-or-do-i-mean-10/</guid>
      <description>&lt;p&gt;Like many systems administrators I watched as the news came out yesterday about the latest version of windows. What would it be like? What would it be called? Would it be better or worse than previous versions?&lt;/p&gt;
&lt;p&gt;I was shocked when the name of the new operating system was revealed to be Windows 10. What really!? At first I though someone had tweeted a photoshopped image of the press conference, but no it was really going to be called Windows 10.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;Windows 10&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2014/10/windows_10_fullwidth.jpg?w=800&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;Windows 10 is the next operating system to be released after windows 8, many had been calling it windows 9 or windows Threshold.&lt;/p&gt;
&lt;p&gt;Microsoft has never had a fixed naming convention for its OSes, so should we really be that surprised at its new name.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows 1.0 (1985)&lt;/li&gt;
&lt;li&gt;Windows 2.0 (1987)&lt;/li&gt;
&lt;li&gt;Windows 3.0 (1990)&lt;/li&gt;
&lt;li&gt;Windows 95 (1995)&lt;/li&gt;
&lt;li&gt;Windows 98 (1998)&lt;/li&gt;
&lt;li&gt;Windows ME (2000)&lt;/li&gt;
&lt;li&gt;Windows XP (2001)&lt;/li&gt;
&lt;li&gt;Windows Vista (2007)&lt;/li&gt;
&lt;li&gt;Windows 7 (2009)&lt;/li&gt;
&lt;li&gt;Windows 8 (2012)&lt;/li&gt;
&lt;li&gt;Windows 10 (2015)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Windows 11 (2021)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One reason Microsoft may have gone with with Windows 10 is because they wanted to signify that the coming Windows release would be the last “major” Windows update. What does it mean to be the last major update?&lt;/p&gt;
&lt;p&gt;If you look at the list of OSes above you will see that between XP and Vista was a huge 6 years, this gap is/has caused a huge headache for IT professionals (me included). Software was written for XP because that is all that was available, when XP moved out of support earlier this year it caused loads as problems as people tried to get this software to work on more modern OSes.&lt;/p&gt;
&lt;p&gt;If windows 10 is around for a long time we may end up with a similar situation to XP, in that loads of software will run only on it and cause problems if you try and port it to whatever comes next. I am only a trainee developer so I don’t know what is involved with building an OS, but I would imagine there must be things that are very difficult or almost impossible to fix without ripping them out and starting again which is what happens when a new version of an OS is written.&lt;/p&gt;
&lt;p&gt;Only time will tell if Windows 10 really is the last version of windows and what will happen to the OS in the future. What ever the case I am downloading a preview so I can have a look (I want my start menu back!)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>What is the difference between Development and Operations?</title>
      <link>https://www.funkysi1701.com/posts/2014/what-is-the-difference-between-dev-and-ops/</link>
      <pubDate>Sat, 27 Sep 2014 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2014/what-is-the-difference-between-dev-and-ops/</guid>
      <description>&lt;p&gt;I want to learn Development and eventually move into a development role. But what is the difference between development and what I already do?&lt;/p&gt;
&lt;p&gt;Put simply Development or programming is the creation of new programs, websites or databases.&lt;/p&gt;
&lt;p&gt;IT Operations or System Administration is the administration of existing servers, websites or databases.&lt;/p&gt;
&lt;p&gt;I have been doing System Administration since I started my job back in 2006. What you do as part of this role can be very simple like setting up new users or computers to something very complex like upgrading the version of Exchange that the company uses for its emails.&lt;/p&gt;
&lt;p&gt;As part of my role I have done a lot of tasks that could be described as development. I have created databases and built new database structures like tables, views and stored procedures. I have also assisted the development department with testing, setting up visual studio, building websites and databases from code.&lt;/p&gt;
&lt;p&gt;Can I describe myself as a developer? I would say yes, I have done plenty of work that is development work.&lt;/p&gt;
&lt;p&gt;Can I get a job as a developer? Possibly but it would depend on the role. I have many of the skills that developers use, but I have limited knowledge in many areas. What I need to do is concentrate my efforts onto the development work I do and delegate as much administration work as I can so my knowledge can increase.&lt;/p&gt;
&lt;p&gt;A Buzz word in IT at the moment is DevOps. I have lost count of the number of times .NetRocks or RunAsRadio have mentioned it.&lt;/p&gt;
&lt;p&gt;DevOps is the integration of IT Development and Operations, it emphasises the need for the two departments to work closely together to achieve common goals. In big companies the two departments can pull against each other if you are not careful, but in my case as I do both roles, it would be very difficult for the development side of myself to blame the operations side of myself for a problem.&lt;/p&gt;
&lt;p&gt;This I think puts me in a good position, I just need to learn more development and I will make a valuable addition to someone’s development team.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>I love Nagios</title>
      <link>https://www.funkysi1701.com/posts/2014/i-love-nagios/</link>
      <pubDate>Wed, 24 Sep 2014 20:00:45 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/2014/i-love-nagios/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2014/09/nagios.png&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;Nagios&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2014/09/nagios.png?resize=212%2C50&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;You may not have heard of Nagios but it has saved my bacon quite a few times.&lt;/p&gt;
&lt;p&gt;Nagios is an open source server monitoring application that runs on many linux flavours.&lt;/p&gt;
&lt;p&gt;I can’t remember exactly when I first installed nagios but I am guessing it was sometime in 2007/8. My boss gave me a book about it (which I never read) and told me to create a system to monitor the companies servers.&lt;/p&gt;
&lt;p&gt;Nagios is not simple to set up. It relies on setting up various Hosts and services. Hosts are usually physical servers that you want to monitor and services are all the services you want to monitor. As this is a linux program all these can be configured by editing the right config file&lt;/p&gt;
&lt;p&gt;Nagios is very flexible and can be expanded easily with the use of plugins, if you want to monitor something there is usually a plugin available. If you have a dell server running openmanage software there is even a plugin that allows the temperature of your server to be monitored.&lt;/p&gt;
&lt;p&gt;If you want to monitor windows servers the use of nsclient++ is a real advantage. This is a simple client that runs as a service on your windows server. This allows nagios to track memory, cpu, disk space, performance and services, in fact almost everything that you would want to monitor.&lt;/p&gt;
&lt;p&gt;Over the years I have kept a close eye on Nagios and added extra checks as new services were added or problems encountered. A few years ago I dabbled with sending alerts out via SMS message and once I got a smart phone found an app to keep track of Nagios 24/7.&lt;/p&gt;
&lt;p&gt;But recently I have started wondering if Nagios is the best way to monitor modern servers like 2012 or remote services like Azure. I want something that is easy to expand as your IT infrastructure expands. Something that relies on running on a linux OS requires your IT staff have a knowledge of linux and you keep that server maintained and updated.&lt;/p&gt;
&lt;p&gt;My question is: Is Nagios still the best way to monitor my servers?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>About Me</title>
      <link>https://www.funkysi1701.com/posts/about/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/about/</guid>
      <description>&lt;img alt=&#34;Funky Si profile image&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2014/09/1922276.jpg&#34; style=&#34;float: left; padding-right: 15px; height: 150px&#34; /&gt;
&lt;p&gt;My real name is Simon Foster but my on-line persona is Funky Si a nickname I was given during my university days which has somehow stuck. I am a Developer working in the North of England. I have been working in IT departments since 2006 and have a wide range of experiences. More recently in the Software Development space but also SysAdmin, Server Infrastructure, Databases and DevOps.&lt;/p&gt;
&lt;p&gt;In my spare time I have created &lt;a href=&#34;https://www.funkysi1701.com/pwned-pass&#34;&gt;Pwned Pass&lt;/a&gt; a Xamarin Forms mobile app that makes use of the Have I Been Pwned? API to allow searching for breached emails and passwords. This is available from the Google Play store.&lt;/p&gt;
&lt;h2 id=&#34;certifications&#34;&gt;Certifications&lt;a class=&#34;anchor ms-1&#34; href=&#34;#certifications&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://www.credly.com/badges/adacf718-d696-4254-a68d-5b32f720ac78/public_url&#34; style=&#34;float:left&#34;&gt;&lt;img src=&#34;https://www.funkysi1701.com/images/azure.png&#34; alt=&#34;Azure Fundamentals&#34; width=&#34;150&#34; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.credly.com/badges/3aab54c8-a109-4018-bcad-dbe0d6a1fc0c/public_url&#34;&gt;&lt;img src=&#34;https://www.funkysi1701.com/images/awscp.png&#34; alt=&#34;AWS Cloud Practitioner&#34; width=&#34;150&#34; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;tech-i-have-used&#34;&gt;Tech I have used&lt;a class=&#34;anchor ms-1&#34; href=&#34;#tech-i-have-used&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;.Net&lt;/li&gt;
&lt;li&gt;C#&lt;/li&gt;
&lt;li&gt;SQL Server&lt;/li&gt;
&lt;li&gt;Blazor&lt;/li&gt;
&lt;li&gt;Javascript&lt;/li&gt;
&lt;li&gt;jquery&lt;/li&gt;
&lt;li&gt;Azure&lt;/li&gt;
&lt;li&gt;Azure DevOps&lt;/li&gt;
&lt;li&gt;AWS&lt;/li&gt;
&lt;li&gt;Terraform&lt;/li&gt;
&lt;li&gt;Powershell&lt;/li&gt;
&lt;li&gt;git&lt;/li&gt;
&lt;li&gt;plus many others&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;recommendations&#34;&gt;Recommendations&lt;a class=&#34;anchor ms-1&#34; href=&#34;#recommendations&#34;&gt;&lt;i class=&#34;fas fa-link&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Simon is an excellent developer, always looking for new methods and technology to improve existing solutions, along with his own skills. He is open to new ideas, though not afraid to share his thoughts and feedback and guide others to the best solution possible. It’s worth noting that Simon has vast knowledge on hardware and infrastructure which really does compliment his skill as a developer.&lt;/em&gt; - Alasdair Thomson (Head of Business Data Solutions at NPD Travel Retail)&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Simon worked for my company for a number of years and was a very valued member of staff, and later on management. He is an intelligent and conscientious worker who gives over and above on a regular basis. He leads by example and was respected by his peers and the directors of the company. I would not hesitate to recommend Simon both in terms of the quality of his work and his ethics and values in life in general.&lt;/em&gt; - Alison Davies (CEO at Eurosafe UK)&lt;/p&gt;
&lt;p&gt;&lt;em&gt;If you want a developer who really understands DevOps, then Si is your man. With a mixture of operations, support, development and management experience, he can bring a balanced skillset to a team, as well as excellent knowledge of Azure, .NET, SQL and the web.&lt;/em&gt; - Keith Williams (Development Manager at IRIS for Cascade HR and KashFlow Payroll)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Events</title>
      <link>https://www.funkysi1701.com/posts/events/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/events/</guid>
      <description>&lt;p&gt;A list of events I have attended.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event/Talk&lt;/th&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Location&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2024&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Scottish Summit&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;17/19 October 2024&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Aberdeen&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;SteelCon&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;20 July 2024&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Sheffield&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;DDD North&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;2 March 2024&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Hull&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2023&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DevBoss&lt;/td&gt;
&lt;td&gt;16 November 2023&lt;/td&gt;
&lt;td&gt;Leeds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&#34;https://www.funkysi1701.com/posts/2023/ddd-east-midlands&#34;&gt;DDD East Midlands&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;7th October&lt;/td&gt;
&lt;td&gt;Nottingham&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SteelCon&lt;/td&gt;
&lt;td&gt;8 July 2023&lt;/td&gt;
&lt;td&gt;Sheffield&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Yorkshire Azure&lt;/td&gt;
&lt;td&gt;13 June 2023&lt;/td&gt;
&lt;td&gt;Leeds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DevBoss&lt;/td&gt;
&lt;td&gt;20 April 2023&lt;/td&gt;
&lt;td&gt;Leeds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dotnet York Machine Learning with ML.Net&lt;/td&gt;
&lt;td&gt;2 March 2023&lt;/td&gt;
&lt;td&gt;York&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2022&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft Datacenter Tour: Virtual Experience&lt;/td&gt;
&lt;td&gt;6 December 2022&lt;/td&gt;
&lt;td&gt;Online&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&#34;https://www.funkysi1701.com/posts/2022/ddd-north&#34;&gt;DDD North&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;3 December 2022&lt;/td&gt;
&lt;td&gt;Hull&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LeedsSharp Azure Patterns for Fun and Profit&lt;/td&gt;
&lt;td&gt;24 November 2022&lt;/td&gt;
&lt;td&gt;Leeds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.Net Conf (Keynote only)&lt;/td&gt;
&lt;td&gt;8 November 2022&lt;/td&gt;
&lt;td&gt;Online&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&#34;https://www.funkysi1701.com/posts/2022/scottishsummit/&#34;&gt;Scottish Summit&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;10/11 June 2022&lt;/td&gt;
&lt;td&gt;Glasgow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The .Network (Networking event)&lt;/td&gt;
&lt;td&gt;28 April 2022&lt;/td&gt;
&lt;td&gt;Leeds&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</description>
    </item>
    
    <item>
      <title>Funky Si: The Next Generation</title>
      <link>https://www.funkysi1701.com/posts/funky-si-the-next-generation/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/funky-si-the-next-generation/</guid>
      <description>&lt;p&gt;On 19th August at 9.39 pm James David Martin Foster arrived weighing 9 lb 12.&lt;/p&gt;
&lt;img src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/07/james5.jpg?resize=300%2C225&amp;ssl=1&#34; width=&#34;300&#34;&gt;
&lt;img src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/07/20150827_134624-e1442143961495.jpg?resize=300%2C169&amp;ssl=1&#34; width=&#34;300&#34;&gt;
&lt;img src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/07/James.jpg?resize=300%2C165&amp;ssl=1&#34; width=&#34;300&#34;&gt;
&lt;img src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/07/SAM_4939.jpg?resize=300%2C225&amp;ssl=1&#34; width=&#34;300&#34;&gt;
&lt;img src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/07/COogcqtXAAAzZ7A.jpg?resize=300%2C300&amp;ssl=1&#34; width=&#34;300&#34;&gt;
&lt;img src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/07/COZF5PjWUAAhcan.jpg?resize=300%2C300&amp;ssl=1&#34; width=&#34;300&#34;&gt;
&lt;p&gt;My initial thoughts on fatherhood can be found &lt;a href=&#34;https://www.funkysi1701.com/2015/09/03/baby-magic-and-becoming-a-father/&#34;&gt;here&lt;/a&gt;
. More baby photos can also be found on my &lt;a href=&#34;https://www.instagram.com/funkysi1701/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;instragram&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/07/twitter.jpg?resize=768%2C256&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
&lt;p&gt;On 11th November 2017 at 22:58pm Edward Leonard Alan Foster arrived weighing 11 lb&lt;/p&gt;
&lt;p&gt;&lt;img class=&#34;img-fluid&#34; alt=&#34;&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2015/07/DSC_0376-e1510563039193.jpg?resize=225%2C300&amp;amp;ssl=1&#34; loading=&#34;lazy&#34;
  
   /&gt;

&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Podcasts</title>
      <link>https://www.funkysi1701.com/posts/podcasts/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/podcasts/</guid>
      <description>&lt;p&gt;A list of podcast I have recorded.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.funkysi1701.com/posts/2024/trekranks/&#34;&gt;TrekRanks #174&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.funkysi1701.com/posts/2023/picard-season-three/&#34;&gt;Picard Season 3&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.funkysi1701.com/posts/2022/temporal-trek-podcast/&#34;&gt;Temporal Trek Podcast&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.funkysi1701.com/posts/2016/brothers-tng-s4-e3-review-battle-bridge/&#34;&gt;Brothers, TNG S4 E3 Review, The Battle Bridge&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.funkysi1701.com/posts/2015/star-trek-is-back-in-2017/&#34;&gt;Star Trek is back (in 2017)&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.funkysi1701.com/posts/2015/the-hunted-tng-s3-e11-the-battle-bridge/&#34;&gt;The Hunted, TNG S3 E11, The Battle Bridge&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.funkysi1701.com/posts/2015/upper-pylon-2-1-x-09-the-passenger/&#34;&gt;Upper Pylon 2 – 1 x 09: The Passenger&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.funkysi1701.com/posts/2015/ten-forward-episode-135-anti-firbob-is-back-or-simons-desert-island-trek/&#34;&gt;Ten Forward Episode #135 – Anti Firbob is Back or Simon’s Desert Island Trek&lt;/a&gt;
&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Privacy Policy</title>
      <link>https://www.funkysi1701.com/posts/privacy-policy/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/privacy-policy/</guid>
      <description>&lt;h1&gt;Privacy Policy&lt;/h1&gt;
&lt;p&gt;Last updated: March 31, 2022&lt;/p&gt;
&lt;p&gt;This Privacy Policy describes Our policies and procedures on the collection, use and disclosure of Your information when You use the Service and tells You about Your privacy rights and how the law protects You.&lt;/p&gt;
&lt;p&gt;We use Your Personal data to provide and improve the Service. By using the Service, You agree to the collection and use of information in accordance with this Privacy Policy. This Privacy Policy has been created with the help of the &lt;a href=&#34;https://www.freeprivacypolicy.com/blog/sample-privacy-policy-template/&#34; target=&#34;_blank&#34;&gt;Privacy Policy Template&lt;/a&gt;.&lt;/p&gt;
&lt;h1&gt;Interpretation and Definitions&lt;/h1&gt;
&lt;h2&gt;Interpretation&lt;/h2&gt;
&lt;p&gt;The words of which the initial letter is capitalized have meanings defined under the following conditions. The following definitions shall have the same meaning regardless of whether they appear in singular or in plural.&lt;/p&gt;
&lt;h2&gt;Definitions&lt;/h2&gt;
&lt;p&gt;For the purposes of this Privacy Policy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Account&lt;/strong&gt; means a unique account created for You to access our Service or parts of our Service.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Company&lt;/strong&gt; (referred to as either &amp;quot;the Company&amp;quot;, &amp;quot;We&amp;quot;, &amp;quot;Us&amp;quot; or &amp;quot;Our&amp;quot; in this Agreement) refers to Funky Si&#39;s Blog.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cookies&lt;/strong&gt; are small files that are placed on Your computer, mobile device or any other device by a website, containing the details of Your browsing history on that website among its many uses.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Country&lt;/strong&gt; refers to:  United Kingdom&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Device&lt;/strong&gt; means any device that can access the Service such as a computer, a cellphone or a digital tablet.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Personal Data&lt;/strong&gt; is any information that relates to an identified or identifiable individual.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Service&lt;/strong&gt; refers to the Website.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Service Provider&lt;/strong&gt; means any natural or legal person who processes the data on behalf of the Company. It refers to third-party companies or individuals employed by the Company to facilitate the Service, to provide the Service on behalf of the Company, to perform services related to the Service or to assist the Company in analyzing how the Service is used.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Usage Data&lt;/strong&gt; refers to data collected automatically, either generated by the use of the Service or from the Service infrastructure itself (for example, the duration of a page visit).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Website&lt;/strong&gt; refers to Funky Si&#39;s Blog, accessible from &lt;a href=&#34;https://www.funkysi1701.com&#34; rel=&#34;external nofollow noopener&#34; target=&#34;_blank&#34;&gt;https://www.funkysi1701.com&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;You&lt;/strong&gt; means the individual accessing or using the Service, or the company, or other legal entity on behalf of which such individual is accessing or using the Service, as applicable.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Collecting and Using Your Personal Data&lt;/h1&gt;
&lt;h2&gt;Types of Data Collected&lt;/h2&gt;
&lt;h3&gt;Personal Data&lt;/h3&gt;
&lt;p&gt;While using Our Service, We may ask You to provide Us with certain personally identifiable information that can be used to contact or identify You. Personally identifiable information may include, but is not limited to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Email address&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;First name and last name&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Usage Data&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Usage Data&lt;/h3&gt;
&lt;p&gt;Usage Data is collected automatically when using the Service.&lt;/p&gt;
&lt;p&gt;Usage Data may include information such as Your Device&#39;s Internet Protocol address (e.g. IP address), browser type, browser version, the pages of our Service that You visit, the time and date of Your visit, the time spent on those pages, unique device identifiers and other diagnostic data.&lt;/p&gt;
&lt;p&gt;When You access the Service by or through a mobile device, We may collect certain information automatically, including, but not limited to, the type of mobile device You use, Your mobile device unique ID, the IP address of Your mobile device, Your mobile operating system, the type of mobile Internet browser You use, unique device identifiers and other diagnostic data.&lt;/p&gt;
&lt;p&gt;We may also collect information that Your browser sends whenever You visit our Service or when You access the Service by or through a mobile device.&lt;/p&gt;
&lt;h3&gt;Tracking Technologies and Cookies&lt;/h3&gt;
&lt;p&gt;We use Cookies and similar tracking technologies to track the activity on Our Service and store certain information. Tracking technologies used are beacons, tags, and scripts to collect and track information and to improve and analyze Our Service. The technologies We use may include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cookies or Browser Cookies.&lt;/strong&gt; A cookie is a small file placed on Your Device. You can instruct Your browser to refuse all Cookies or to indicate when a Cookie is being sent. However, if You do not accept Cookies, You may not be able to use some parts of our Service. Unless you have adjusted Your browser setting so that it will refuse Cookies, our Service may use Cookies.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flash Cookies.&lt;/strong&gt; Certain features of our Service may use local stored objects (or Flash Cookies) to collect and store information about Your preferences or Your activity on our Service. Flash Cookies are not managed by the same browser settings as those used for Browser Cookies. For more information on how You can delete Flash Cookies, please read &amp;quot;Where can I change the settings for disabling, or deleting local shared objects?&amp;quot; available at &lt;a href=&#34;https://helpx.adobe.com/flash-player/kb/disable-local-shared-objects-flash.html#main_Where_can_I_change_the_settings_for_disabling__or_deleting_local_shared_objects_&#34; rel=&#34;external nofollow noopener&#34; target=&#34;_blank&#34;&gt;https://helpx.adobe.com/flash-player/kb/disable-local-shared-objects-flash.html#main_Where_can_I_change_the_settings_for_disabling__or_deleting_local_shared_objects_&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Web Beacons.&lt;/strong&gt; Certain sections of our Service and our emails may contain small electronic files known as web beacons (also referred to as clear gifs, pixel tags, and single-pixel gifs) that permit the Company, for example, to count users who have visited those pages or opened an email and for other related website statistics (for example, recording the popularity of a certain section and verifying system and server integrity).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cookies can be &amp;quot;Persistent&amp;quot; or &amp;quot;Session&amp;quot; Cookies. Persistent Cookies remain on Your personal computer or mobile device when You go offline, while Session Cookies are deleted as soon as You close Your web browser. Learn more about cookies: &lt;a href=&#34;https://www.freeprivacypolicy.com/blog/sample-privacy-policy-template/#Use_Of_Cookies_And_Tracking&#34; target=&#34;_blank&#34;&gt;Use of Cookies by Free Privacy Policy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We use both Session and Persistent Cookies for the purposes set out below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Necessary / Essential Cookies&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Type: Session Cookies&lt;/p&gt;
&lt;p&gt;Administered by: Us&lt;/p&gt;
&lt;p&gt;Purpose: These Cookies are essential to provide You with services available through the Website and to enable You to use some of its features. They help to authenticate users and prevent fraudulent use of user accounts. Without these Cookies, the services that You have asked for cannot be provided, and We only use these Cookies to provide You with those services.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cookies Policy / Notice Acceptance Cookies&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Type: Persistent Cookies&lt;/p&gt;
&lt;p&gt;Administered by: Us&lt;/p&gt;
&lt;p&gt;Purpose: These Cookies identify if users have accepted the use of cookies on the Website.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Functionality Cookies&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Type: Persistent Cookies&lt;/p&gt;
&lt;p&gt;Administered by: Us&lt;/p&gt;
&lt;p&gt;Purpose: These Cookies allow us to remember choices You make when You use the Website, such as remembering your login details or language preference. The purpose of these Cookies is to provide You with a more personal experience and to avoid You having to re-enter your preferences every time You use the Website.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information about the cookies we use and your choices regarding cookies, please visit our Cookies Policy or the Cookies section of our Privacy Policy.&lt;/p&gt;
&lt;h2&gt;Use of Your Personal Data&lt;/h2&gt;
&lt;p&gt;The Company may use Personal Data for the following purposes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;To provide and maintain our Service&lt;/strong&gt;, including to monitor the usage of our Service.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;To manage Your Account:&lt;/strong&gt; to manage Your registration as a user of the Service. The Personal Data You provide can give You access to different functionalities of the Service that are available to You as a registered user.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;For the performance of a contract:&lt;/strong&gt; the development, compliance and undertaking of the purchase contract for the products, items or services You have purchased or of any other contract with Us through the Service.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;To contact You:&lt;/strong&gt; To contact You by email, telephone calls, SMS, or other equivalent forms of electronic communication, such as a mobile application&#39;s push notifications regarding updates or informative communications related to the functionalities, products or contracted services, including the security updates, when necessary or reasonable for their implementation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;To provide You&lt;/strong&gt; with news, special offers and general information about other goods, services and events which we offer that are similar to those that you have already purchased or enquired about unless You have opted not to receive such information.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;To manage Your requests:&lt;/strong&gt; To attend and manage Your requests to Us.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;For business transfers:&lt;/strong&gt; We may use Your information to evaluate or conduct a merger, divestiture, restructuring, reorganization, dissolution, or other sale or transfer of some or all of Our assets, whether as a going concern or as part of bankruptcy, liquidation, or similar proceeding, in which Personal Data held by Us about our Service users is among the assets transferred.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;For other purposes&lt;/strong&gt;: We may use Your information for other purposes, such as data analysis, identifying usage trends, determining the effectiveness of our promotional campaigns and to evaluate and improve our Service, products, services, marketing and your experience.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We may share Your personal information in the following situations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;With Service Providers:&lt;/strong&gt; We may share Your personal information with Service Providers to monitor and analyze the use of our Service,  to contact You.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;For business transfers:&lt;/strong&gt; We may share or transfer Your personal information in connection with, or during negotiations of, any merger, sale of Company assets, financing, or acquisition of all or a portion of Our business to another company.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;With Affiliates:&lt;/strong&gt; We may share Your information with Our affiliates, in which case we will require those affiliates to honor this Privacy Policy. Affiliates include Our parent company and any other subsidiaries, joint venture partners or other companies that We control or that are under common control with Us.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;With business partners:&lt;/strong&gt; We may share Your information with Our business partners to offer You certain products, services or promotions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;With other users:&lt;/strong&gt; when You share personal information or otherwise interact in the public areas with other users, such information may be viewed by all users and may be publicly distributed outside.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;With Your consent&lt;/strong&gt;: We may disclose Your personal information for any other purpose with Your consent.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Retention of Your Personal Data&lt;/h2&gt;
&lt;p&gt;The Company will retain Your Personal Data only for as long as is necessary for the purposes set out in this Privacy Policy. We will retain and use Your Personal Data to the extent necessary to comply with our legal obligations (for example, if we are required to retain your data to comply with applicable laws), resolve disputes, and enforce our legal agreements and policies.&lt;/p&gt;
&lt;p&gt;The Company will also retain Usage Data for internal analysis purposes. Usage Data is generally retained for a shorter period of time, except when this data is used to strengthen the security or to improve the functionality of Our Service, or We are legally obligated to retain this data for longer time periods.&lt;/p&gt;
&lt;h2&gt;Transfer of Your Personal Data&lt;/h2&gt;
&lt;p&gt;Your information, including Personal Data, is processed at the Company&#39;s operating offices and in any other places where the parties involved in the processing are located. It means that this information may be transferred to — and maintained on — computers located outside of Your state, province, country or other governmental jurisdiction where the data protection laws may differ than those from Your jurisdiction.&lt;/p&gt;
&lt;p&gt;Your consent to this Privacy Policy followed by Your submission of such information represents Your agreement to that transfer.&lt;/p&gt;
&lt;p&gt;The Company will take all steps reasonably necessary to ensure that Your data is treated securely and in accordance with this Privacy Policy and no transfer of Your Personal Data will take place to an organization or a country unless there are adequate controls in place including the security of Your data and other personal information.&lt;/p&gt;
&lt;h2&gt;Disclosure of Your Personal Data&lt;/h2&gt;
&lt;h3&gt;Business Transactions&lt;/h3&gt;
&lt;p&gt;If the Company is involved in a merger, acquisition or asset sale, Your Personal Data may be transferred. We will provide notice before Your Personal Data is transferred and becomes subject to a different Privacy Policy.&lt;/p&gt;
&lt;h3&gt;Law enforcement&lt;/h3&gt;
&lt;p&gt;Under certain circumstances, the Company may be required to disclose Your Personal Data if required to do so by law or in response to valid requests by public authorities (e.g. a court or a government agency).&lt;/p&gt;
&lt;h3&gt;Other legal requirements&lt;/h3&gt;
&lt;p&gt;The Company may disclose Your Personal Data in the good faith belief that such action is necessary to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Comply with a legal obligation&lt;/li&gt;
&lt;li&gt;Protect and defend the rights or property of the Company&lt;/li&gt;
&lt;li&gt;Prevent or investigate possible wrongdoing in connection with the Service&lt;/li&gt;
&lt;li&gt;Protect the personal safety of Users of the Service or the public&lt;/li&gt;
&lt;li&gt;Protect against legal liability&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Security of Your Personal Data&lt;/h2&gt;
&lt;p&gt;The security of Your Personal Data is important to Us, but remember that no method of transmission over the Internet, or method of electronic storage is 100% secure. While We strive to use commercially acceptable means to protect Your Personal Data, We cannot guarantee its absolute security.&lt;/p&gt;
&lt;h1&gt;Children&#39;s Privacy&lt;/h1&gt;
&lt;p&gt;Our Service does not address anyone under the age of 13. We do not knowingly collect personally identifiable information from anyone under the age of 13. If You are a parent or guardian and You are aware that Your child has provided Us with Personal Data, please contact Us. If We become aware that We have collected Personal Data from anyone under the age of 13 without verification of parental consent, We take steps to remove that information from Our servers.&lt;/p&gt;
&lt;p&gt;If We need to rely on consent as a legal basis for processing Your information and Your country requires consent from a parent, We may require Your parent&#39;s consent before We collect and use that information.&lt;/p&gt;
&lt;h1&gt;Links to Other Websites&lt;/h1&gt;
&lt;p&gt;Our Service may contain links to other websites that are not operated by Us. If You click on a third party link, You will be directed to that third party&#39;s site. We strongly advise You to review the Privacy Policy of every site You visit.&lt;/p&gt;
&lt;p&gt;We have no control over and assume no responsibility for the content, privacy policies or practices of any third party sites or services.&lt;/p&gt;
&lt;h1&gt;Changes to this Privacy Policy&lt;/h1&gt;
&lt;p&gt;We may update Our Privacy Policy from time to time. We will notify You of any changes by posting the new Privacy Policy on this page.&lt;/p&gt;
&lt;p&gt;We will let You know via email and/or a prominent notice on Our Service, prior to the change becoming effective and update the &amp;quot;Last updated&amp;quot; date at the top of this Privacy Policy.&lt;/p&gt;
&lt;p&gt;You are advised to review this Privacy Policy periodically for any changes. Changes to this Privacy Policy are effective when they are posted on this page.&lt;/p&gt;
&lt;h1&gt;Contact Us&lt;/h1&gt;
&lt;p&gt;If you have any questions about this Privacy Policy, You can contact us:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;By email: simon@funkysi1701.com&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>Pwned Passwords</title>
      <link>https://www.funkysi1701.com/posts/pwned-pass/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://www.funkysi1701.com/posts/pwned-pass/</guid>
      <description>&lt;p&gt;Using the data supplied by Troy Hunt and his Have I been pwned? website Pwned Pass allows you to check to see if any password has appeared in a data breach.&lt;/p&gt;
&lt;p&gt;For more details about Have I been pwned? check out &lt;a href=&#34;https://haveibeenpwned.com/&#34;&gt;haveibeenpwned.com&lt;/a&gt; and &lt;a href=&#34;https://www.troyhunt.com&#34;&gt;www.troyhunt.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pwned Pass is a simple Xamarin app that allows you to type in a password and tells you if it has been used in a data breach.&lt;/p&gt;
&lt;p&gt;Troy Hunt of &lt;a href=&#34;https://haveibeenpwned.com/&#34;&gt;Have I Been Pwned?&lt;/a&gt; recently added a new API to his website which allows you to search his extensive database of pwned passwords, over 306 million of them. I have simply created a Android frontend to this API.&lt;/p&gt;
&lt;p&gt;It should be noted:&amp;nbsp;&lt;strong&gt;Do not send any password you actively use to a third-party service – even mine!&lt;/strong&gt; I don’t log anything that you type into my app and this app makes use of the&amp;nbsp;&lt;a href=&#34;https://www.troyhunt.com/ive-just-launched-pwned-passwords-version-2/&#34;&gt;&lt;i&gt;k&lt;/i&gt;-anonymity&lt;/a&gt; feature to avoid transmitting passwords.&lt;/p&gt;
&lt;p&gt;As well as using Troy’s new API I also take advantage of his existing API’s. You can search his extensive database of email addresses to see if you have been affected by a data breach all from my android app.&lt;/p&gt;
&lt;p&gt;Pwned Pass is now available from the &lt;a href=&#34;https://play.google.com/store/apps/details?id=pwnedpasswords.pwnedpasswords&#34;&gt;Google Play Store&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://play.google.com/store/apps/details?id=pwnedpasswords.pwnedpasswords&#34;&gt;&lt;img class=&#34;alignleft wp-image-2204 size-medium jetpack-lazy-image jetpack-lazy-image--handled&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2019/04/playstore-1-300x90.png?fit=300%2C300&amp;amp;ssl=1&#34; alt=&#34;Google Play&#34; style=&#34;height: 50px;border-radius: 8px;&#34; data-recalc-dims=&#34;1&#34; srcset=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2019/04/playstore-1.png?resize=300%2C90&amp;amp;ssl=1 300w, https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2019/04/playstore-1.png?w=568&amp;amp;ssl=1 568w&#34; data-lazy-loaded=&#34;1&#34; sizes=&#34;(max-width: 300px) 100vw, 300px&#34;&gt;&lt;noscript&gt;&lt;img class=&#34;alignleft wp-image-2204 size-medium&#34; src=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2019/04/playstore-1-300x90.png?fit=300%2C300&amp;#038;ssl=1&#34; alt=&#34;&#34; style=&#34;height: 50px;border-radius: 8px;&#34; srcset=&#34;https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2019/04/playstore-1.png?resize=300%2C90&amp;amp;ssl=1 300w, https://storageaccountblog9f5d.blob.core.windows.net/blazor/wp-content/uploads/2019/04/playstore-1.png?w=568&amp;amp;ssl=1 568w&#34; sizes=&#34;(max-width: 300px) 100vw, 300px&#34; data-recalc-dims=&#34;1&#34; /&gt;&lt;/noscript&gt;&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>