<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: José Coelho</title>
    <description>The latest articles on Forem by José Coelho (@jcoelho).</description>
    <link>https://forem.com/jcoelho</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F110690%2F763ea511-8e7e-4433-9e16-1ad0f89aa5d2.jpeg</url>
      <title>Forem: José Coelho</title>
      <link>https://forem.com/jcoelho</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/jcoelho"/>
    <language>en</language>
    <item>
      <title>5 DevOps tools to boost your open source project</title>
      <dc:creator>José Coelho</dc:creator>
      <pubDate>Thu, 19 Mar 2020 00:10:05 +0000</pubDate>
      <link>https://forem.com/jcoelho/5-devops-tools-to-boost-your-open-source-project-3nbp</link>
      <guid>https://forem.com/jcoelho/5-devops-tools-to-boost-your-open-source-project-3nbp</guid>
      <description>&lt;p&gt;Nowadays if you want your open source project to thrive, attract contributors and get traction among the community, there's no doubt, you need to have basic CI/CD - or any other continuous - processes implemented.&lt;/p&gt;

&lt;p&gt;Any open source contributions that you put out there should be backed by processes to make sure they are valid and working.&lt;/p&gt;

&lt;p&gt;Whether it's a web application, a new Docker image, a mobile app, an Ansible role, etc., you should always have your work double-checked, and there are tons of free and easy to use tools to help you.&lt;/p&gt;

&lt;p&gt;Here are 5 tools that I use and recommend for your next contributions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Circle CI
&lt;/h2&gt;

&lt;p&gt;Let's start with the basic and the base of a stable and trustworthy codebase - implementing a CI pipeline.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://circleci.com/" rel="noopener noreferrer"&gt;Circle CI&lt;/a&gt; is a cloud-native CI/CD tool, that lets you quickly set up a CI pipeline for your projects.&lt;/p&gt;

&lt;p&gt;Just register your project on Circle CI and add a &lt;code&gt;config.yml&lt;/code&gt; inside the &lt;code&gt;.circleci&lt;/code&gt; folder on the root of your project repository and you're done.&lt;/p&gt;

&lt;p&gt;For example, a simple Gradle project can be set up with the following &lt;code&gt;config.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;docker&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;circleci/openjdk:8-jdk&lt;/span&gt;
        &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;checkout&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mvn compile&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are a lot of other similar tools, I usually use CircleCI but any other tool should do the job.&lt;/p&gt;

&lt;h2&gt;
  
  
  Codacy
&lt;/h2&gt;

&lt;p&gt;As your project starts to get traction, and more and more contributions, you should have a gatekeeper on every pull request to make sure the quality of your code does not go down.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.codacy.com/" rel="noopener noreferrer"&gt;Codacy&lt;/a&gt; is a great tool for that, it scans your code and detects code smells, technical debt, bugs and helps you maintain a healthy codebase in general.&lt;/p&gt;

&lt;p&gt;It's very easy to integrate into your current workflow and gives you great insights into your code with graphs pinpointing the most problematic areas of your code.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Snyk
&lt;/h2&gt;

&lt;p&gt;Any project is vulnerable to security issues, especially if it's using third-party libraries. &lt;a href="https://snyk.io/" rel="noopener noreferrer"&gt;Snyk&lt;/a&gt; is your best friend in this situation, it will scan your project dependencies and report any known vulnerabilities.&lt;/p&gt;

&lt;p&gt;It can open automatically a PR on your repository with the compromised dependencies update, you'll just have to review it and migrate your code to the dependency's new version.&lt;/p&gt;

&lt;p&gt;If your project is containerized, Snyk can even alert you for vulnerabilities on your container images.&lt;/p&gt;

&lt;p&gt;Snyk displays the vulnerabilities by severity and you can generate reports and lists of known issues in your project.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Netlify
&lt;/h2&gt;

&lt;p&gt;If you're building a modern frontend static application, Netlify is a great way to quickly set up a continuous deployment flow.&lt;/p&gt;

&lt;p&gt;It connects directly to your git repository and listens for changes on your default branch. It will then build and deploy your frontend application.&lt;/p&gt;

&lt;p&gt;Besides providing a great free plan Netlify also has some very useful features like the 1-Click HTTPS and the deploy preview which builds and deploys every open pull request on a different URL. This way you can quickly see your changes live before merging your PR.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Semantic versioning and Changelog
&lt;/h2&gt;

&lt;p&gt;If you want your open source project to be taken seriously you should keep a changelog and start thinking about versioning your project right from the beginning.&lt;/p&gt;

&lt;p&gt;Versioning and changelogs are important once your project starts to get traction. It will boost developers' confidence in your project since changes are tracked and they won't be blindsided by breaking changes - if you follow semantic versioning correctly.&lt;/p&gt;

&lt;p&gt;If you're unfamiliar with Semantic versioning you can read the &lt;a href="https://semver.org" rel="noopener noreferrer"&gt;specs&lt;/a&gt; and &lt;a href="https://keepachangelog.com/en/1.0.0/" rel="noopener noreferrer"&gt;Keep a changelog&lt;/a&gt; is a great place to start with changelogs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What do you think about these tools? Would you add any other tools to the list?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>opensource</category>
      <category>development</category>
      <category>codequality</category>
    </item>
    <item>
      <title>Personal website template - an open source project</title>
      <dc:creator>José Coelho</dc:creator>
      <pubDate>Tue, 31 Dec 2019 23:21:19 +0000</pubDate>
      <link>https://forem.com/jcoelho/personal-website-template-an-open-source-project-5dgl</link>
      <guid>https://forem.com/jcoelho/personal-website-template-an-open-source-project-5dgl</guid>
      <description>&lt;h2&gt;
  
  
  The idea
&lt;/h2&gt;

&lt;p&gt;A few months ago I started looking for a new job and one of the first steps I took was to build my personal webpage with my CV information.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I did it?
&lt;/h2&gt;

&lt;p&gt;I'm mostly a backend developer so I wanted to explore one of the popular JS frameworks, as I don't have that opportunity at work.&lt;/p&gt;

&lt;p&gt;So I decided to go with &lt;a href="https://reactjs.org/" rel="noopener noreferrer"&gt;ReactJS&lt;/a&gt; and the CSS framework &lt;a href="https://bulma.io/" rel="noopener noreferrer"&gt;Bulma&lt;/a&gt; for styling.&lt;/p&gt;

