<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Jeff Dauda]]></title><description><![CDATA[I love coffee and snacks, especially when I'm behind screens writing and doing backend stuff]]></description><link>https://trojan.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 11:39:25 GMT</lastBuildDate><atom:link href="https://trojan.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[What is GitHub Actions and how to use it...]]></title><description><![CDATA[Overview
 In the world of Devops and SRE, GitHub  is one of the most popular buzzword and you’ve most probably came across it on a git repository. In this beginner-friendly article for Devops folks, we are going to have our hands on GitHub Actions, l...]]></description><link>https://trojan.hashnode.dev/intro-to-github-actions</link><guid isPermaLink="true">https://trojan.hashnode.dev/intro-to-github-actions</guid><category><![CDATA[Devops]]></category><category><![CDATA[GitHub]]></category><category><![CDATA[github-actions]]></category><category><![CDATA[ci-cd]]></category><category><![CDATA[Continuous Integration]]></category><dc:creator><![CDATA[Jeff Dauda]]></dc:creator><pubDate>Tue, 22 Mar 2022 15:15:20 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1647537348733/AWTokUXcE.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-overview">Overview</h1>
<p> In the world of Devops and SRE, GitHub  is one of the most popular buzzword and you’ve most probably came across it on a git repository. In this beginner-friendly article for Devops folks, we are going to have our hands on GitHub Actions, learn what it is and use an action on a workflow.</p>
<p>Before we go any further, we need to define some key terms which are components of GitHub Actions.</p>
<p><strong>Workflows </strong></p>
<p>A workflow is an automated process that is made up of one or more multiple jobs and can be triggered by an event. Workflows are defined and configured in YAML(Yet Another Markup Language)  file in the .github/workflows directory of your repository.</p>
<p><strong>Actions </strong></p>
<p> Actions are the building blocks of a workflow, they are automated processes which can combine to create a job.</p>
<p><strong>Jobs </strong></p>
<p> A job is a collection of workflow stages that executes in an orderly way and under the same runner. A job’s dependencies can be configured with other jobs and when a job takes another job’s dependencies, it will wait for the dependent job to complete before it can run… Each step in a job can either be a shell script or an action that will be executed.</p>
<p><strong>Runners</strong></p>
<p>A runner is a server that runs your workflows when they are triggered. Because each runner is limited to one job at a time, it waits for available jobs to execute and then runs the job’s actions  and returns the results back to GitHub. Runners can either be hosted on GitHub or Self hosted on your own servers.</p>
<p><strong>Step</strong></p>
<p>A step is a set of tasks that can be executed by a job, it has the ability to run actions.</p>
<h1 id="heading-what-are-github-actions">What are GitHub Actions</h1>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1647535835572/gptGOr_1b.png" alt="compositeAction.png" /></p>
<p>GitHub Actions is a CI/CD platform that allows you to automate your build, test and deployment pipeline with ease. GitHub Actions gives super-powers to your repo, imagine running a workflow that automatically creates labels whenever someone creates a new issue in your repository or when a pull request is made to your repository, an automated workflow can check if the pull request is eligible for merging into the main code or not.
With GitHub Actions, when you code and push your project to GitHub, you can build a script to test every time you commit a change or someone creates a pull request and if any exception occurs, GitHub Actions will fail the build and prevent it from being merged.</p>
<p>You can create your own actions or use and customize actions or shared by the GitHub community. When developing an action for the public, storing an action in its own repository makes it easier for the GitHub community to discover the action and make contributions to it but if you don’t want to make it available to others, you can store the action in any location in your repository.</p>
<p><strong>Types of Actions</strong></p>
<p>There are two main types of publishable actions: JavaScript and Docker actions</p>
<p>Docker actions package an environment with GitHub Actions code as it provides reliable unit work.  JavaScript actions are easier to write and faster than docker actions because they run directly on the runner machine and don’t have to worry about rebuilding the docker image at every instance.</p>
<p>Another type of action is Composite Run Steps, which helps you reuse code inside your project workflows and hides complexity when you don’t want to publish your action to the marketplace.</p>
<h1 id="heading-creating-a-composite-action">Creating a composite action</h1>
<p>In this short tutorial, we will be creating our first GitHub Action together. We will create a composite action which you can use from one repository to another</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1647535249823/3MxG5NAMt.png" alt="reusablecode.png" /></p>
<p>Start by creating a public repo in GitHub and choose any name for the repository</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1647535296306/79VCxi91d.png" alt="create-repo.png" /></p>
<p>clone your repo to your computer and from your terminal, change into the cloned directory</p>
<pre><code>cd composite<span class="hljs-operator">-</span>action<span class="hljs-operator">-</span>hello
</code></pre><p>In your repository, create a new file called hello.sh and add the code example:</p>
<pre><code><span class="hljs-keyword">echo</span> Hello world
</code></pre><p>From your terminal, make hello.sh executable.</p>
<pre><code><span class="hljs-keyword">chmod</span> +<span class="hljs-keyword">x</span> hello.sh
</code></pre><p>From your terminal add your bash file</p>
<pre><code>git add hello.sh
git commit <span class="hljs-operator">-</span>m “Added hello script”
git push
</code></pre><p>Let’s create an action metadata file with the details below:</p>
<pre><code><span class="hljs-attr">name:</span> <span class="hljs-string">'Hello World'</span>
<span class="hljs-attr">description:</span> <span class="hljs-string">'Greet someone'</span>
<span class="hljs-attr">inputs:</span>
<span class="hljs-attr">who-to-greet:</span> <span class="hljs-comment"># id of input</span>
<span class="hljs-attr">description:</span> <span class="hljs-string">'Who to greet'</span>
<span class="hljs-attr">required:</span> <span class="hljs-literal">true</span>
<span class="hljs-attr">default:</span> <span class="hljs-string">'World'</span>
<span class="hljs-attr">outputs:</span>
<span class="hljs-attr">random-number:</span>
<span class="hljs-attr">description:</span> <span class="hljs-string">"Random number"</span>
<span class="hljs-attr">value:</span> <span class="hljs-string">${{</span> <span class="hljs-string">steps.random-number-generator.outputs.random-id</span> <span class="hljs-string">}}</span>
<span class="hljs-attr">runs:</span>
<span class="hljs-attr">using:</span> <span class="hljs-string">"composite"</span>
<span class="hljs-attr">steps:</span>
<span class="hljs-bullet">-</span> <span class="hljs-attr">run:</span> <span class="hljs-string">echo</span> <span class="hljs-string">Hello</span> <span class="hljs-string">${{</span> <span class="hljs-string">inputs.who-to-greet</span> <span class="hljs-string">}}.</span>
<span class="hljs-attr">shell:</span> <span class="hljs-string">bash</span>
<span class="hljs-bullet">-</span> <span class="hljs-attr">id:</span> <span class="hljs-string">random-number-generator</span>
<span class="hljs-attr">run:</span> <span class="hljs-string">echo</span> <span class="hljs-string">"::set-output name=random-id::$(echo $RANDOM)"</span>
<span class="hljs-attr">shell:</span> <span class="hljs-string">bash</span>
<span class="hljs-bullet">-</span> <span class="hljs-attr">run:</span> <span class="hljs-string">echo</span> <span class="hljs-string">"$<span class="hljs-template-variable">{{ github.action_path }}</span>"</span> <span class="hljs-string">&gt;&gt;</span> <span class="hljs-string">$GITHUB_PATH</span>
<span class="hljs-attr">shell:</span> <span class="hljs-string">bash</span> 
<span class="hljs-bullet">-</span> <span class="hljs-attr">run:</span> <span class="hljs-string">hello.sh</span>
<span class="hljs-attr">shell:</span> <span class="hljs-string">bash</span>
</code></pre><p>From your terminal check in your action.yaml file</p>
<pre><code>git add action.yaml
git <span class="hljs-keyword">commit</span> -m “Added <span class="hljs-keyword">action</span> <span class="hljs-keyword">file</span>”
git push
</code></pre><p>From your terminal, add a tag.</p>
<pre><code>git tag <span class="hljs-operator">-</span>a <span class="hljs-operator">-</span>m “First release ” v1
git push <span class="hljs-operator">-</span><span class="hljs-operator">-</span>follow<span class="hljs-operator">-</span>tags
</code></pre><p>Your repository should look like this 
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1647535320286/NhVeGjnvH.png" alt="finalpush.png" /></p>
<p>It is done 🎉!!</p>
<p>To test this action, create an empty action file in another repository, copy the workflow code into a .github/workflows/main.yml file but replace actions/composite-action-hello@v1 with the new repo and tag you created. From your repository, click <strong>Actions</strong> tab and select the latest workflow run...</p>
<p>As you can see, we easily created a composite action which sends us our Hello World greeting! Thanks for reading</p>
<p>You can check the repo for <a target="_blank" href="https://github.com/trojan0x/composite-action-hello">here</a></p>
]]></content:encoded></item><item><title><![CDATA[Using AI to create art pieces from music -GANs and the deep music visualizer]]></title><description><![CDATA[Over the years, we have seen the emergence of Artificial Intelligence and its growth across different aspects of life. AI is the theory and development of computer systems that are able to perform tasks normally requiring human intelligence, such as ...]]></description><link>https://trojan.hashnode.dev/using-ai-to-create-art-pieces-from-music-gans-and-the-deep-music-visualizer</link><guid isPermaLink="true">https://trojan.hashnode.dev/using-ai-to-create-art-pieces-from-music-gans-and-the-deep-music-visualizer</guid><category><![CDATA[Artificial Intelligence]]></category><category><![CDATA[Machine Learning]]></category><category><![CDATA[Python]]></category><category><![CDATA[Art]]></category><category><![CDATA[music]]></category><dc:creator><![CDATA[Jeff Dauda]]></dc:creator><pubDate>Sun, 05 Dec 2021 12:28:32 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1638704231237/IRuZ7t0lh.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Over the years, we have seen the emergence of Artificial Intelligence and its growth across different aspects of life. AI is the theory and development of computer systems that are able to perform tasks normally requiring human intelligence, such as decision-making, speech recognition and translation between languages.</p>
<p>Artificial Intelligence is building smart machines that can be able to think like humans and mimics their actions to solve complex problems. AI is used in the healthcare industry for faster and better diagnosis of diseases in lesser time than doctors, AI is also used in the transport industry with the emergence of self-driving cars, the creative and entertainment industry also use AI, as companies like Netflix and Disney use AI in their movie recommendation systems. Deep learning is a class of machine learning algorithms that uses multiple layers to progressively extract higher-level features from the raw input, it is an AI function that imitates the workings of the human brain in processing data and creating patterns for use in decision making utilizes structured and unstructured data, it structures algorithms in layers to create an artificial neural network that can learn and make intelligent unsupervised decisions. A practical example of deep learning is face recognition as it employs layers of neural networks that have been trained.</p>
<h1 id="heading-what-are-gans">WHAT ARE GANs?</h1>
<p><strong> GANs(Generative adversarial networks)</strong> are used in generative modelling using deep learning methods like in convolutional neural networks. Generative modelling is an unsupervised learning task in ML that involves automatically discovering and learning patterns in data inputs in a way that the model can be used to generate or output new examples that could have been drawn from the original dataset. GANs make generative models to be able to generate realistic examples across a range of problem domains, most notably in image-to-image translation and generating realistic photos of objects and people, it can also generate realistic 3D models, videos and more. Yann LeChun, one of the fathers of deep learning said that “GAN is the coolest idea of ML in the last 20 years”</p>
<h1 id="heading-how-do-gans-work">HOW DO GANs WORK?</h1>
<p>A GAN can be trained to generate images from random noises. For example, we can train a GAN to generate digit images that look like hand-written digit images from the MNIST database. GANs generally has two parts in them, the generator and the discriminator. The generator creates the images while the discriminator classifies the images into real and fake. The generator training makes use of a bridge between the generator and the discriminator.</p>
<p> Neural networks work with inputs, we input data that we want, maybe to classify or make a prediction, but GANs always outputs entirely new data instances so GANs take in random noises as inputs, the generator then transforms this noise into meaningful output. With noise, GAN can produce a wide variety of data, sampling from different places in the target distribution. Experiments suggest that the distribution of the noise doesn’t matter much, so we can choose something that is easy to sample from, as a uniform distribution. For convenience, the space from which the noise is sampled is usually of a smaller dimension than the dimensionality of the output space.</p>
<p> In training a neural network, we alter the network’s weight to reduce the loss of its output. The generator feeds into the discriminator and the discriminator produces the output we’re trying to affect. The generator loss penalizes the generator for producing a sample that the discriminator network.</p>
<h1 id="heading-visualizing-a-song">VISUALIZING A SONG</h1>
<p>As a visualizer plays a song file, it reads the audio data in very short time slices (usually less than 20 milliseconds). The visualizer does a Fourier transform on each slice, extracting the frequency components, and updates the visual display using the frequency information. An example is the Audiomack app visualizer.
How the visual display is updated in response to the frequency info is up to the programmer. Generally, the graphics methods have to be extremely fast and lightweight in order to update the visuals in time with the music (and not bog down the PC). In the early days (and still), visualizers often modified the colour palette in Windows directly to achieve some pretty cool effects. One characteristic of frequency-component-based visualizers is that they don’t often seem to respond to the “beats” of music (like percussion hits, for example) very well. More interesting and responsive visualizers can be written that combine the frequency-domain information with an awareness of “spikes” in the audio that often correspond to percussion hits.</p>
<h1 id="heading-the-deep-music-visualizer-and-biggan">THE DEEP MUSIC VISUALIZER AND BigGAN</h1>
<p>BigGAN is a new technology from the GANs family, BigGAN was created in 2018 at Google by Brock et al. BigGAN is considered big because it contains over 300million parameters trained on hundreds of google TPUs at the estimated cost of $60,000 and the result of this is an AI model that generates images from 1128 input parameters. Here, interpolation between classes without changing the noise vector reveals shared features in the latent space like faces, interpolating between random vectors reveals deeper structures. Apps like artbreeder have provided simple interfaces for creating AI artworks.
The deep music visualizer was built by Matt Siegelman, it is an open-source tool for navigating the latent space with sound. To use the deep music visualizer, one will first have to clone the GitHub repo and follow the installation guide at %[http://github.com/msieg/deep-music-visualizer]. This requires your python programming skills
Then run this command at the directory in your terminal:</p>
<pre><code><span class="hljs-selector-tag">python</span> <span class="hljs-selector-tag">visualize</span><span class="hljs-selector-class">.py</span> — <span class="hljs-selector-tag">song</span> <span class="hljs-selector-tag">theNameOfUrSong</span><span class="hljs-selector-class">.mp3</span>
</code></pre><blockquote>
<p>Note: Use the name of the song you want to visualize, having the .mp3 extension.</p>
</blockquote>
<p>The deep music visualizer syncs pitch with the class vector, volume and tempo with the noise vector, so that pitch controls the objects, shapes and texture in each frame, while volume and tempo control movement between frames. At each time point in the song, a chromagram of the twelve chromatic notes determines the weights of up to 12 ImageNet classes in the class vector.
BigGAN is big and slow, running a program on a normal laptop will take about 8hours to run. But with a resolution of 128x128, It should take about 25minutes and to run on a 128 by 128 resolution, you can use the command:</p>
<pre><code>python visualize.py — song theNameOfUrSong.mp3 — resolution <span class="hljs-number">128</span>
</code></pre><p>But one can, however, generate high-resolution images/videos by launching a virtual GPU on Google Cloud to speed up runtime from 8hours to a few minutes, but the virtual GPU isn’t free and costs $1/hour but Google awards new users with $300 in credit.
Talking about video durations, it can be useful to generate shorter videos to limit runtime while testing some other input parameters. The pitch sensitivity is the sensitivity of the class vector to changes in pitch. At higher pitch sensitivity, the shapes, textures and objects in the video change more rapidly and adhere more precisely to the notes in the music. The tempo sensitivity is the sensitivity of the noise vector to changes in volume and tempo. Higher tempo sensitivity yields more movement.</p>
<h1 id="heading-picture-examples-of-visualized-songs">Picture Examples of visualized songs</h1>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1638706477732/g1ZnPR7cK.jpeg" alt="image.jpeg" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1638706516585/I4kYKDT8C.jpeg" alt="image.jpeg" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1638706548827/q4mmuJbzP.jpeg" alt="image.jpeg" /></p>
<p><strong>Follow me 🤭</strong>
<a target="_blank" href="https://twitter.com/jeffdauda"> I’m on Twitter</a></p>
]]></content:encoded></item><item><title><![CDATA[Trojan's HNG Internship Goals - HNGi8]]></title><description><![CDATA[The HNG internship is a 3-month remote programme aimed at discovering talents in the world of software development, and recently, the internship has expanded across the borders of Africa from Nigeria. One thing I love about it is that it does not sel...]]></description><link>https://trojan.hashnode.dev/hngi8-goals-1</link><guid isPermaLink="true">https://trojan.hashnode.dev/hngi8-goals-1</guid><category><![CDATA[internships]]></category><category><![CDATA[jobs]]></category><category><![CDATA[learning]]></category><category><![CDATA[Go Language]]></category><category><![CDATA[Design]]></category><dc:creator><![CDATA[Jeff Dauda]]></dc:creator><pubDate>Sun, 15 Aug 2021 14:56:13 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1629031098686/Gepf3tcqM.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The HNG internship is a 3-month remote programme aimed at discovering talents in the world of software development, and recently, the internship has expanded across the borders of Africa from Nigeria. One thing I love about it is that it does not select who can take part in it, it is not gender biased, neither  it considerate of your position or academic qualification.  The internship is organized by  <a target="_blank" href="https://hotels.ng">hotels.ng</a> and <a target="_blank" href="https://zuri.team">Zuri</a> and supported by <a target="_blank" href="https://cars.ng">cars.ng</a> many other bodies interested in growing the African tech sector! </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1629032012041/Ux8VP4aRM.png" alt="hng-peeps-pnggg.PNG" />
I'm actually so happy to join the fun train, the HNGi8 is where I look forward to growing as a backend developer and learn about working with teams. I'm already in love with the whole setting and of course the networking and the #pepperdem humor channel 😂</p>
<p><strong>My internship goals within the end of 8 weeks </strong></p>
<ul>
<li><p>To be challenged and learn from it: I believe that everyone needs to be challenged one way or the other so as to bring the best out of one, and the tasks put up have seem to be those that will challenge ones critical thinking and agility as a software developer.</p>
</li>
<li><p>To network and meet new people: It's a thing of joy when you meet people who share same interest as you do and HNG has made it possible to meet people of different diversities from all over Africa.</p>
</li>
<li><p>Collaborate and make team-mates: I am so passionate about working with people and collaborating to solve problems together with them and I believe that helps increase the productivity and team-spirit between individuals</p>
</li>
<li><p>Sail through to the final stage of the internship and get that HNGi8 T-shirt.
<em>For  more info on HNG zuri internships, visit</em>  <a target="_blank" href="https://zuri.team">Zuri.team
</a> </p>
</li>
</ul>
<h1 id="below-are-some-tutorial-resources-to-get-you-started-on"><strong>Below are some tutorial resources to get you started on</strong></h1>
<ul>
<li>Figma: Figma is a design platform for teams who build products together. Born on the Web, Figma helps the entire product team create, test, and ship better designs.</li>
</ul>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=3q3FV65ZrUs">https://www.youtube.com/watch?v=3q3FV65ZrUs</a></div>
<p> </p>
<ul>
<li>Git: Git is software for tracking changes in any set of files, usually used for coordinating work among programmers collaboratively developing source code during software development</li>
</ul>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://product.hubspot.com/blog/git-and-github-tutorial-for-beginners">https://product.hubspot.com/blog/git-and-github-tutorial-for-beginners</a></div>
<ul>
<li>HTML: HyperText Markup Language, or HTML is the standard markup language for documents designed to be displayed in a web browser. It can be assisted by technologies such as Cascading Style Sheets and scripting languages such as JavaScript</li>
</ul>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=qz0aGYrrlhU">https://www.youtube.com/watch?v=qz0aGYrrlhU</a></div>
<ul>
<li>Golang: Go is a statically typed, compiled programming language designed at Google by Robert Griesemer, Rob Pike, and Ken Thompson. Go is syntactically similar to C, but with memory safety, garbage collection, structural typing, and CSP-style concurrency</li>
</ul>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=75lJDVT1h0s">https://www.youtube.com/watch?v=75lJDVT1h0s</a></div>
]]></content:encoded></item><item><title><![CDATA[The Google Africa Developer Scholarship Alert!]]></title><description><![CDATA[Grow with Google and Pluralsight have partnered for the third consecutive year to provide a program to support software developers across Africa in three different roles: Associate Android Developer; Associate Cloud Engineer and Mobile Web Specialist...]]></description><link>https://trojan.hashnode.dev/the-google-africa-developer-scholarship-alert</link><guid isPermaLink="true">https://trojan.hashnode.dev/the-google-africa-developer-scholarship-alert</guid><category><![CDATA[Google]]></category><category><![CDATA[Android]]></category><category><![CDATA[google cloud]]></category><category><![CDATA[Web Development]]></category><dc:creator><![CDATA[Jeff Dauda]]></dc:creator><pubDate>Tue, 11 May 2021 10:08:56 GMT</pubDate><content:encoded><![CDATA[<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1620726710199/MrKDNK2Il.jpeg" alt="google-africa-developer-scholarships-2021.jpg" />
     Grow with Google and Pluralsight have partnered for the third consecutive year to provide a program to support software developers across Africa in three different roles: Associate Android Developer; Associate Cloud Engineer and Mobile Web Specialist. Previous participants have gone on to build impactful projects for their communities, make incredible steps in their career journeys and even become Google certified developers and engineers.
The program gives participants free access to select courses, projects, embedded labs (powered by Qwiklabs) and skill assessments; plus, support from the Google Developer community. The resources available in the Google Africa Scholarship will help developers build the skills necessary to get their Google certification as the aim of this program is to continuously engage with aspiring and existing developers on a track to become professional developers with skills that can get them through the Google certification to demonstrate job readiness.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1620727363912/_4eiSyWcU.jpeg" alt="goo.jpg" />
https://twitter.com/andela_alc/status/1390607426940981256/photo/1</p>
<p>Eligibility Criteria</p>
<p>To be eligible for Google Africa Developer Scholarship 2021, applicants must meet the following criteria:</p>
<p>Be an existing or aspiring software developer.
Be at least 18 years of age and be a resident of a country in Africa.
Demonstrate excellent leadership and problem-solving skills.
For more details on how to apply, visit: https://www.pluralsight.com/partners/google/africa/gads-2021</p>
]]></content:encoded></item></channel></rss>