<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Code Archives - WardNet</title>
	<atom:link href="https://www.wardnet.co.uk/category/code/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.wardnet.co.uk/category/code/</link>
	<description>Infrastructure, ERP and General Technology Blog</description>
	<lastBuildDate>Sun, 17 May 2026 15:32:52 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://i0.wp.com/www.wardnet.co.uk/wp-content/uploads/2026/01/wp-1767387074640.jpg?fit=32%2C32&#038;ssl=1</url>
	<title>Code Archives - WardNet</title>
	<link>https://www.wardnet.co.uk/category/code/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">63479081</site>	<item>
		<title>Simplifying Work: Ditch the App Overload</title>
		<link>https://www.wardnet.co.uk/simplifying-work-ditch-the-app-overload/</link>
		
		<dc:creator><![CDATA[Jonathan Ward]]></dc:creator>
		<pubDate>Sun, 17 May 2026 15:28:31 +0000</pubDate>
				<category><![CDATA[Admin]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[Career]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Epicor]]></category>
		<category><![CDATA[OpenAI]]></category>
		<category><![CDATA[Outlook]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Teams]]></category>
		<category><![CDATA[Workflow]]></category>
		<guid isPermaLink="false">https://www.wardnet.co.uk/?p=732</guid>

					<description><![CDATA[<p>I’ve ditched 12 “productivity” apps and streamlined my mobile workflow. Now, Outlook, Teams, and ChatGPT handle everything—emails, team updates, and AI-assisted summaries. Less clutter, fewer notifications, more focus. Mobile work is now about staying informed, making decisions, and keeping momentum—simpler, smarter, and truly productive on the go.</p>
<p><a href="https://www.wardnet.co.uk/simplifying-work-ditch-the-app-overload/">Simplifying Work: Ditch the App Overload</a></p>
]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading"></h1>



<p class="wp-block-paragraph">There was a time when my phone looked like a showcase for “productivity”.</p>



<p class="wp-block-paragraph">Task managers. Note taking apps. Whiteboard apps. Mind mapping tools. Team dashboards. To-do lists. Habit trackers. Time trackers. Document apps. AI assistants. Collaboration tools. Communication platforms.</p>



<p class="wp-block-paragraph">Twelve apps. Twelve different notifications. Twelve different places where “important” things lived.</p>



<p class="wp-block-paragraph">And honestly? Most of them were just layers between me and actually getting things done.</p>



<p class="wp-block-paragraph">Over the last few months I’ve been quietly simplifying how I work whilst away from my desk, and the result has been surprisingly dramatic. I’ve removed twelve productivity apps from my mobile device and replaced them with just three core tools:</p>



<ul class="wp-block-list">
<li>Outlook</li>



<li>Teams</li>



<li>ChatGPT</li>
</ul>



<p class="wp-block-paragraph">That’s it.</p>



<h2 class="wp-block-heading">The Death of the Mobile Productivity Stack</h2>



<p class="wp-block-paragraph">The original promise of productivity apps was compelling:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">“Capture everything.”<br>“Organise your life.”<br>“Never forget anything.”<br>“Manage work from anywhere.”</p>
</blockquote>



<p class="wp-block-paragraph">The problem is that most apps became destinations rather than assistants.</p>



<p class="wp-block-paragraph">You didn’t just <em>do work</em> anymore — you had to maintain the system that managed the work.</p>



<p class="wp-block-paragraph">Tasks needed tagging.<br>Notes needed organising.<br>Boards needed updating.<br>Projects needed grooming.<br>Templates needed maintaining.</p>



<p class="wp-block-paragraph">At some point, I realised I was spending more time curating productivity than benefiting from it.</p>



<h2 class="wp-block-heading">AI Changed the Equation</h2>



<p class="wp-block-paragraph">The big shift for me was the arrival of genuinely useful AI workflows.</p>



<p class="wp-block-paragraph">Before AI, structure mattered because software was rigid. If information wasn’t in exactly the right place, the tool became ineffective.</p>



<p class="wp-block-paragraph">Now? Context matters more than structure.</p>



<p class="wp-block-paragraph">ChatGPT can summarise.<br>It can extract actions.<br>It can draft responses.<br>It can organise thoughts.<br>It can build plans from unstructured conversations.<br>It can act as the connective tissue between fragmented information sources.</p>



<p class="wp-block-paragraph">That fundamentally changes how many apps you actually need.</p>



<h2 class="wp-block-heading">My Current Mobile Workflow</h2>



<h3 class="wp-block-heading">Outlook Becomes the Command Centre</h3>



<p class="wp-block-paragraph">Outlook handles:</p>



<ul class="wp-block-list">
<li>Email</li>



<li>Calendar</li>



<li>Meeting prep</li>



<li>Quick approvals</li>



<li>Team visibility</li>



<li>Prioritisation</li>
</ul>



<p class="wp-block-paragraph">Instead of exporting information into other systems, I now leave far more information where it naturally originates.</p>



<p class="wp-block-paragraph">An email thread is often the project history.<br>A meeting invite is often the task list.<br>A flagged message is often enough of a reminder.</p>



<p class="wp-block-paragraph">AI helps process information rather than forcing me to relocate it.</p>



<h2 class="wp-block-heading">Teams Handles Operational Awareness</h2>



<p class="wp-block-paragraph">Teams has effectively replaced several standalone collaboration tools for me.</p>



<p class="wp-block-paragraph">I use it for:</p>



<ul class="wp-block-list">
<li>Team communication</li>



<li>Status updates</li>



<li>Quick decision making</li>



<li>File access</li>



<li>Incident coordination</li>
</ul>



<p class="wp-block-paragraph">But more importantly, Teams gives me <em>context</em>.</p>



<p class="wp-block-paragraph">That matters far more than maintaining a perfect task hierarchy on a mobile screen.</p>



<h2 class="wp-block-heading">ChatGPT Is the Workflow Multiplier</h2>



<p class="wp-block-paragraph">This is the real difference maker.</p>



<p class="wp-block-paragraph">ChatGPT has become:</p>



<ul class="wp-block-list">
<li>My mobile thinking partner</li>



<li>My summarisation engine</li>



<li>My drafting assistant</li>



<li>My prioritisation tool</li>



<li>My “turn chaos into clarity” system</li>
</ul>



<p class="wp-block-paragraph">Instead of opening five apps to:</p>



<ul class="wp-block-list">
<li>capture notes,</li>



<li>organise tasks,</li>



<li>draft emails,</li>



<li>create summaries,</li>



<li>and prepare updates…</li>
</ul>



<p class="wp-block-paragraph">…I can now simply describe what I need.</p>



<p class="wp-block-paragraph">For example:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">“Summarise today’s customer escalation thread and produce actions for tomorrow.”</p>
</blockquote>



<p class="wp-block-paragraph">Or:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">“Turn these rough notes into a structured update for leadership.”</p>
</blockquote>



<p class="wp-block-paragraph">Or:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">“What are the key risks emerging from these conversations?”</p>
</blockquote>



<p class="wp-block-paragraph">That workflow reduction is enormous.</p>



<h2 class="wp-block-heading">Fewer Apps = Less Friction</h2>



<p class="wp-block-paragraph">What surprised me most wasn’t just convenience.</p>



<p class="wp-block-paragraph">It was cognitive reduction.</p>



<p class="wp-block-paragraph">Fewer icons.<br>Fewer notifications.<br>Fewer disconnected systems.<br>Fewer decisions about where information belongs.</p>



<p class="wp-block-paragraph">My phone now feels like a communication and decision-making tool again rather than a miniature admin console.</p>



<p class="wp-block-paragraph">There’s also something slightly ironic happening in the productivity software industry:<br>AI is making many productivity apps less necessary.</p>



<p class="wp-block-paragraph">A lot of tools existed primarily because humans had to manually structure information for software to understand it.</p>



<p class="wp-block-paragraph">Now software understands messy human input much better.</p>



<p class="wp-block-paragraph">That changes everything.</p>



<h2 class="wp-block-heading">Mobile Work Should Be Lightweight</h2>



<p class="wp-block-paragraph">I still believe deep work belongs on a proper workstation.</p>



<p class="wp-block-paragraph">But mobile work?<br>That should be:</p>



<ul class="wp-block-list">
<li>responsive,</li>



<li>lightweight,</li>



<li>contextual,</li>



<li>and fast.</li>
</ul>



<p class="wp-block-paragraph">The goal isn’t to recreate your desktop workflow on a six-inch screen.</p>



<p class="wp-block-paragraph">The goal is to stay informed, unblock people, make decisions, and keep momentum moving.</p>



<p class="wp-block-paragraph">Right now, Outlook + Teams + ChatGPT does that better for me than twelve fragmented productivity apps ever did.</p>



<p class="wp-block-paragraph">And honestly, I don’t miss any of them.</p>
<p><a href="https://www.wardnet.co.uk/simplifying-work-ditch-the-app-overload/">Simplifying Work: Ditch the App Overload</a></p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">732</post-id>	</item>
		<item>
		<title>From Curiosity to Capability: What My AI Learning Journey Has Actually Delivered</title>
		<link>https://www.wardnet.co.uk/from-curiosity-to-capability-what-my-ai-learning-journey-has-actually-delivered/</link>
		
		<dc:creator><![CDATA[Jonathan Ward]]></dc:creator>
		<pubDate>Tue, 28 Apr 2026 07:55:13 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[AIAssistant]]></category>
		<category><![CDATA[ChatGPT]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[Codex]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[Vibe coding]]></category>
		<guid isPermaLink="false">https://www.wardnet.co.uk/?p=727</guid>

					<description><![CDATA[<p>The exploration of AI in software delivery highlights its role as an enhancer rather than a replacement for developers. AI improves understanding, quality, and efficiency across various stages, especially within legacy systems. Key benefits include higher confidence in changes, accelerated onboarding, and effective modifications to tools, showcasing AI's potential for long-term integration in development processes.</p>
<p><a href="https://www.wardnet.co.uk/from-curiosity-to-capability-what-my-ai-learning-journey-has-actually-delivered/">From Curiosity to Capability: What My AI Learning Journey Has Actually Delivered</a></p>
]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading">Introduction</h1>



<p class="wp-block-paragraph">Over the past few weeks, I’ve been deliberately exploring how AI can support real-world software delivery—not as a novelty, but as a practical tool embedded into day-to-day engineering work.</p>



<p class="wp-block-paragraph">This hasn’t been about generating code for the sake of it. Instead, it’s been about applying AI across different types of ownership, complexity, and lifecycle stages of software. What’s emerged is a clearer picture: AI is most valuable not when it replaces development, but when it accelerates understanding, improves quality, and reduces friction.</p>



<p class="wp-block-paragraph">Here’s how that has played out in practice.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">1. Improving Code I Already Own</h2>



<p class="wp-block-paragraph">The easiest place to start was with code I had written myself—tools that are already in use and solving real problems.</p>



<p class="wp-block-paragraph">Because I understood the intent and behaviour of these applications, AI became a powerful second pair of eyes. I used it to:</p>



<ul class="wp-block-list">
<li>Generate unit tests for areas that had little or no coverage</li>



<li>Identify gaps in build and deployment pipelines</li>



<li>Highlight potential security concerns</li>



<li>Suggest refactoring opportunities for readability and maintainability</li>
</ul>



<p class="wp-block-paragraph">The result wasn’t dramatic rewrites. Instead, it was steady, compounding improvement:</p>



<ul class="wp-block-list">
<li>Higher confidence in changes due to better test coverage</li>



<li>More reliable builds and deployments</li>



<li>Reduced time spent on manual code reviews</li>



<li>Cleaner, more maintainable codebases</li>
</ul>



<p class="wp-block-paragraph">This is where AI felt most immediately productive—augmenting existing knowledge rather than trying to replace it.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">2. Making Sense of Legacy Systems</h2>



<p class="wp-block-paragraph">A more interesting challenge came from systems I hadn’t written—particularly those with limited documentation and where historical knowledge had faded over time.</p>



<p class="wp-block-paragraph">Here, AI acted less like a coding assistant and more like a translation layer.</p>



<p class="wp-block-paragraph">I used it to:</p>



<ul class="wp-block-list">
<li>Analyse unfamiliar code and explain intent</li>



<li>Generate technical documentation from existing implementations</li>



<li>Identify outdated dependencies and suggest upgrade paths</li>



<li>Propose test strategies for systems that had none</li>
</ul>



<p class="wp-block-paragraph">What would typically take days of manual exploration could be accelerated significantly. More importantly, it reduced the risk of “guesswork engineering”—making changes without fully understanding the system.</p>



<p class="wp-block-paragraph">Key outcomes included:</p>



<ul class="wp-block-list">
<li>Faster onboarding into legacy systems</li>



<li>Improved stability through better understanding</li>



<li>Reduced reliance on tribal knowledge</li>



<li>A foundation for future modernisation</li>
</ul>



<p class="wp-block-paragraph">This was one of the most valuable use cases: turning unknown systems into known ones.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">3. Tailoring the Tools I Use Every Day</h2>



<p class="wp-block-paragraph">Another unexpected benefit came from applying AI to open-source tools I use regularly.</p>



<p class="wp-block-paragraph">Instead of working around limitations or minor frustrations, I was able to:</p>



<ul class="wp-block-list">
<li>Explore the codebase quickly</li>



<li>Identify the root cause of issues</li>



<li>Implement targeted fixes or enhancements</li>
</ul>



<p class="wp-block-paragraph">AI reduced the barrier to entry for modifying third-party code. Tasks that might previously have felt too time-consuming or complex became achievable in a short space of time.</p>



<p class="wp-block-paragraph">The impact here was subtle but meaningful:</p>



<ul class="wp-block-list">
<li>Smoother day-to-day workflows</li>



<li>Faster resolution of small but persistent issues</li>



<li>Greater control over the tools I rely on</li>
</ul>



<p class="wp-block-paragraph">It shifted the mindset from “adapting to tools” to “adapting tools to fit the way I work.”</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">4. Reviving Older, Customer-Facing Solutions</h2>



<p class="wp-block-paragraph">Some of the most challenging scenarios involved older solutions that are still in use but no longer actively developed.</p>



<p class="wp-block-paragraph">These tend to surface through support cases or escalations, often requiring rapid understanding and targeted fixes.</p>



<p class="wp-block-paragraph">AI proved particularly useful in:</p>



<ul class="wp-block-list">
<li>Interpreting older coding patterns and structures</li>



<li>Diagnosing issues from limited context</li>



<li>Suggesting safe, minimal changes to resolve problems</li>



<li>Documenting behaviour that had never been formally captured</li>
</ul>



<p class="wp-block-paragraph">This led to:</p>



<ul class="wp-block-list">
<li>Faster resolution times for complex issues</li>



<li>Fewer repeat incidents</li>



<li>Increased confidence when working in fragile codebases</li>
</ul>



<p class="wp-block-paragraph">Rather than treating these systems as untouchable, AI made them accessible again.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">5. Enhancing Actively Maintained Solutions</h2>



<p class="wp-block-paragraph">Finally, I applied the same approaches to modern, actively maintained solutions—where expectations around quality, security, and consistency are much higher.</p>



<p class="wp-block-paragraph">In this space, AI supported:</p>



<ul class="wp-block-list">
<li>Continuous improvement of test coverage</li>



<li>Ongoing security reviews</li>



<li>Documentation generation and updates</li>



<li>Ensuring alignment with current platform standards</li>
</ul>



<p class="wp-block-paragraph">The key difference here is that AI becomes part of the development lifecycle, not just a one-off tool.</p>



<p class="wp-block-paragraph">Benefits included:</p>



<ul class="wp-block-list">
<li>More consistent quality across releases</li>



<li>Faster delivery of enhancements</li>



<li>Improved confidence in production changes</li>



<li>Better alignment with evolving standards</li>
</ul>



<p class="wp-block-paragraph">This is where AI starts to feel like a long-term capability rather than a short-term productivity boost.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">What I’ve Learned</h2>



<p class="wp-block-paragraph">Across all of these scenarios, a few consistent themes have emerged.</p>



<h3 class="wp-block-heading">1. AI Accelerates Understanding More Than It Replaces Thinking</h3>



<p class="wp-block-paragraph">The biggest gains came from reducing the time it takes to understand code—not from blindly generating it.</p>



<h3 class="wp-block-heading">2. Context Still Matters</h3>



<p class="wp-block-paragraph">AI is most effective when you can validate its output. The better your understanding of the system, the more value you get.</p>



<h3 class="wp-block-heading">3. Small Improvements Compound Quickly</h3>



<p class="wp-block-paragraph">Adding tests, improving pipelines, and tightening security might seem incremental, but together they significantly improve delivery confidence.</p>



<h3 class="wp-block-heading">4. Legacy Work Is Where AI Shines</h3>



<p class="wp-block-paragraph">The less documented and more complex a system is, the more impact AI can have in making it accessible again.</p>



<h3 class="wp-block-heading">5. It Changes What Feels “Worth Doing”</h3>



<p class="wp-block-paragraph">Tasks that previously felt too time-consuming—like fixing minor issues in third-party tools or documenting old systems—suddenly become viable.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Where This Goes Next</h2>



<p class="wp-block-paragraph">This is still early in the journey, but the direction is clear.</p>



<p class="wp-block-paragraph">AI is not just a coding assistant—it’s becoming a core part of how we:</p>



<ul class="wp-block-list">
<li>Understand systems</li>



<li>Maintain quality</li>



<li>Reduce risk</li>



<li>Deliver improvements faster</li>
</ul>



<p class="wp-block-paragraph">The next step is to move from individual use to repeatable patterns—embedding these approaches into team workflows, standards, and expectations.</p>



<p class="wp-block-paragraph">Because the real value isn’t just in what AI can do—it’s in how consistently we can apply it.</p>
<p><a href="https://www.wardnet.co.uk/from-curiosity-to-capability-what-my-ai-learning-journey-has-actually-delivered/">From Curiosity to Capability: What My AI Learning Journey Has Actually Delivered</a></p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">727</post-id>	</item>
		<item>
		<title>5 Useful SendGrid Tips</title>
		<link>https://www.wardnet.co.uk/5-useful-sendgrid-tips/</link>
		
		<dc:creator><![CDATA[Jonathan Ward]]></dc:creator>
		<pubDate>Sat, 09 May 2020 14:59:24 +0000</pubDate>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[SendGrid]]></category>
		<guid isPermaLink="false">https://www.wardnet.co.uk/?p=607</guid>

					<description><![CDATA[<p>I recently started working on a concept of a message list subscription service, to be integrated directly into new product</p>
<p><a href="https://www.wardnet.co.uk/5-useful-sendgrid-tips/">5 Useful SendGrid Tips</a></p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I recently started working on a concept of a message list subscription service, to be integrated directly into new product features so that people can add themselves to the list to receive information of updates on specific features. This led me down the path of using Azure Storage and SendGrid, building 2 raw prototype apps (in WinForms at this early stage) to achieve both the subscription and the sending out of data to the subscribers. Writing this on.NetFramework 4.8 with C# in a fairly native way has given me a great way to investigate and utilise the SendGrid platform to send emails to multiple subscribers. </p>



<p class="wp-block-paragraph">I wanted to share my findings, rather than my code at this stage, and here are my Top 5 SendGrid tips:</p>



<ol class="wp-block-list"><li>Do review Microsoft&#8217;s guide on how to get started with SendGrid via Azure, this simple article gives you a great base on how to set up the back-end and start writing C# around it: <a rel="noreferrer noopener" href="https://docs.microsoft.com/en-us/azure/sendgrid-dotnet-how-to-send-email" target="_blank">https://docs.microsoft.com/en-us/azure/sendgrid-dotnet-how-to-send-email</a></li><li>Use Unsubscribe groups &#8211; these allow you to stay within GDPR in Europe, appending an Unsubscribe and Manage Preferences link to the bottom of the emails that are sent. i.e. </li></ol>



<div class="wp-block-image"><figure class="aligncenter size-large"><img data-recalc-dims="1" decoding="async" width="332" height="47" data-attachment-id="608" data-permalink="https://www.wardnet.co.uk/5-useful-sendgrid-tips/image/" data-orig-file="https://i0.wp.com/www.wardnet.co.uk/wp-content/uploads/2020/05/image.png?fit=332%2C47&amp;ssl=1" data-orig-size="332,47" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/www.wardnet.co.uk/wp-content/uploads/2020/05/image.png?fit=332%2C47&amp;ssl=1" src="https://i0.wp.com/www.wardnet.co.uk/wp-content/uploads/2020/05/image.png?resize=332%2C47&#038;ssl=1" alt="" class="wp-image-608" srcset="https://i0.wp.com/www.wardnet.co.uk/wp-content/uploads/2020/05/image.png?w=332&amp;ssl=1 332w, https://i0.wp.com/www.wardnet.co.uk/wp-content/uploads/2020/05/image.png?resize=300%2C42&amp;ssl=1 300w" sizes="(max-width: 332px) 100vw, 332px" /><figcaption>Unsubscribe preferences from SendGrid</figcaption></figure></div>



<ol class="wp-block-list" start="3"><li>Write both plain text and HTML content for your email, I ended up creating an HTML builder so I could convert Email addresses to <code><code data-enlighter-language="html" class="EnlighterJSRAW">&lt;a href="mailto:EmailAddress"></code></code> and any HTTP(s):// links to <code><code data-enlighter-language="html" class="EnlighterJSRAW">&lt;a href:"http://link"></code></code> this was a great experiment with regular expressions. Note, I found that not all Email clients auto-convert, e.g. Outlook will convert an Email address but not a URL. I was creating my body text in a Rich Text Box, so it was just one big string!</li><li>Look into Personalisations (<a href="https://sendgrid.com/docs/for-developers/sending-email/personalizations/" target="_blank" rel="noreferrer noopener">https://sendgrid.com/docs/for-developers/sending-email/personalizations/</a>) these are crucial if you want to customise your output (the emails themselves). I created variables to use in subject and body lines so I could pass in <code><code data-enlighter-language="csharp" class="EnlighterJSRAW">{customer}</code></code> and<code> </code><code data-enlighter-language="csharp" class="EnlighterJSRAW">{product}</code>. SendGrid has a substitution capability which comes as part of personalisation. I&#8217;ll share a snippet of code here, as I found a solution on StackOverflow (<a href="https://stackoverflow.com/a/53292550" target="_blank" rel="noreferrer noopener">https://stackoverflow.com/a/53292550</a>) but it needed a slight tweak, changing the <code><code data-enlighter-language="csharp" class="EnlighterJSRAW">Tos.Add</code></code> to a <code><code data-enlighter-language="csharp" class="EnlighterJSRAW">msg.AddTo</code></code> as the To: Email address needs to be a part of the personalisation, I wasn&#8217;t sure if this was to do with API changes or not! Another tip, if you want the subject to be the same, without substitutions you can use the <code><code data-enlighter-language="csharp" class="EnlighterJSRAW">SetGlobalSubject</code></code> method</li></ol>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:100%">
<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:100%">
<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:100%">
<pre class="wp-block-code"><code lang="csharp" class="language-csharp line-numbers"><code data-enlighter-language="csharp" class="EnlighterJSRAW">var personalizationIndex = 0;
                foreach (var subscriber in subscriberEntities)
                {
                    msg.AddTo(new EmailAddress(subscriber.RowKey, subscriber.Name), personalizationIndex);
                    msg.AddSubstitution("{product}", product.Description, personalizationIndex);
                    msg.AddSubstitution("{customer}", subscriber.Name, personalizationIndex);
                    personalizationIndex++;
                    
                }</code></code></pre>



<p class="wp-block-paragraph"></p>
</div>
</div>
</div></div>
</div>
</div>
</div>
</div>



<ol class="wp-block-list" start="5"><li>Create a test email method, that uses the same logic as your core one, but only sends to one email address. You don&#8217;t want to be sending bulk emails out without checking them first!</li></ol>



<p class="wp-block-paragraph">I hope this new style of thread has been an interesting read, I hope to do more very soon!</p>
<p><a href="https://www.wardnet.co.uk/5-useful-sendgrid-tips/">5 Useful SendGrid Tips</a></p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">607</post-id>	</item>
		<item>
		<title>Q1 FY20 Part 2</title>
		<link>https://www.wardnet.co.uk/q1-fy20-part-2/</link>
		
		<dc:creator><![CDATA[Jonathan Ward]]></dc:creator>
		<pubDate>Sat, 28 Dec 2019 12:07:32 +0000</pubDate>
				<category><![CDATA[Admin]]></category>
		<category><![CDATA[Career]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[project]]></category>
		<guid isPermaLink="false">https://www.wardnet.co.uk/?p=596</guid>

					<description><![CDATA[<p>Welcome to Part 2 of the end of year summary on the career side of things. 2019 ended on a</p>
<p><a href="https://www.wardnet.co.uk/q1-fy20-part-2/">Q1 FY20 Part 2</a></p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Welcome to Part 2 of the end of year summary on the career side of things. 2019 ended on a high at work, and the previous post <a href="https://www.wardnet.co.uk/q1-fy20-part-1/">(here)</a> started looking at the new job role and my initial project of migrating systems between domains. This project was effectively a merge of all my previous skills and a way to develop my new skillset required to take the role forwards into 2020 and beyond.</p>



<p class="wp-block-paragraph">It was mentioned in part one that the infrastructure project effectively became a DevOps implementation project, and I&#8217;ll try to delve into the bits I can discuss in this post. Firstly there&#8217;s the inheritance; over 300 environments, many with specific mods for specific customers, and the remaining with what we call &#8220;Extended Solutions&#8221; &#8211; productized mods effectively. Then there was all the code itself, fortunately, the existing dev team has a fantastic grasp of the deep dark secrets of Git and I have enough of a basic understanding to pick up where others left off, but then, something new to myself came out, and that was the builds of the code. Debug or Release, MSBuild versions, semantic versioning, Git Flow&#8230; you get the idea. All very complicated to me at the time, but now it&#8217;s in my veins!</p>



<p class="wp-block-paragraph">Previously the team used an old, unsupported, broken version of Jenkins to build their code, with definitions for each Git Branch, some with bat files, some hardcoded in the Jenkins config screen, basically a mess, and different rules for different people. Well, I like to standardize, so we scrapped the old, and brought in the new. Cue the amazing concept that is Continuous Integration. Having some basic experience with this in Azure DevOps (<a href="https://www.wardnet.co.uk/code/">remember this post?</a>) the concept was not new, however, implementing with Jenkins was a new experience. I managed to inherit a new blank Jenkins server, but first thing I did was reverse proxy via IIS and get it secured with an internal SSL certificate, as well as connect up to the Corporate Active Directory and restrict to our team only, then we got a service account from Corp IT and locked the server down, only myself and Domain Admins can get into the back end, and now we have a secured build server. Why so secure when it&#8217;s all internal? Well, that&#8217;s because the CTO office allowed us to have the corporate digital cert for code signing so long as it only existed in one, locked-down place. We can call it via the Jenkins application side but not extract, manipulate or otherwise interact with it. With this new updated (and updateable) Jenkins server, plus a couple of useful plugins (<a href="https://jenkins.io/projects/blueocean/">Blue Ocean</a> is a must) we have a fantastic platform to manage and analyze our build process. The main feature we are utilizing is the Multibranch Pipelines via Jenkinsfile. This Jenkinsfile is written in groovy and is basically a set of instructions that define a build, for example, we can say build this solution, sign using that certificate and publish the artifacts so we can download afterward. The huge advantage for us is because we build a solution for multiple ERP versions, we can have up to 8 exes output at the end, and we now have one screen to grab them from, regardless of what Git branch we built for. On the subject of Git branches, due to the multibranch pipeline functionality, once our Jenkinsfile is pulled into Master, it will then filter down to all subsequent branches, and with this feature enabled, Jenkins will detect any new branches that were pushed back to the origin with that Jenkinsfile includes. I&#8217;ve previously written about VS Code and all the wondrous things it does, but we also discovered a Jenkinsfile checker in the form of <a href="https://marketplace.visualstudio.com/items?itemName=janjoerke.jenkins-pipeline-linter-connector">https://marketplace.visualstudio.com/items?itemName=janjoerke.jenkins-pipeline-linter-connector</a>. This tool allows us to check syntax, against our own Jenkins server and therefore ensures an accurate rule definition every time we adjust a build. It&#8217;s time-savers like these that have boosted the team&#8217;s productivity significantly, I recently <a href="https://twitter.com/jaward916/status/1199670272858701824">tweeted</a> about this improvement, as I took hold of an existing codebase and fully integrated it into our new philosophy within an hour or so!</p>



<p class="wp-block-paragraph">A large part of the battle has been documenting the configuration and the overall process as well as educating colleagues (primarily developers) about how we are using these concepts and tools. I&#8217;ve found the majority of developers know the concepts and will have their own experiences with Git and CI/CD but until you document what the process should be in the exact circumstances, they don&#8217;t necessarily see the advantages or understand just how powerful these changes are, and more importantly how it improves consistency and productivity across the team. The improvements are already showing for us, and I fully expect that to continue!</p>



<p class="wp-block-paragraph">Some reference material for a few of the things discussed in the post above:</p>



<ul class="wp-block-list"><li><a href="https://jenkins.io/doc/book/pipeline/multibranch/">Jenkins Multibranch pipelines</a></li><li><a href="https://wiki.jenkins.io/display/JENKINS/Running+Jenkins+behind+IIS">Jenkins behind IIS Reverse Proxy</a></li><li><a href="https://www.c-sharpcorner.com/article/continuous-integration-for-net-projects-with-jenkins/">Jenkins CI for .Net </a></li><li><a href="https://blog.dangl.me/archive/basic-jenkins-configuration-for-dotnet-continuous-integration/">Basic Jenkins for .Net CI</a></li><li><a href="https://git-scm.com/about">Git Intro</a></li><li><a href="https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow">Git Flow</a></li><li><a href="https://www.atlassian.com/software/bitbucket/download">Bitbucket Server</a> (incumbent Git server)</li><li><a href="https://sourcetreeapp.com/?v=win">Sourcetree </a>(preferred Git UI tool)</li><li><a href="https://git-fork.com/">Fork </a>(alternate Git UI tool)</li></ul>



<p class="wp-block-paragraph"></p>
<p><a href="https://www.wardnet.co.uk/q1-fy20-part-2/">Q1 FY20 Part 2</a></p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">596</post-id>	</item>
		<item>
		<title>Q1 FY20 Part 1</title>
		<link>https://www.wardnet.co.uk/q1-fy20-part-1/</link>
					<comments>https://www.wardnet.co.uk/q1-fy20-part-1/#comments</comments>
		
		<dc:creator><![CDATA[Jonathan Ward]]></dc:creator>
		<pubDate>Thu, 19 Dec 2019 09:57:45 +0000</pubDate>
				<category><![CDATA[Career]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Epicor]]></category>
		<category><![CDATA[domain]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[migrations]]></category>
		<category><![CDATA[UK]]></category>
		<guid isPermaLink="false">https://www.wardnet.co.uk/?p=592</guid>

					<description><![CDATA[<p>Back on October 1st 2019 I decided to take a leap of faith and join the dark side, this has</p>
<p><a href="https://www.wardnet.co.uk/q1-fy20-part-1/">Q1 FY20 Part 1</a></p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Back on October 1st 2019 I decided to take a leap of faith and join the dark side, this has resulted in me becoming the UK&#8217;s first dedicated QA for our Custom development teams. Effectively we develop, using our own SDK and lots of other clever tools, the things that customers would love to have, but which do not come out of the box. Having visited many customer sites in the last couple of years, I have nothing but appreciation for the quality and depth of work this team produces, and it&#8217;s absolutely my pleasure to be a part of it going forwards.</p>



<p class="wp-block-paragraph">My first task, set on Day 1 was to own the migration of systems from one domain to the other. Those who have followed any of my previous posts in the last 4 years will be aware I went from small local company to global ERP vendor overnight (June 1st 2016) by way of an acquisition. Well imagine moving that small dev team&#8217;s environments into a very well protected and governed American corporate ecosystem, it was effectively sat on for 3 years, and corporate policies dictated we migrated and shutdown the old!</p>



<p class="wp-block-paragraph">Deciding where to start was easy&#8230; Spend a week or so working on testing out a couple of theories, having done domain migrations previously, and work with internal IT teams to put in the relevant requests and procedures to ensure those theories are robust, scalable and secure. Three weeks in and hours had been wasted scripting out a copy and paste scenario, basically a load of PowerShell scripts to do Find/Replace style blitz across 1000s of files, 10 different ERP versions, 200+ development environments (with Databases). Only the one slight snag, even after reworking permissions and roping IT into a 3TB file copy across 2 unconnected domains&#8230;. Internally developed environmnent management tooling, which with all its bells and whistles, was not supportive of the new domain, and had hardcoded ties to the older domain&#8217;s file server, oops.</p>



<p class="wp-block-paragraph">Rethink time&#8230; Plan B &#8211; the best of the lot. Copying databases is one of those things I literally wrote the manual on for Epicor ERP, so that&#8217;s easy; building Windows servers has been the last 10 years of my life, so again, sorted; that leaves my understanding of the tooling that sits in the middle, well, fortunately, my new desk backs on to the lovely chap who wrote that tool, even though he now runs our R&amp;D division, so with a few conversations and about 8 lines of code he rebuilt it for me to work on the new environments, allowing me to fully document it as it got deployed and hey presto, a working blank set of servers ready for migrated data was born within a week; including the ability to build any version of ERP 10, using blank, demo or customer data &#8211; depending on whether it&#8217;s development or QA work, and the ability to use all the latest features and more importantly the latest development tools, by way of Chocolatey!</p>



<p class="wp-block-paragraph">The next few weeks consisted of identifying what needed to be moved, and what we could spin up later <g class="gr_ gr_10 gr-alert gr_spell gr_inline_cards gr_disable_anim_appear ContextualSpelling ins-del multiReplace" id="10" data-gr-id="10">on demand</g>, the resulting list was around 120 required environments, mostly because of <g class="gr_ gr_12 gr-alert gr_spell gr_inline_cards gr_disable_anim_appear ContextualSpelling multiReplace" id="12" data-gr-id="12">productised</g> &#8220;Extended Solutions&#8221; which need to be built for each version of ERP 10 we support. But also ongoing customer projects, version uplifts, test environments for developers to test their own theories and boost their skills <g class="gr_ gr_18 gr-alert gr_gramm gr_inline_cards gr_disable_anim_appear Punctuation only-ins replaceWithoutSep" id="18" data-gr-id="18">etc</g>. This was a very slow and involved process, per Environment/DB it was not too bad, but in Part 2 (when I write it) I&#8217;ll go through how my domain migration project became an environment and process improvement project, featuring Git, Jenkins, CI/CD and </p>



<p class="wp-block-paragraph">The good news is my Domain Migration which we scheduled to be fully complete, i.e old domain shut down for 24th December 2019, was in fact completed on 6th December 2019, so despite the slightly wasted 3 weeks of testing, scripting, and familiarisation, with all parties on board we (sadly) shutdown the Dot Net IT domain at 17:30 that evening!</p>
<p><a href="https://www.wardnet.co.uk/q1-fy20-part-1/">Q1 FY20 Part 1</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.wardnet.co.uk/q1-fy20-part-1/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">592</post-id>	</item>
		<item>
		<title>This and That</title>
		<link>https://www.wardnet.co.uk/this-and-that/</link>
		
		<dc:creator><![CDATA[Jonathan Ward]]></dc:creator>
		<pubDate>Tue, 26 Jun 2018 08:00:24 +0000</pubDate>
				<category><![CDATA[Career]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Epicor]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[environments]]></category>
		<category><![CDATA[ERP]]></category>
		<category><![CDATA[IBM]]></category>
		<category><![CDATA[ISV]]></category>
		<category><![CDATA[websites]]></category>
		<guid isPermaLink="false">https://www.wardnet.co.uk/?p=538</guid>

					<description><![CDATA[<p>Over the last few month I&#8217;ve tried to expand my horizons a little bit. Since 2009 I have worked in</p>
<p><a href="https://www.wardnet.co.uk/this-and-that/">This and That</a></p>
]]></description>
										<content:encoded><![CDATA[<p>Over the last few month I&#8217;ve tried to expand my horizons a little bit. Since 2009 I have worked in a few different technical roles, from helping to run data centres, and setup environments for ISV engagements at IBM, to running all systems for a rapidly growing Oracle partner, whilst on the side managing 100 websites including e-commerce sites. That led into my quick stint doing tech support in the Automotive sector before moving into customer facing roles in Jan 2016. Since then I&#8217;ve always been running on a few different threads, these have been, loosely:</p>
<ul>
<li>Installs/Config for ERP systems including initial system design</li>
<li>Technical training of customers in those ERP systems</li>
<li>Technical management of escalated issues (across the world)</li>
<li>Cross-team liason for high profile or highly escalated customers</li>
<li>Coordination of international team of installations consultants</li>
<li>Development of internal tooling for installs/ technical consulting</li>
<li>Management of environments for wider team</li>
</ul>
<p>From my recent posts it&#8217;s obvious which areas on that list have received the most focus over the last few months, notably the last two, which is where all the DevOps/Code posts are centred around. The reason so much focus has been on this, and I&#8217;ll add at this point a lot of it out of work hours, is because it&#8217;s something I enjoy, something I&#8217;ve been on the edge of before, and an area of technology that I personally believe we should all be at least aware of, and able to understand the basic principles of.</p>
<p>DevOps was a term coined many years before it became mainstream. Mike Loukides wrote a 20 page book called &#8220;What is DevOps&#8221; back in June 2012, which is published by the world renowned O&#8217;Reilly Media. (http://shop.oreilly.com/product/0636920026822.do) That&#8217;s some time before I came across the term, although it seems I was already aware of some of the practices that now come under that umbrella. Back then I was managing E-Commerce sites, writing PHP websites against MySQL databases and moving a very static, cumbersome &#8220;tin-factory&#8221; infrastructure over to more dynamic, sustainable growth-capable platform. With a little more time and knowledge at that time I would&#8217;ve potentially moved in different directions. I am now starting to close that circle a little from the other side.</p>
<p>For me, career development is crucial, I am more than happy to stay with one company, or in one role, but I will always push to make more of myself, learn new things, get involved with everything possible and break down any and all barriers. I don&#8217;t do this to benefit myself, I see it as an opprtunity for me to be a benefit to those around me, both customers and colleagues.</p>
<p>Outside of DevOps activities over the recent months I&#8217;ve also been working on my presentation skills, with opportunities to present to colleagues and customers about various technical topics, including System Adminstration, upcoming product changes, best practices etc. This is in part due to being given more free reign with my current role, while we work out what my future roles may or may not include, and that&#8217;s if any change at all! In the background, the day to role keeps me busy, planning installs, speaking to new customers about how to deploy, speaking to existing customers about upgrades or enhancements to their systems, all the fun stuff that keeps money in the bank and roofs over heads!</p>
<p>The next few months may get a little busy, well hopefully they will, and all the good stuff will be posted when the chances arise.</p>
<p><a href="https://www.wardnet.co.uk/this-and-that/">This and That</a></p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">538</post-id>	</item>
		<item>
		<title>#Code</title>
		<link>https://www.wardnet.co.uk/code/</link>
		
		<dc:creator><![CDATA[Jonathan Ward]]></dc:creator>
		<pubDate>Tue, 29 May 2018 08:30:04 +0000</pubDate>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Epicor]]></category>
		<category><![CDATA[PowerShell]]></category>
		<category><![CDATA[CD]]></category>
		<category><![CDATA[CI]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[https]]></category>
		<category><![CDATA[installation]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[Pester]]></category>
		<category><![CDATA[scripting]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[sysadmin]]></category>
		<category><![CDATA[VSTS]]></category>
		<guid isPermaLink="false">https://www.wardnet.co.uk/?p=531</guid>

					<description><![CDATA[<p>First things first, #notadeveloper. I cannot stress this enough, I am not trained to write code, neither am I employed</p>
<p><a href="https://www.wardnet.co.uk/code/">#Code</a></p>
]]></description>
										<content:encoded><![CDATA[<p>First things first, #notadeveloper. I cannot stress this enough, I am not trained to write code, neither am I employed to do so. However, I do enjoy writing code, I find a lot of satisfaction in hitting the run button and watching something I wrote come alive. Previously I have posted many tweets and blog entries of my coding adventures over the years. My crowing achievement to date is probably the PHP/MySQL based &#8220;Asset Management&#8221; system, a glorified inventory list ability to Assign to a person, and add a list of repairs or reinstalls against the items. It automated a part of my job I disliked, and quite frankly that is exactly what I love about code. Almost all of the scripts I have written over the years have had the primary purpose of automating repetitive tasks any sysadmin can do with their eyes closed, mostly this has been silent install scripts and updaters.</p>
<p>Fast forward on a little from my sysadmin days, and to the brave new world (for me) of ERP. My primary day job is planning, coordinating and performing installations of ERP software into all sorts of manufacturing and distribution companies. Some are small, many are large, so the nature of, the deployments can vary slightly. That&#8217;s generally the bit I&#8217;m good at; sizing and planning the system to meet size and expectations of the end users. What we found over the last 2 years is that whilst deployments vary slightly, there is a bulk of work that is virtually the same every time round, certainly in process if not inputs, however we found that amongst the team; time, accuracy and experience could vary, significantly in some cases. Therefore a colleague of mine, with vastly more years experience in product and process went to the efforts to write an automation tool, a set of PowerShell scripts and XML files used to automate the bulk of the installation process. Roll on a few months and instantly accuracy and time were improving, which in turn was improving everyone&#8217;s experience. Gone were the days of random (user) errors and here are the days of productivity and valid errors which have much, much more context!</p>
<p>&nbsp;</p>
<p>So let&#8217;s get techy on this and roll on a little further in time; following a few changes, ownership of the tool is now with me. And with a potentially different future ahead, it may only be a short term thing (it may also be long term!), so with this in mind, I sought help of people who know what they are doing, exceptionally smart developers in this case. After a couple of remote session the following has occurred:</p>
<p><b>Task 1</b> &#8211; Get the code secured. We can&#8217;t have something this crucial to our process hiding on a random VM with no backups.</p>
<p><b>Solution &#8211; </b>&nbsp;Git based code repository, in this case Visual Studio Team Services (VSTS)</p>
<p>&nbsp;</p>
<p><b>Task 2</b> &#8211; Get the additional features into the code, but fully tested before deploying.</p>
<p><b>Solution </b>&#8211; Branch off. Currently running with 2 branches, one for immediate fixes/quick additions, and one for next revision which will do far more than just&nbsp; installing (Shhhh it&#8217;s Top Secret)</p>
<p>&nbsp;</p>
<p><b>Task 3</b> &#8211; Get the code tidied up, to some form of best practices etc.</p>
<p><b>Solution</b> &#8211; VSTS Build running PowerShell scripts with Pester and PowerShell Script Analyzer to validate all PowerShell scripts against a set of generally accepted best practice rules.</p>
<p>&nbsp;</p>
<p><b>Task 4 &#8211; </b>Packaging. No one wants to manually build a zip file, upload it to a SharePoint site and email out a notification for every small fix that goes in</p>
<p><b>Solution </b>&nbsp;&#8211; NuGet and Chocolatey via a VSTS Package Feed.</p>
<p>&nbsp;</p>
<p>Since this became my problem, three versions of the tooling have been released, packaging only got tested this week so isn&#8217;t the primary deployment method yet, but now we have it as a capability there will be many more versions, but that just wont matter as they will always have whatever is the latest in the master branch!</p>
<p>&nbsp;</p>
<p>Ok so that all explains my random tweets from evenings and weekends over the last month or so, fortunately I&#8217;ve had some incredible guidance from some very skilled and friendly development colleagues. Without those guys, I wouldn&#8217;t be anywhere with all this other than a whole load of files and folders on one machine with no backups!</p>
<p>&nbsp;</p>
<p>I&#8217;d also like to give back to the community a little, so I plan to have some scripts that I write for more generic tasks uploaded to a public facing Git at <a href="https://github.com/jaward916">https://github.com/jaward916</a> further to that I have below added a list of all the bookmarks I&#8217;ve been building up, especially the ones around Tasks 3 and 4, which has been the key functionality I&#8217;ve explored and implemented in the last week.</p>
<p>&nbsp;</p>
<p>I stress once again, I am not a developer, please do not laugh at my code, or my very basic explanations of the tools and processes, I am learning for fun, but developing to make everyone&#8217;s lives a little easier in my world!</p>
<p>&nbsp;</p>
<p><b>Bookmarks for VSTS</b></p>
<ul>
<li><a href="https://www.visualstudio.com/vso/">https://www.visualstudio.com/vso/</a> &#8211; Starting point for VSTS</li>
<li><a href="https://code.visualstudio.com/">https://code.visualstudio.com/</a> &#8211; now my development tool of choice for writing and testing the scripts, lightweight and extendable/modular. Notepad++ is still my text editor of choice when analysing large logs or XML files i.e. One offs, but VS Code allows me to have workspaces, as well as sync automatically back to VSTS with an official plugin.</li>
<li><a href="https://docs.microsoft.com/en-us/vsts/git/use-ssh-keys-to-authenticate?view=vsts">https://docs.microsoft.com/en-us/vsts/git/use-ssh-keys-to-authenticate?view=vsts</a> &#8211; For how to connect to your VSTS Repository once it&#8217;s setup</li>
<li><a href="https://docs.microsoft.com/en-us/vsts/git/tutorial/pulling?view=vsts&amp;tabs=visual-studio">https://docs.microsoft.com/en-us/vsts/git/tutorial/pulling?view=vsts&amp;tabs=visual-studio</a> &#8211; For moving code between branches</li>
<li><a href="https://github.com/pester/Pester/wiki/Pester">https://github.com/pester/Pester/wiki/Pester</a> &#8211; Pester project on GitHub for testing PowerShell code</li>
<li><a href="https://workingsysadmin.com/invoking-pester-and-psscriptanalyzer-tests-in-hosted-vsts/">https://workingsysadmin.com/invoking-pester-and-psscriptanalyzer-tests-in-hosted-vsts/</a> &#8211; This one is <b>the</b> tutorial for invoking pester and making use of it with VSTS</li>
<li><a href="https://docs.microsoft.com/en-us/vsts/package/get-started-nuget?view=vsts">https://docs.microsoft.com/en-us/vsts/package/get-started-nuget?view=vsts</a> &#8211; This one was crucial for the packaging element with NuGet</li>
<li><a href="https://chocolatey.org/install">https://chocolatey.org/install</a> &#8211; how to install Choco, really simple, but guides help!</li>
<li><a href="https://roadtoalm.com/2017/05/02/using-vsts-package-management-as-a-private-chocolatey-gallery/">https://roadtoalm.com/2017/05/02/using-vsts-package-management-as-a-private-chocolatey-gallery/</a> &#8211; This helped a lot with getting Chocolatey installed and the package deployed from my VSTS feed</li>
<li><a href="https://docs.microsoft.com/en-us/vsts/package/nuget/nuget-exe?view=vsts#add-a-feed-to-nuget-2">https://docs.microsoft.com/en-us/vsts/package/nuget/nuget-exe?view=vsts#add-a-feed-to-nuget-2</a> &#8211; you need this if you hit issues with Chocolatey not liking your feed version!</li>
</ul>
<p><a href="https://www.wardnet.co.uk/code/">#Code</a></p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">531</post-id>	</item>
	</channel>
</rss>