&lt;p&gt;And here it is the final result: &lt;a href="https://jcoelho93.netlify.com" rel="noopener noreferrer"&gt;https://jcoelho93.netlify.com&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Dev.to latest articles
&lt;/h3&gt;

&lt;p&gt;This app uses the Dev.to REST API to display my latest published articles, so this is a perfect template for anyone who's part of this community ;)&lt;/p&gt;

&lt;h3&gt;
  
  
  JSON Resume open source initiative standard
&lt;/h3&gt;

&lt;p&gt;One of the requirements I had in mind was that the application should load all the personal information from a json file so that I could easily update the website with my most recent information.&lt;/p&gt;

&lt;p&gt;So I found this open-source initiative called &lt;a href="https://jsonresume.org" rel="noopener noreferrer"&gt;JSON Resume&lt;/a&gt;, that sets a standard for representing resumes as json. So my app expects the json file to follow this standard.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make it your own
&lt;/h2&gt;

&lt;p&gt;Recently someone forked my project on GitHub, updated the json file with their personal information and made their own personal webpage.&lt;br&gt;
This made think about promoting my project to anyone who wishes to use it as a base for their own website and make it truly open source community driven.&lt;/p&gt;

&lt;p&gt;So here is my project&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/jcoelho93" rel="noopener noreferrer"&gt;
        jcoelho93
      &lt;/a&gt; / &lt;a href="https://github.com/jcoelho93/personal-website" rel="noopener noreferrer"&gt;
        personal-website
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      My personal website
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;jcoelho93 Personal website&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://sonarcloud.io/dashboard?id=jcoelho93_personal-website" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0931b7b10cb45d4e7d2c76af0e3909b00f2f3f14d0a9582837e04d800c42e314/68747470733a2f2f736f6e6172636c6f75642e696f2f6170692f70726f6a6563745f6261646765732f6d6561737572653f70726f6a6563743d6a636f656c686f39335f706572736f6e616c2d77656273697465266d65747269633d616c6572745f737461747573" alt="Quality Gate Status"&gt;&lt;/a&gt;
&lt;a href="https://app.netlify.com/sites/jcoelho93/deploys" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f084576c3d85ea20a7987d9b80afe446dbaddc4256a38f125c7203abf1f90d12/68747470733a2f2f6170692e6e65746c6966792e636f6d2f6170692f76312f6261646765732f64333262363461322d396634382d346132362d623064332d3231636466353534386563362f6465706c6f792d737461747573" alt="Netlify Status"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is my personal website built using ReactJS and Bulma as the CSS framework. &lt;a href="https://jcoelho93.netlify.com" rel="nofollow noopener noreferrer"&gt;Live here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The personal information on the website is populated from a json file that follows the &lt;a href="https://jsonresume.org/" rel="nofollow noopener noreferrer"&gt;JSON Resume&lt;/a&gt; open source standard.&lt;/p&gt;
&lt;p&gt;Use Node v16.15.1&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Customizing it&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Feel free to fork this project and update it with your own information and style. Just update the ´src/resume.json´ with your personal information.&lt;/p&gt;
&lt;p&gt;If you improve the app in any way a PR would be very apreciated ;)&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Build&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Clone the repo:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight highlight-text-shell-session notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&amp;gt; &lt;span class="pl-s1"&gt;git clone https://github.com/jcoelho93/personal-website.git&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;ol start="2"&gt;
&lt;li&gt;
&lt;p&gt;Update the &lt;em&gt;resume.json&lt;/em&gt; with your personal information (check &lt;a href="https://jsonresume.org/" rel="nofollow noopener noreferrer"&gt;JSON Resume&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install dependencies and run build command:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight highlight-text-shell-session notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&amp;gt; &lt;span class="pl-s1"&gt;npm install&lt;/span&gt;
&amp;gt; &lt;span class="pl-s1"&gt;npm run build&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;You can also test the app with a development server, just run:&lt;/p&gt;
&lt;div class="highlight highlight-text-shell-session notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&amp;gt; &lt;span class="pl-s1"&gt;npm start&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Contributing&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Feel free to fork this project and customize with your personal info. If you implement any nice features or improvements…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/jcoelho93/personal-website" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;What do you think of the project? And the webpage itself?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you want you can fork it and make it your own, then send me the link I'd love to have a look at what you did.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Also if you make any improvements on the app a PR would be very appreciated. :)&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>node</category>
      <category>showdev</category>
    </item>
    <item>
      <title>PowerShell Universal Dashboard: Making interactive dashboards</title>
      <dc:creator>José Coelho</dc:creator>
      <pubDate>Tue, 11 Jun 2019 08:18:53 +0000</pubDate>
      <link>https://forem.com/jcoelho/powershell-universal-dashboard-making-interactive-dashboards-9kl</link>
      <guid>https://forem.com/jcoelho/powershell-universal-dashboard-making-interactive-dashboards-9kl</guid>
      <description>&lt;h1&gt;
  
  
  PowerShell Universal Dashboard
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://universaldashboard.io/" rel="noopener noreferrer"&gt;PowerShell Universal Dashboard&lt;/a&gt; is a very cool PowerShell module and one of the most interesting open source projects I have come across.&lt;br&gt;
It allows you to create web-based, beautiful and interactive dashboards for your IT systems, using solely PowerShell commands. &lt;br&gt;
It works great for setting up monitoring dashboards to keep track of your systems.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It's every sysadmin's dream to have a big screen in their office where they can see the status of their systems.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;h2&gt;
  
  
  Let's build one
&lt;/h2&gt;

&lt;p&gt;Let's get down to business and set up a simple dashboard so we can get to know the tool.&lt;br&gt;
&lt;strong&gt;(To follow along you'll need PowerShell 5+ and to follow the &lt;a href="https://docs.universaldashboard.io/getting-started" rel="noopener noreferrer"&gt;instructions on how to install&lt;/a&gt; the module.)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create a &lt;code&gt;dashboard.ps1&lt;/code&gt; file and add the following code:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="nv"&gt;$dashboard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;New-UDDashboard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Title&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DevTo Dashboard"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Content&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;New-UDHeading&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Text&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DevTo"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="n"&gt;Start-UDDashboard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Dashboard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$dashboard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoReload&lt;/span&gt;&lt;span class="w"&gt;


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

&lt;/div&gt;

&lt;p&gt;Here we are creating our dashboard object and adding a heading to it.&lt;br&gt;
If everything is right once you execute this file you should get the following output:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;

Name       Port Running
----       ---- -------
Dashboard2 1000    True


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

&lt;/div&gt;

&lt;p&gt;And your dashboard should be available at &lt;a href="http://localhost:1000" rel="noopener noreferrer"&gt;http://localhost:1000&lt;/a&gt; :&lt;/p&gt;

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

&lt;p&gt;Now let's make it cooler and add a different theme, I particularly like the built-in Azure theme:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="nv"&gt;$theme&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-UDTheme&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Azure'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$dashboard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;New-UDDashboard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Title&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DevTo Dashboard"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Theme&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$theme&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Content&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;New-UDHeading&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Text&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DevTo"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="w"&gt;



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

&lt;/div&gt;

&lt;p&gt;Way cooler now, right?&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frjsc4w6i29hm0ztvy2ai.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frjsc4w6i29hm0ztvy2ai.png" alt="azure theme"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Monitoring
&lt;/h2&gt;

&lt;p&gt;PowerShell Universal Dashboard has a component called &lt;a href="https://docs.universaldashboard.io/components/monitors" rel="noopener noreferrer"&gt;monitor&lt;/a&gt; which is a particular type of chart that tracks data over time. You can use it, for example, to plot your CPU or memory usage.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="nv"&gt;$theme&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-UDTheme&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Azure'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$dashboard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;New-UDDashboard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Title&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DevTo Dashboard"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Theme&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$theme&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Content&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;New-UdMonitor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Title&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CPU (% processor time)"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Line&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DataPointHistory&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;20&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-RefreshInterval&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ChartBackgroundColor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'#80FF6B63'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ChartBorderColor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'#FFFF6B63'&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;-Endpoint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="kr"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="n"&gt;Get-Counter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'\Processor(_Total)\% Processor Time'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ExpandProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CounterSamples&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ExpandProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CookedValue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Out-UDMonitorData&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="kr"&gt;catch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Out-UDMonitorData&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="n"&gt;Start-UDDashboard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Dashboard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$dashboard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoReload&lt;/span&gt;&lt;span class="w"&gt;


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

&lt;/div&gt;

&lt;p&gt;Basically what we are doing here is using the &lt;a href="https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.diagnostics/get-counter?view=powershell-5.1" rel="noopener noreferrer"&gt;Get-Counter cmdlet&lt;/a&gt; to fetch real-time data from Windows performance monitoring tool, and then piping it through the &lt;code&gt;Out-UDMonitorData&lt;/code&gt; which will convert this information into data readable by the Monitor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Un*x users&lt;/strong&gt;: This specific command will only work on &lt;strong&gt;Windows&lt;/strong&gt;, so you would need to find a different strategy to get your CPU data.&lt;br&gt;
Maybe try using the &lt;code&gt;mpstat&lt;/code&gt; command from the &lt;code&gt;sysstat&lt;/code&gt; package and then parsing the data with Powershell.&lt;/p&gt;

&lt;h2&gt;
  
  
  Charts
&lt;/h2&gt;

&lt;p&gt;Another really useful component is &lt;a href="https://docs.universaldashboard.io/components/data-visualizations/charts" rel="noopener noreferrer"&gt;charts&lt;/a&gt;. You can display all sorts of data into either a &lt;strong&gt;bar&lt;/strong&gt;, &lt;strong&gt;line&lt;/strong&gt;, &lt;strong&gt;doughnut&lt;/strong&gt; or &lt;strong&gt;pie&lt;/strong&gt; chart. They are very customizable and easy to use as they are built with the &lt;a href="https://www.chartjs.org/docs/latest/" rel="noopener noreferrer"&gt;Chart.js library&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can, for example, use a doughnut chart to show you used and available disk space:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="nv"&gt;$theme&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-UDTheme&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Azure'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$dashboard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;New-UDDashboard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Title&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DevTo Dashboard"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Theme&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$theme&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Content&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="n"&gt;New-UDChart&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Title&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Disk Space"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Doughnut&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-RefreshInterval&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$refreshRate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Endpoint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  
            &lt;/span&gt;&lt;span class="kr"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="n"&gt;Get-CimInstance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ClassName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_LogicalDisk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;DriveType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'3'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-First&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DeviceID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;Size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;FreeSpace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ForEach-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="p"&gt;@([&lt;/span&gt;&lt;span class="n"&gt;PSCustomObject&lt;/span&gt;&lt;span class="p"&gt;]@{&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="nx"&gt;Label&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Used Space"&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="nx"&gt;Data&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;::&lt;/span&gt;&lt;span class="nx"&gt;Round&lt;/span&gt;&lt;span class="err"&gt;((&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Size&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FreeSpace&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;GB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;PSCustomObject&lt;/span&gt;&lt;span class="p"&gt;]@{&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="nx"&gt;Label&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Free Space"&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="nx"&gt;Data&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;::&lt;/span&gt;&lt;span class="nx"&gt;Round&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FreeSpace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;GB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Out-UDChartData&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DataProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Data"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-LabelProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Label"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-BackgroundColor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@(&lt;/span&gt;&lt;span class="s2"&gt;"#80FF6B63"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"#8028E842"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-HoverBackgroundColor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@(&lt;/span&gt;&lt;span class="s2"&gt;"#80FF6B63"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"#8028E842"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-BorderColor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@(&lt;/span&gt;&lt;span class="s2"&gt;"#80FF6B63"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"#8028E842"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-HoverBorderColor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@(&lt;/span&gt;&lt;span class="s2"&gt;"#F2675F"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"#68e87a"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="kr"&gt;catch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Out-UDChartData&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DataProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Data"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-LabelProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Label"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="n"&gt;Start-UDDashboard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Dashboard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$dashboard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoReload&lt;/span&gt;&lt;span class="w"&gt;


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

&lt;/div&gt;

&lt;p&gt;You can now join both the Monitor and the Chart on your dashboard. Here's how your dashboard should look by now. Pretty cool hun? 😃&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Un*x users&lt;/strong&gt;: Again this will only work for Windows, but you can easily workaround and adapt it for Un*x systems.&lt;/p&gt;

&lt;p&gt;And there you have it! A pretty cool a good looking dashboard. Now get yourself a big screen on the wall and display it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Explore
&lt;/h2&gt;

&lt;p&gt;These examples are just a fraction of what this framework can do. You can also build simple REST API, have multiple pages rotate dynamically, have input forms to fill out and a lot of other components.&lt;/p&gt;

&lt;p&gt;The best thing you can do is to check by yourself, they have pretty good &lt;a href="https://docs.universaldashboard.io/" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I hope you found this tool as interesting and useful as I did.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What do you think about this PowerShell module? If you have used this tool, let me know how in the comments :)&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>powershell</category>
      <category>dashboard</category>
      <category>monitoring</category>
      <category>react</category>
    </item>
    <item>
      <title>8 Jenkins plugins I can't live without</title>
      <dc:creator>José Coelho</dc:creator>
      <pubDate>Mon, 28 Jan 2019 09:05:11 +0000</pubDate>
      <link>https://forem.com/jcoelho/8-jenkins-plugins-i-cant-live-without-3bin</link>
      <guid>https://forem.com/jcoelho/8-jenkins-plugins-i-cant-live-without-3bin</guid>
      <description>&lt;p&gt;Jenkins is a great open source automation platform. It has some great features straight out of the box.&lt;/p&gt;

&lt;p&gt;However, in my opinion, what makes it standout is its community and the &lt;a href="https://plugins.jenkins.io/" rel="noopener noreferrer"&gt;plugins it develops&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There are more than a thousand plugins available to support almost every technology, tool and process for building, deploying and automating your projects.&lt;/p&gt;

&lt;p&gt;These are some of the plugins I use the most and which without I would have my work a lot harder.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;a href="https://wiki.jenkins.io/display/JENKINS/AnsiColor+Plugin" rel="noopener noreferrer"&gt;Ansi Color Plugin&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Let's start with a simple one. Jenkins's console does not support ANSI escape sequences, specifically color ones, out of the box. This means that whatever tool you're using the console will be just black and white.&lt;/p&gt;

&lt;p&gt;Ansi Color plugin adds support for &lt;strong&gt;ANSI escape sequences&lt;/strong&gt; to the Jenkins console output, making it possible to &lt;strong&gt;have colored output on your logs&lt;/strong&gt;. This depends on the tool your using, if it doesn't print ANSI characters there's nothing you can do.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  2. &lt;a href="https://wiki.jenkins.io/display/JENKINS/Blue+Ocean+Plugin" rel="noopener noreferrer"&gt;Blue Ocean Plugin&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Let's face it! Jenkins UI is not the greatest, however there are lots of plugins that adress this issue.&lt;/p&gt;

&lt;p&gt;Blue Ocean gives you an incredibly user friendly UI to interact with Jenkins. Its developers claim that anyone, even non technical people, can use Jenkins easily with Blue Ocean.&lt;/p&gt;

&lt;p&gt;Here's a pipeline representation in Blue Ocean:&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;: Blue Ocean works great when you're trying to analyze logs of a pipeline running tasks in parallel. On the classic view, parallel logs are scrambled.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;a href="https://wiki.jenkins.io/display/JENKINS/Git+Parameter+Plugin" rel="noopener noreferrer"&gt;Git  Parameter Plugin&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;When you spend most of your day building pipelines and automating boring tasks, you want people to actually use them. To achieve that you have to make it easy to use.&lt;/p&gt;

&lt;p&gt;Git Parameter plugin lets you have Git &lt;strong&gt;branches&lt;/strong&gt;, &lt;strong&gt;tags&lt;/strong&gt; or &lt;strong&gt;revisions&lt;/strong&gt; as a parameter for starting a job or pipeline.&lt;/p&gt;

&lt;p&gt;This is really useful if, for example, you want to setup a &lt;em&gt;continuous delivery&lt;/em&gt; pipeline where the developer can choose from which Git tag to deploy from.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;: always filter branches/tags according to the pipelines purposes, otherwise you might end up with instable code in production environments for example.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;a href="https://github.com/jenkinsci/gitlab-plugin" rel="noopener noreferrer"&gt;GitLab Plugin&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;In my company, we use a hosted GitLab instance  as our source code management tool. And even though I love GitLab's approach to CI (&lt;a href="https://about.gitlab.com/product/continuous-integration/" rel="noopener noreferrer"&gt;have a read&lt;/a&gt;) we haven't gone that route. &lt;/p&gt;

&lt;p&gt;So we use Jenkins instead and connect it to GitLab. In the end, developers have the same experience.&lt;/p&gt;

&lt;p&gt;GitLab plugin lets you call pipelines from GitLab, using WebHooks, and publish the build results back to GitLab.&lt;/p&gt;

&lt;p&gt;This allows you to quickly get feedback from your CI pipelines.&lt;/p&gt;

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

&lt;p&gt;You can find the similar plugins for other SCM tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;: favor execution of pipelines through WebHooks over SCM polling when ever you can. On big systems you'll get better performance.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. &lt;a href="https://wiki.jenkins.io/display/JENKINS/Email-ext+plugin" rel="noopener noreferrer"&gt;Extended Email Plugin&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;When something goes wrong you need your users to fix the problem as soon as possible, otherwise your CI/CD could be compromised.&lt;/p&gt;

&lt;p&gt;Extended Email plugin extends Jenkins email notifications giving control over almost every aspect of it. You can customize the notifications &lt;strong&gt;triggers&lt;/strong&gt;, &lt;strong&gt;content&lt;/strong&gt; and &lt;strong&gt;recipients&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Have a look at these &lt;a href="https://wiki.jenkins.io/display/JENKINS/Email-ext+Recipes" rel="noopener noreferrer"&gt;recipes&lt;/a&gt; to have some ideas of your own.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;: make sure every notification you send is absolutely necessary, do not spam your users. Trust me, the less notifications you send the more users will read them and actually react to them. Use IM plugins (like Slack plugin or Skype plugin) to sparse your notifications.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. &lt;a href="https://wiki.jenkins.io/display/JENKINS/Embeddable+Build+Status+Plugin" rel="noopener noreferrer"&gt;embedabble-build-status Plugin&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Another great way to warn your users when something is wrong is to use &lt;strong&gt;Badges&lt;/strong&gt; on your SCM tool.&lt;/p&gt;

&lt;p&gt;This plugin generates badges for all your jobs which display, in real time, their build status.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  7. &lt;a href="https://wiki.jenkins.io/display/JENKINS/Publish+Over+SSH+Plugin" rel="noopener noreferrer"&gt;Publish over SSH Plugin&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;As you probably take from the name, this plugin provides features to send files and run commands over SSH.&lt;/p&gt;

&lt;p&gt;You can configure your remote hosts on you &lt;strong&gt;Manage Jenkins&lt;/strong&gt; page and then use them on your jobs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;: if for some reason you cannot have a Jenkins agent installed on one of yours hosts, this plugin allows you to run commands remotely over SSH.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. &lt;a href="https://plugins.jenkins.io/next-executions" rel="noopener noreferrer"&gt;Next Executions Plugin&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Once you get a considerable amount of jobs set up, it might get hard to keep up with every thing that's happening and running on your Jenkins.&lt;/p&gt;

&lt;p&gt;Next Executions Plugin adds a widget to the main page of your Jenkins instance that displays the next build date of all your scheduled jobs. &lt;/p&gt;

&lt;p&gt;This will give you a much better picture of the state of your infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;These are some of the plugins I use every day and there are thousands more to explore.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do you have any favorite one? Let me know in the comments! I'm looking for some new favorite plugins :D&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>jenkins</category>
      <category>plugin</category>
      <category>cicd</category>
    </item>
    <item>
      <title>10 reasons to use Groovy in 2019</title>
      <dc:creator>José Coelho</dc:creator>
      <pubDate>Sat, 05 Jan 2019 16:47:13 +0000</pubDate>
      <link>https://forem.com/jcoelho/10-reasons-to-use-groovy-in-2019-431f</link>
      <guid>https://forem.com/jcoelho/10-reasons-to-use-groovy-in-2019-431f</guid>
      <description>&lt;h2&gt;
  
  
  Why Groovy?
&lt;/h2&gt;

&lt;p&gt;It's been about a year since I joined my company's &lt;strong&gt;DevOps team&lt;/strong&gt; and one of the main tools we use is &lt;a href="https://jenkins.io/"&gt;Jenkins&lt;/a&gt; which gets along great with &lt;strong&gt;Groovy&lt;/strong&gt;. I mostly use Groovy for orchestrating pipelines and automating some boring tasks.&lt;/p&gt;

&lt;p&gt;Groovy is a powerful language for the Java platform, it integrates smoothly with any Java program. It's also a great scripting language with its powerful and easy to learn syntax.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;[Groovy is] aimed at improving developer productivity thanks to a concise, &lt;strong&gt;familiar and easy to learn&lt;br&gt;
syntax&lt;/strong&gt;. It integrates smoothly with any Java program, and immediately delivers to your application&lt;br&gt;
powerful features, including scripting capabilities, &lt;strong&gt;Domain-Specific Language&lt;/strong&gt; authoring,&lt;br&gt;
runtime and compile-time &lt;strong&gt;meta-programming&lt;/strong&gt; and &lt;strong&gt;functional&lt;/strong&gt; programming.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So here are 10 features that I've learned in the past year that made me love Groovy:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Simplicity
&lt;/h3&gt;

&lt;p&gt;Coming from a Java back-end development team, learning Groovy was a breeze for me. It is build on top of Java standard libraries, providing extra features. Most of them make programming much simpler.&lt;/p&gt;

&lt;h4&gt;
  
  
  1.1 Declaring Lists/Maps
&lt;/h4&gt;

&lt;p&gt;Groovy is an optionally typed language, you can use the &lt;code&gt;def&lt;/code&gt; keyword to declare variables. For example declaring lists or maps is as simple as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;myList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;
&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;myMap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[:]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  1.2 Iterating over Lists/Maps
&lt;/h4&gt;

&lt;p&gt;And iterating over them is incredibly easy and readable using &lt;strong&gt;Closures&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;myList&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;element&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; 
    &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;element&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;myMap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; 
    &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;"User: $entry.user | Email: $entry.email"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. String Interpolation
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;[String] Interpolation is the act of replacing a placeholder in the string with its value upon evaluation of the string.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In Groovy, placeholders are surrounded by &lt;code&gt;${}&lt;/code&gt;or prefixed with &lt;code&gt;$&lt;/code&gt; for dotted expressions.&lt;/p&gt;

&lt;p&gt;In the previous snippet we can see an example of string interpolation. But here is another one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Exception&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;"Error during operation. Cause: ${e}"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Casting
&lt;/h3&gt;

&lt;p&gt;Groovy makes casting very easy and readable with the &lt;code&gt;as&lt;/code&gt; operator. To use this operand the casted class must implement the &lt;code&gt;asType()&lt;/code&gt;method. This already happens for standard classes like lists, enumerators, etc.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="kd"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;Employee&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;MIKE&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;HANNA&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"JOHN"&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;Employee&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;"Could not find employee ${name}. Cause: ${e}"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Json to Classes
&lt;/h3&gt;

&lt;p&gt;I work a lot with Web Services with Json responses so inevitably I have had to map responses to Groovy classes. This comes out of the box with Groovy and it's extremely easy, just pass a Json through the class constructor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'{name:"John", position: "Developer", age: 32}'&lt;/span&gt;

&lt;span class="c1"&gt;// Json response to map&lt;/span&gt;
&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;employeeMap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;JsonSlurper&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;parseText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// Consider an Employee class with the attributes name, position and age&lt;/span&gt;
&lt;span class="n"&gt;Employee&lt;/span&gt; &lt;span class="n"&gt;employee&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Employee&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;employeeMap&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. We just built an employee object from a Json string.&lt;/p&gt;

&lt;p&gt;The other way around is just as simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;JsonOutput&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toJson&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;employee&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// json == '{name:"John", position: "Developer", age: 32}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Assertions
&lt;/h3&gt;

&lt;p&gt;Groovy has the same &lt;code&gt;assert&lt;/code&gt; statement as Java, but way more powerful - hence it's name - &lt;em&gt;Power Assertions&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The difference being its output in case the assertions resolves to &lt;code&gt;false&lt;/code&gt;. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;contacts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'John'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Anna'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;contacts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;//Output:&lt;/span&gt;
&lt;span class="c1"&gt;//ERROR org.codehaus.groovy.runtime.powerassert.PowerAssetionError:&lt;/span&gt;
&lt;span class="c1"&gt;//assert contacts.isEmpty()&lt;/span&gt;
&lt;span class="c1"&gt;//       |        |&lt;/span&gt;
&lt;span class="c1"&gt;//       |        false&lt;/span&gt;
&lt;span class="c1"&gt;//       [John, Anna]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This allows you to very easily understand what has made the assertion fail.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Defining variables
&lt;/h3&gt;

&lt;p&gt;Groovy is optionally type, this means that you can define a variable with its type or simply use the keyword &lt;code&gt;def&lt;/code&gt;. This applies as well when declaring List or Maps, their types are optional. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;
&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;address&lt;/span&gt;
&lt;span class="n"&gt;List&lt;/span&gt; &lt;span class="n"&gt;friends&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'John'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Anna'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;Map&lt;/span&gt; &lt;span class="n"&gt;family&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Mother'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;'Mary'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Father'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;'Joseph'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;

&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;getFamilyMember&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Mother"&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For those of you who know Javascript, this is similar to the keyword &lt;code&gt;var&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This gives you incredible flexibility, however be cautious when using it. It might make it harder on your team or someone else using your code to read it and understand what is expected as input or output.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Hashing
&lt;/h3&gt;

&lt;p&gt;If you've ever used Java, you probably know how verbose it is to hash a string - unless you're using a third-party library.&lt;/p&gt;

&lt;p&gt;Groovy 2.5 brings us some useful methods to the &lt;code&gt;String&lt;/code&gt; class. Calculating hashes is as simple as calling a method on a String. Groovy makes it simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"thisIsMyPassword"&lt;/span&gt;

&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;md5&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;md5&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;sha256&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sha256&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;//For other algorithms use digest() method&lt;/span&gt;
&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;sha1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;digest&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'SHA-1'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  8. Operators
&lt;/h3&gt;

&lt;p&gt;Groovy supports the most common operators found in other languages. But that's not enough the are some more interesting operators Groovy provides. Here are a few:&lt;/p&gt;

&lt;h4&gt;
  
  
  Elvis operator
&lt;/h4&gt;

&lt;p&gt;This is a shorter version of the ternary operator. This is very useful, for example, when the condition could evaluate to null.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Instead of this&lt;/span&gt;
&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'Guest'&lt;/span&gt;
&lt;span class="c1"&gt;// Use this&lt;/span&gt;
&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;?:&lt;/span&gt; &lt;span class="s1"&gt;'Guest'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Safe navigation operator
&lt;/h4&gt;

&lt;p&gt;Another operator that can be used to check if a variable is null is the Safe Navigation Operator.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;
&lt;span class="c1"&gt;// user == null&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use this operator when you want to avoid &lt;code&gt;NullPointerException&lt;/code&gt;s. In case the object you're accessing is null, this operator will return a &lt;code&gt;null&lt;/code&gt; instead of throwing a &lt;code&gt;NullPointerException&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Spread Operator
&lt;/h4&gt;

&lt;p&gt;The spread operator (&lt;code&gt;.*&lt;/code&gt;) is used to execute an action on all items of a Collection, instead of using a loop or a closure as we've seen before. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="c1"&gt;// == [1,2,3,4,5,6]&lt;/span&gt;

&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;people&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Person&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;name:&lt;/span&gt; &lt;span class="s1"&gt;'John'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;age:&lt;/span&gt; &lt;span class="s1"&gt;'25'&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Person&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;name:&lt;/span&gt; &lt;span class="s1"&gt;'Anna'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;age:&lt;/span&gt; &lt;span class="s1"&gt;'21'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;]&lt;/span&gt;

&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;friends&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;people&lt;/span&gt;&lt;span class="o"&gt;*.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="c1"&gt;// friends = ['John', 'Anna']&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  9. Traits
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Traits are a structural construct of the language which allows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;composition of behaviors&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;runtime implementation of interfaces&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;behavior overriding&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;compatibility with static type checking/compilation&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;I like to think of traits as interfaces where you can actually implements methods. It's very useful when you have a very complex and structured application and you want to keep things clean. &lt;/p&gt;

&lt;p&gt;It's definetly something I've missed in the early Java.&lt;/p&gt;

&lt;p&gt;Here's an example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="kd"&gt;trait&lt;/span&gt; &lt;span class="nc"&gt;Sociable&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;"Hello!"&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Person&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="n"&gt;Sociable&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;

&lt;span class="n"&gt;Person&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;greet&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// Hello!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  10. Regular Expressions
&lt;/h3&gt;

&lt;p&gt;Groovy natively supports regular expressions and it's quite simple. It has 3 operators for regular expressions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;~&lt;/code&gt; this is the &lt;strong&gt;pattern operator&lt;/strong&gt;, its the simple way to create an instance of &lt;code&gt;java.util.regex.Pattern&lt;/code&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;pattern&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="s2"&gt;"^abc{2}\d"&lt;/span&gt;
&lt;span class="c1"&gt;// pattern instanceof Pattern == true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;=~&lt;/code&gt; this is the &lt;strong&gt;find operator&lt;/strong&gt; which will look for a pattern in a string and returns a &lt;code&gt;Matcher&lt;/code&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;pattern&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="s2"&gt;"abc{2}\d"&lt;/span&gt;
&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"abcc5"&lt;/span&gt; &lt;span class="o"&gt;=~&lt;/span&gt; &lt;span class="n"&gt;pattern&lt;/span&gt;
&lt;span class="c1"&gt;// found instanceof Matcher == true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;and finally the &lt;strong&gt;match operator&lt;/strong&gt; &lt;code&gt;==~&lt;/code&gt; which returns &lt;code&gt;true&lt;/code&gt; if the string is a strict match of the regex:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"abcc5"&lt;/span&gt; &lt;span class="o"&gt;==~&lt;/span&gt; &lt;span class="n"&gt;pattern&lt;/span&gt;
&lt;span class="c1"&gt;// found == true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Groovy feels like a breath of fresh air if you've been programming in Java, or other OOP languages, for years.&lt;/p&gt;

&lt;p&gt;It makes things so much easier and simple and way less verbose. Plus the extra features like scripting and Domain Specific Language capabilities, push Groovy to a new level and gives it this new fresh look that's missing for older languages.&lt;/p&gt;

&lt;p&gt;I hope you found this article interesting and let me know in the comments below if you have any experience with Groovy and how do you use it. :)&lt;/p&gt;

</description>
      <category>groovy</category>
      <category>java</category>
      <category>scripting</category>
      <category>programming</category>
    </item>
    <item>
      <title>5+ Free development resources for Students</title>
      <dc:creator>José Coelho</dc:creator>
      <pubDate>Mon, 12 Nov 2018 23:38:32 +0000</pubDate>
      <link>https://forem.com/jcoelho/5-free-development-resources-for-students-2co7</link>
      <guid>https://forem.com/jcoelho/5-free-development-resources-for-students-2co7</guid>
      <description>&lt;h2&gt;
  
  
  Free for students
&lt;/h2&gt;

&lt;p&gt;If you're a University student you could have access to some really neat tools for free, for you to develop and explore the CS world.&lt;/p&gt;

&lt;p&gt;Usually, to get these tools, you will need an &lt;strong&gt;official institutional email address&lt;/strong&gt;. However you can also provide your student card or some other proof.&lt;/p&gt;

&lt;p&gt;Here are a few!!!&lt;/p&gt;

&lt;h3&gt;
  
  
  1. JetBrains IDEs
&lt;/h3&gt;

&lt;p&gt;In my opinion, these are some of the best IDEs in the market right now. They have incredible UI and features and they actually make me enjoy my school assignments a bit more.&lt;/p&gt;

&lt;p&gt;Tools such as &lt;a href="https://www.jetbrains.com/idea/" rel="noopener noreferrer"&gt;IntelliJ IDEA Ultimate&lt;/a&gt; for &lt;strong&gt;Java&lt;/strong&gt; based applications, &lt;a href="https://www.jetbrains.com/phpstorm/" rel="noopener noreferrer"&gt;PhpStorm&lt;/a&gt; for &lt;strong&gt;PHP&lt;/strong&gt;, &lt;a href="https://www.jetbrains.com/pycharm/" rel="noopener noreferrer"&gt;PyCharm&lt;/a&gt; for &lt;strong&gt;Python&lt;/strong&gt; and my personal favorite which I have recently started using and can't get enough &lt;a href="https://www.jetbrains.com/clion/" rel="noopener noreferrer"&gt;CLion&lt;/a&gt; for &lt;strong&gt;C/C++&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;They also have a really &lt;a href="https://www.jetbrains.com/education/" rel="noopener noreferrer"&gt;interesting plugin&lt;/a&gt; (still in beta) for their IDEs which will help you learn your chosen language with exercises from inside your IDE.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. GitLab for education
&lt;/h3&gt;

&lt;p&gt;GitLab is becoming a great tool for collaborating and developing on great projects. Their focus is currently on simplifying the DevOps lifecycle. This is a great way to start acquiring a DevOps mindset for your future once you get on the job market.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;GitLab is the first single application for the entire DevOps lifecycle. Only GitLab enables Concurrent DevOps , unlocking organizations from the constraints of the toolchain. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://about.gitlab.com/solutions/education/" rel="noopener noreferrer"&gt;GitLab for education&lt;/a&gt; allows your educational institution to use &lt;a href="https://about.gitlab.com/pricing" rel="noopener noreferrer"&gt;GitLab Ultimate and Gold&lt;/a&gt; for free.&lt;br&gt;&lt;br&gt;
Unfortunately only institutions may apply (students can't apply directly), however you can still have your projects hosted on GitLab with full functionality if you make them open source or with the free functionality for private projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. GitHub Education
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://education.github.com/students" rel="noopener noreferrer"&gt;GitHub Education&lt;/a&gt; offers a great set of development tools for free for students. From text editors like &lt;a href="https://atom.io/" rel="noopener noreferrer"&gt;Atom&lt;/a&gt; to Git graphic tools like &lt;a href="https://www.gitkraken.com/" rel="noopener noreferrer"&gt;GitKraken&lt;/a&gt;, to cloud services that provide CI, email services, hosting and a lot more. &lt;/p&gt;

&lt;p&gt;All you need to apply is to fill in a form explaining how you plan to use GitHub. Note that if you use an institutional email your chances of getting accepted are higher.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  4. Fastlane
&lt;/h3&gt;

&lt;p&gt;If you're into mobile development, fastlane is sure to catch your interest.&lt;br&gt;
Fastlane allows you to automate a lot of tedious task related to the development and release process of mobile applications.&lt;/p&gt;

&lt;p&gt;It is an open-source platform developed along with Google's Firebase team. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The easiest way to build and release mobile apps.&lt;br&gt;
fastlane handles tedious tasks so you don’t have to&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;h3&gt;
  
  
  5. Microsoft Imagine
&lt;/h3&gt;

&lt;p&gt;This is the former Microsoft Dreamsparks, you have probably heard of it as it's been around for a while.&lt;br&gt;&lt;br&gt;
They provide lots of tools and services. From free &lt;strong&gt;Azure cloud services&lt;/strong&gt; to &lt;strong&gt;VS Code&lt;/strong&gt; tools, free &lt;strong&gt;Windows server&lt;/strong&gt; OS, &lt;strong&gt;Xamarin&lt;/strong&gt; and some training resources.&lt;br&gt;&lt;br&gt;
These are great resources if your preferred stack is &lt;strong&gt;.NET&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;As you can see there are lots of free resources, especially for students. So make sure you take advantage of these while you still can.&lt;/p&gt;

&lt;p&gt;Do you know any great free resources I've missed on this list? Share them in the comments :D&lt;/p&gt;

</description>
      <category>free</category>
      <category>dev</category>
      <category>tools</category>
      <category>student</category>
    </item>
    <item>
      <title>How to deploy email signatures through Group Policies</title>
      <dc:creator>José Coelho</dc:creator>
      <pubDate>Sun, 04 Nov 2018 21:30:11 +0000</pubDate>
      <link>https://forem.com/jcoelho/how-to-deploy-email-signatures-through-group-policies-4aj1</link>
      <guid>https://forem.com/jcoelho/how-to-deploy-email-signatures-through-group-policies-4aj1</guid>
      <description>&lt;p&gt;A few years back I was working as a &lt;em&gt;SysAdmin&lt;/em&gt; for a big company, which was going through a &lt;strong&gt;rebranding process&lt;/strong&gt;. One of the targets for the rebranding was, of course, the &lt;strong&gt;corporate email signature&lt;/strong&gt; which most of the &lt;strong&gt;400+ employees&lt;/strong&gt; were using.&lt;/p&gt;

&lt;p&gt;So how do you deploy a new email signature for all employees? Do you just send them an email, and have them do it themselves? Well, that's an option but then you would have to handle the unstoppable help requests from the less tech-literate employees.&lt;/p&gt;

&lt;p&gt;There has to be a better way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Group Policies to the rescue
&lt;/h2&gt;

&lt;p&gt;Let me set the scene here, I was working in a network with about 400 Windows workstations, and most of the infrastructure was Windows based as well. So it was clear to me &lt;a href="https://en.wikipedia.org/wiki/Group_Policy" rel="noopener noreferrer"&gt;Group Policies&lt;/a&gt; was the way to go.&lt;/p&gt;

&lt;p&gt;I quickly came up with a plan, develop a PowerShell script, that could copy the signature to the user's workstation, and have it run every time a user logs in.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Creating a signature template
&lt;/h3&gt;

&lt;p&gt;I got the new email signature and I had to create a template so that my PowerShell script would fill in the information later.&lt;/p&gt;

&lt;p&gt;So this was my signature template (&lt;code&gt;.html&lt;/code&gt; file) with placeholders stored on a shared location accessible by all users:&lt;/p&gt;

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

&lt;h3&gt;
  
  
  2. PowerShell script
&lt;/h3&gt;

&lt;p&gt;I needed a script that would replace the user-specific information for each user, in this case, replace the user's &lt;strong&gt;name&lt;/strong&gt;, &lt;strong&gt;job title&lt;/strong&gt;, &lt;strong&gt;department&lt;/strong&gt;, &lt;strong&gt;email&lt;/strong&gt;, &lt;strong&gt;office and phone number&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Gets the path to the user appdata folder&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$AppData&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;env:appdata&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;value&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# This is the default signature folder for Outlook&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$localSignatureFolder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$AppData&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s1"&gt;'\Microsoft\Signatures'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# This is a shared folder on your network where the signature template should be&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$templateFilePath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"\\server\signatures"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Get the current logged in username&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$userName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;username&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# The following 5 lines will query AD and get an ADUser object with all information&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"(&amp;amp;(objectCategory=User)(samAccountName=&lt;/span&gt;&lt;span class="nv"&gt;$userName&lt;/span&gt;&lt;span class="s2"&gt;))"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$searcher&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;New-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;System.DirectoryServices.DirectorySearcher&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$searcher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$filter&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$ADUserPath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$searcher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FindOne&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$ADUser&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$ADUserPath&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetDirectoryEntry&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Now extract all the necessary information for the signature&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$ADUser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;DisplayName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$email&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$ADUser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mail&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$job&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$ADUser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$department&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$ADUser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;department&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$phone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$ADUser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;telephonenumber&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$office&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$ADUser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;physicalDeliveryOfficeName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that I have all the information about the user that I need, I have to replace it on the signature template and copy it to the user's local folder.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$namePlaceHolder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[DISPLAY_NAME]"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$emailPlaceHolder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[EMAIL]"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$jobPlaceHolder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[JOB_TITLE]"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$departmentPlaceHolder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[DEPARTMENT]"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$phonePlaceHolder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[PHONE]"&lt;/span&gt;&lt;span class="w"&gt;


&lt;/span&gt;&lt;span class="nv"&gt;$rawTemplate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;get-content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$templateFilePath&lt;/span&gt;&lt;span class="s2"&gt;"\template.html"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="nv"&gt;$signature&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$rawTemplate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-replace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$namePlaceHolder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$rawTemplate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$signature&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="nv"&gt;$signature&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$rawTemplate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-replace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$emailPlaceHolder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;$email&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$rawTemplate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$signature&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="nv"&gt;$signature&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$rawTemplate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-replace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$phonePlaceHolder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;$phone&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$rawTemplate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$signature&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="nv"&gt;$signature&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$rawTemplate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-replace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$jobPlaceHolder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;$job&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$rawTemplate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$signature&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="nv"&gt;$signature&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$rawTemplate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-replace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$departmentPlaceHolder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;$department&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Save it as &amp;lt;username&amp;gt;.htm&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$fileName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$localSignatureFolder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"\"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$userName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;".htm"&lt;/span&gt;&lt;span class="w"&gt;

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

&lt;/div&gt;



&lt;p&gt;The last step is to copy the signature to the user's local folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# Gets the last update time of the template.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;test-path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$templateFilePath&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$templateLastModifiedDate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="n"&gt;Get-ItemProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$templateFilePath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LastWriteTime&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lastwritetime&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Checks if there is a signature and its last update time&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;test-path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$filename&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$signatureLastModifiedDate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="n"&gt;Get-ItemProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$filename&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LastWriteTime&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lastwritetime&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nx"&gt;if&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;get-date&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$templateLastModifiedDate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-gt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;get-date&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$signatureLastModifiedDate&lt;/span&gt;&lt;span class="p"&gt;)){&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nv"&gt;$signature&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$fileName&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="kr"&gt;else&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$signature&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$fileName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. We got a signature
&lt;/h3&gt;

&lt;p&gt;If this script runs successfully you should end up with a complete signature in your AppData folder, like so:&lt;/p&gt;

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

&lt;h3&gt;
  
  
  4. Set up a group policy
&lt;/h3&gt;

&lt;p&gt;To finish off I set a new group policy and have this script run every time a user logs in.&lt;/p&gt;

&lt;p&gt;It took a while until all users had the updated signature, as some of them where on holidays and some rarely logged in.&lt;/p&gt;

&lt;p&gt;And that's why I love PowerShell :D&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;This is my first post... Leave me some feedback if you'd like ;)&lt;/sup&gt;&lt;/p&gt;

</description>
      <category>powershell</category>
      <category>outlook</category>
      <category>email</category>
      <category>signature</category>
    </item>
  </channel>
</rss>
