<?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>DEV Community: Alfie Torres</title>
    <description>The latest articles on DEV Community by Alfie Torres (@alfielytorres).</description>
    <link>https://dev.to/alfielytorres</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%2F417207%2Fb3b198dc-0f4b-4eb3-a6af-10ab82d2aece.JPG</url>
      <title>DEV Community: Alfie Torres</title>
      <link>https://dev.to/alfielytorres</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alfielytorres"/>
    <language>en</language>
    <item>
      <title>Are Singleton Patterns Bad? </title>
      <dc:creator>Alfie Torres</dc:creator>
      <pubDate>Tue, 14 Jul 2020 06:15:05 +0000</pubDate>
      <link>https://dev.to/alfielytorres/are-singleton-patterns-bad-4bdi</link>
      <guid>https://dev.to/alfielytorres/are-singleton-patterns-bad-4bdi</guid>
      <description>

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>Organising Cat Videos using Python</title>
      <dc:creator>Alfie Torres</dc:creator>
      <pubDate>Fri, 10 Jul 2020 03:41:23 +0000</pubDate>
      <link>https://dev.to/alfielytorres/organising-cat-videos-using-python-429g</link>
      <guid>https://dev.to/alfielytorres/organising-cat-videos-using-python-429g</guid>
      <description>&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%2Fqtndg7moh08cvtzh1twn.jpeg" 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%2Fqtndg7moh08cvtzh1twn.jpeg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After learning Python yesterday, I thought that It would be best to solidify my learning by building something useful. One issue I had over the week involved compiling around 500+ videos for my kittens birthday celebration. After organising the first 10 videos by month, I was already fed up.&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%2Fmiro.medium.com%2Fmax%2F1400%2F1%2A1SCpkxYqDFXDGwkBm1_oiw.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%2Fmiro.medium.com%2Fmax%2F1400%2F1%2A1SCpkxYqDFXDGwkBm1_oiw.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To my attention, I realised that I could actually make a script in python to go through these videos much faster. Using the &lt;em&gt;GetFileInfo -d yourfile.mov&lt;/em&gt;, I realised that I could actually get the unique month and year that the file was created in.&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%2Fmiro.medium.com%2Fmax%2F836%2F1%2AtB9gbBmOfANSoE0rt6ZBqw.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%2Fmiro.medium.com%2Fmax%2F836%2F1%2AtB9gbBmOfANSoE0rt6ZBqw.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, comes the part where I have to use Python&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
import os, shutil 
from datetime import datetime

filepath = "/Users/alfietorres/Downloads/"      #base file path 
for filename in os.listdir(filepath):           #iterate through each file in the directory

    r = os.stat(filepath+filename)              #look for the file path and the file name
    d = r.st_birthtime                          #look for the time created 
    date=datetime.fromtimestamp(d)              #assign the details to a date variable

    month_directory = filepath+str(date.month)+"-"+str(date.year)      #use the date variable to create a UNIQUE new directory 
    file_being_moved = filepath+filename        #file the path of the file being moved    

    if os.path.isdir(month_directory) :         #check if the directory is created
        print("directory found ... ")
        shutil.move(file_being_moved,month_directory)   #move the file we are iterating on to the directory
    else: 
        print("creating directory ... ")        
        os.mkdir(month_directory)                       #create new directory 
        shutil.move(file_being_moved,month_directory)   #move items in new directory

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

&lt;/div&gt;



&lt;p&gt;Essentially, we have a for each loop going through each file in the downloads directory.&lt;/p&gt;

&lt;p&gt;Afterwards, we find the month-year of that file and check if has already been created.&lt;/p&gt;

&lt;p&gt;If the new directory has already been created, then all we have to do is move the file.&lt;/p&gt;

&lt;p&gt;If it has not been created then we will create a new directory and move the file into that directory.&lt;/p&gt;

&lt;p&gt;After running the file, we get the following output (voila). Now you have an organised list of new directories. You can even add new videos in the Downloads directory and run the script again to reorganise the files.&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%2Fmiro.medium.com%2Fmax%2F1400%2F1%2A9A7p5-yINf2SLB_7t0ggNQ.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%2Fmiro.medium.com%2Fmax%2F1400%2F1%2A9A7p5-yINf2SLB_7t0ggNQ.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The Memory Layout Explained</title>
      <dc:creator>Alfie Torres</dc:creator>
      <pubDate>Sun, 05 Jul 2020 09:32:31 +0000</pubDate>
      <link>https://dev.to/alfielytorres/the-memory-layout-explained-4d73</link>
      <guid>https://dev.to/alfielytorres/the-memory-layout-explained-4d73</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GwchSuJK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://miro.medium.com/max/960/1%2ApSVHIObqQy40yHGholXDnQ.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GwchSuJK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://miro.medium.com/max/960/1%2ApSVHIObqQy40yHGholXDnQ.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--36uBd-xm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AanpjYKbSSgJ3CUNkQHeKVA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--36uBd-xm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AanpjYKbSSgJ3CUNkQHeKVA.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All programs are stored in memory, these are stored in virtual addresses that the OS/CPU map to physical addresses. The memory model has 5 segments and are responsible for holding memory&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stack Segment&lt;/strong&gt; — function local variables, arguments, context&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Heap Segment&lt;/strong&gt;: dynamic program data (e.g., malloc)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Block Started by Symbol segment:&lt;/strong&gt; uninitialized global and static variables&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data Segment:&lt;/strong&gt; initialised global and static variables&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Text Segment&lt;/strong&gt;: program code and fixed program constants&lt;/p&gt;

&lt;p&gt;On the third column of the diagram, we see examples of how these segments may actually look like.&lt;/p&gt;

&lt;h1&gt;
  
  
  Memory Allocation
&lt;/h1&gt;

&lt;p&gt;Now that we know how the memory model looks like let’s see how memory is actually allocated.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--g34ApExR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1002/1%2AvV4r4kfb-SKKh_pRNupsew.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--g34ApExR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1002/1%2AvV4r4kfb-SKKh_pRNupsew.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Going back to our diagram, let’s look at what happens in runtime. During runtime, the stack segment and heap segment grow in opposite directions. The heap goes from lower addresses to higher addresses and the stack segment goes from high addresses to low addresses.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--54ijf9i3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1070/1%2AzsAMrQXZ28ypFpN5ttRCMw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--54ijf9i3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1070/1%2AzsAMrQXZ28ypFpN5ttRCMw.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Ok I get what the stack segment stores, but how does memory get allocated in the stack ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Stack&lt;/p&gt;

&lt;p&gt;Alright, well in computer architecture, the stack is a hardware manifestation of the data structure (Last in, First Out Queue). The stack needs to&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Call a function&lt;/strong&gt; — As such, we need to store data&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Return from a function&lt;/strong&gt; — As such, we need to restore data&lt;/p&gt;

&lt;h1&gt;
  
  
  Working Example
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Stack Layout
&lt;/h2&gt;

&lt;p&gt;Given the code below we want access y and increment y by 1.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EE9tQX_E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AhtdsRh16oAWQzgBNuhUXzg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EE9tQX_E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AhtdsRh16oAWQzgBNuhUXzg.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6e_moxmc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AoxgOD5kH5e3Q-V0pnlgiwg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6e_moxmc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AoxgOD5kH5e3Q-V0pnlgiwg.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So in this example, we see that the arguments are arranged in the verse order, while the local variables are pushed in the same order they appear in the code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 1: Call a Function
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;ESP&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tC3UfZdx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1350/1%2A8Qnhl8E42IDBQShBqqckag.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tC3UfZdx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1350/1%2A8Qnhl8E42IDBQShBqqckag.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every time, we push some data in the stack and the shrinks every time we pop something from stack. The&lt;/p&gt;

&lt;p&gt;ESP is the Extended Stack Pointer and this register purpose is to let you know where on the stack you are. Thus, ESP always marks the top (highest point of the stack) of the stack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;EBP&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In order to increment y, we need to know where y is stored in the stack. However, it’s difficult to know what y’s address is in compile time&lt;/p&gt;

&lt;p&gt;For example, if y is stored in 0xbfff333, in the next time the function is called y can be stored in a totally different address (e.g. 0xbfff9F3).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Oh no, So how do we locate y?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Well luckily, we can use %ebp as an anchor point to find these variables. The EBP formally defined as the Extended Base Stack Pointer and its purpose is to point to the base address of the stack.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MlbgQ1-2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2As7vfMmy8Rx4er5pVNXwKYA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MlbgQ1-2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2As7vfMmy8Rx4er5pVNXwKYA.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Based on the diagram above, let’s say that y is 8 bytes before EBP. So now the compiler will know that whenever this function is called, y will be 8 bytes before the EBP&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 2: Return from a Function
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EE9tQX_E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AhtdsRh16oAWQzgBNuhUXzg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EE9tQX_E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AhtdsRh16oAWQzgBNuhUXzg.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HvX8Flgv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AdbuHTGYBwD9Hk3nIsbzg1g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HvX8Flgv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AdbuHTGYBwD9Hk3nIsbzg1g.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So for example, when %esp has finally reached %ebp, we can&lt;/p&gt;

&lt;p&gt;- push %ebp before local variables and&lt;/p&gt;

&lt;p&gt;- then set %ebp to the current %esp and&lt;/p&gt;

&lt;p&gt;- then set %ebp to the %ebp at return&lt;/p&gt;

&lt;p&gt;In simple terms, we have saved the frame pointer in the stack.&lt;/p&gt;

&lt;p&gt;Afterwards, we have updated the frame pointer to be the current stack pointer.&lt;/p&gt;

&lt;p&gt;Now, when the func functions starts to run, it will push its local variables after the stack pointer.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do we continue our operations in main?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EE9tQX_E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AhtdsRh16oAWQzgBNuhUXzg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EE9tQX_E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AhtdsRh16oAWQzgBNuhUXzg.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gDoFuA32--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AJ_XD4pm94RVPomnw8O8Upw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gDoFuA32--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AJ_XD4pm94RVPomnw8O8Upw.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that we have called the function and returned, how do make the sure the program continues to run? This is where EIP comes in handy.&lt;/p&gt;

&lt;p&gt;EIP is formally defined as the Extended Instruction Pointer. It is a read-only register and it contains the address of the next instruction to read on the program, point always to the “Program Code” memory segment.&lt;/p&gt;

&lt;p&gt;So, when main is running it moves the EIP up the main function. When it hits 0x*&lt;em&gt;8048455, it calls func. When it goes to call it, the EIP goes to func at 0x&lt;/em&gt;*804840b. Let’s see how this looks like in the stack layout&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xO83CMNl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2A6UEf4lzP3JiWUlwZCMzNrg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xO83CMNl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2A6UEf4lzP3JiWUlwZCMzNrg.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So looking at the stack layout, we see that EIP is EBP+4. As such, when we are done we will just need to set the current frame pointer (EBP) to 4 from the callee (in the caller’s data).&lt;/p&gt;

&lt;p&gt;Afterwards, we can just return to the main function and continue where we left off.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;References&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Mercolino. (2014). Understanding Buffer Overflows Attacks. Retrieved from &lt;a href="https://itandsecuritystuffs.wordpress.com/2014/03/18/understanding-buffer-overflows-attacks-part-1/"&gt;https://itandsecuritystuffs.wordpress.com/2014/03/18/understanding-buffer-overflows-attacks-part-1/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>computerscience</category>
    </item>
    <item>
      <title>Google login authentication with Firebase in Android (2020)</title>
      <dc:creator>Alfie Torres</dc:creator>
      <pubDate>Sun, 05 Jul 2020 09:26:39 +0000</pubDate>
      <link>https://dev.to/alfielytorres/google-login-authentication-with-firebase-in-android-2020-538e</link>
      <guid>https://dev.to/alfielytorres/google-login-authentication-with-firebase-in-android-2020-538e</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qpyyF19r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://miro.medium.com/max/960/1%2AQ12oZ5CgItDK9kGr9Cw4Hw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qpyyF19r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://miro.medium.com/max/960/1%2AQ12oZ5CgItDK9kGr9Cw4Hw.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Add the following dependencies in your build.gradle&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;implementation 'com.google.firebase:firebase-auth:19.3.1'  
implementation 'com.google.android.gms:play-services-auth:18.0.0'
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--g_uQYE6J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2A9tlt6_Ta7JlDJIWX8nHw_Q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--g_uQYE6J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2A9tlt6_Ta7JlDJIWX8nHw_Q.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before starting, I am assuming that you already connected your Android app with firebase. In this case, I already connected week12lab with firebase&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QfiIRYC2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AWtQocO3Fg-ok5_jThm8e3A.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QfiIRYC2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AWtQocO3Fg-ok5_jThm8e3A.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Afterwards, press the Android option and create a new app&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Or_dEflO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2A_CBaiQs7Pe0MDuWjtd9cvQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Or_dEflO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2A_CBaiQs7Pe0MDuWjtd9cvQ.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Android package name can be found in the build.gradle file under the applicationId name. Additionally we will have to create a SHA-1 certificate for debug signing&lt;/p&gt;

&lt;p&gt;In order to generate the SHA-1 key type the following command in your terminal&lt;/p&gt;

&lt;p&gt;&lt;em&gt;keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WWxLVTE2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AhJQuvXWId0h557GdY-QLSQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WWxLVTE2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AhJQuvXWId0h557GdY-QLSQ.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Result of the command. I hid my SHA1 certificate fingerprints.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--C25jZeP0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2Aiz416V5MKhlcfcBuVZZnKQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--C25jZeP0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2Aiz416V5MKhlcfcBuVZZnKQ.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Add the google-services.json file to your app folder&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8_PihRfl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2ARYZ0vXViiACfno_6xjjdAA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8_PihRfl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2ARYZ0vXViiACfno_6xjjdAA.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Outline
&lt;/h1&gt;

&lt;p&gt;A detailed explanation can be found in Google’s &lt;a href="https://developers.google.com/identity/sign-in/android/sign-in"&gt;official documentation&lt;/a&gt;. This tutorial is simply made to explain each step as concisely as possible.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Configure Google Sign-in and GoogleSignInClient object&lt;/li&gt;
&lt;li&gt; Check for existing signed-in use&lt;/li&gt;
&lt;li&gt; Use Firebase Auth&lt;/li&gt;
&lt;li&gt; Add What will happen if valid user logs in&lt;/li&gt;
&lt;li&gt; Add a logout button&lt;/li&gt;
&lt;li&gt; Play with user’s data&lt;/li&gt;
&lt;li&gt; Update manifest&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  1 | Configure Google Sign-in and the GoogleSignInClient object
&lt;/h1&gt;

&lt;p&gt;The following makes a sign in request to google&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Configure Google Sign In  
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT\_SIGN\_IN)  
        .requestIdToken(getString(R.string.default\_web\_client\_id))  
        .requestEmail()  
        .build();
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nn3W1pg6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2A1NWm9C0nd46EamE_iJlYFw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nn3W1pg6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2A1NWm9C0nd46EamE_iJlYFw.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Afterwards in onCreate we will need to add a Google sign in client&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Build a GoogleSignInClient with the options specified by gso.  
mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wC6JsuJd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AHBIGpHk2FEgSeSAGIcLgvA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wC6JsuJd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AHBIGpHk2FEgSeSAGIcLgvA.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Line 15 and 27, show how we added a new GoogleSignInClient and instantiated it in the onCreate method.&lt;/p&gt;

&lt;h1&gt;
  
  
  2 | Create XML login button and Signin Method
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Create Login Button&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create a new XML class called login.xml and add the Google sign in button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RPCDkJxd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2An5G0A8OFabUtIFPKm2ebbA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RPCDkJxd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2An5G0A8OFabUtIFPKm2ebbA.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a Sign In Method&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We then need to make a sign in intent to Google. We will have to make a new method in the LoginActivity class.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;private void signIn() {  
    Intent signInIntent = mGoogleSignInClient.getSignInIntent();  
    startActivityForResult(signInIntent, RC\_SIGN\_IN);  
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PuYtKr_d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AhZWSyMDNhdrGY59bJ3FjVQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PuYtKr_d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AhZWSyMDNhdrGY59bJ3FjVQ.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;RC_SIGN_IN can be any number. In this case, I assigned 1.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a new listener to use Sign In method&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9lZO4ZTm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AHnGTzWZSzrMnrhuD9QcaiA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9lZO4ZTm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AHnGTzWZSzrMnrhuD9QcaiA.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Create a new onclicklistener that makes use of the new signin() method we just created.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Find the button and set the onClickListener&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5enOMSni--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AiYYYX4hoyFTz80p61tHTtA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5enOMSni--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AiYYYX4hoyFTz80p61tHTtA.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Find the button that we create in our XML and assign the handleGoogleLogin listener to it.&lt;/p&gt;

&lt;h1&gt;
  
  
  3 | Use Firebase Auth
&lt;/h1&gt;

&lt;p&gt;Now that we have made the intent, we can now check if the google account is a valid account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Add onActivityResult&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
@Override  
public void onActivityResult(int requestCode, int resultCode, Intent data) {  
    super.onActivityResult(requestCode, resultCode, data);  


    // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);  
    if (requestCode == _RC\_SIGN\_IN_) {  
        Task&amp;lt;GoogleSignInAccount&amp;gt; task = GoogleSignIn._getSignedInAccountFromIntent_(data);  
        try {  
            // Google Sign In was successful, authenticate with Firebase  
            GoogleSignInAccount account = task.getResult(ApiException.class);  
            firebaseAuthWithGoogle(account);  
        } catch (ApiException e) {  
            // Google Sign In failed, update UI appropriately  
            // ...  
            Toast._makeText_(this, e.getMessage(), Toast._LENGTH\_SHORT_).show();  
        }  
    }  
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Add firebaseAuthWithGoogle(String idToken)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The credentials below will be the credential of the user logging in. If it is a success then we allow the user to sign in.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;private void firebaseAuthWithGoogle(GoogleSignInAccount account) {  
    AuthCredential credential = GoogleAuthProvider._getCredential_(account.getIdToken(), null);  

    mAuth.signInWithCredential(credential)  
            .addOnCompleteListener(this, new OnCompleteListener&amp;lt;AuthResult&amp;gt;() {  
                @Override  
                public void onComplete(@NonNull Task&amp;lt;AuthResult&amp;gt; task) {  
                    if (task.isSuccessful()) {  
                        // Sign in success, update UI with the signed-in user's information  
                        FirebaseUser user = mAuth.getCurrentUser();  
                        Intent intent = new Intent(getApplicationContext(), MainActivity.class);  
                        startActivity(intent);  

                    } else {  
                        // If sign in fails, display a message to the user.  
                        Toast._makeText_(getApplicationContext(), "Sorry authentication failed ", Toast._LENGTH\_SHORT_).show();  

                    }  
                }  
            });  
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Instantiate the FirebaseAuth in onCreate()&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mAuth = FirebaseAuth.getInstance();
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  4 | Add What will happen if valid user logs in
&lt;/h1&gt;

&lt;p&gt;On the onStart() lifecycle method add the following code in order to check if the current user is already signed in.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;protected void onStart() {  

    super.onStart();  
    FirebaseUser currentUser = mAuth.getCurrentUser();  
    if(currentUser!=null){  
        Intent intent = new Intent(getApplicationContext(),MainActivity.class);  
        startActivity(intent);  
    }  
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  5 | Add a logout button
&lt;/h1&gt;

&lt;p&gt;In my case, I have already had a drawer navigation layout. As such, I made a new id so that I can find the logout id and use it. However, whether or not you use a drawer navigation option to do this, the process will still be the same.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zamJvU7j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1248/1%2AqfMUOpzc8BXkTxaBMrwCrw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zamJvU7j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1248/1%2AqfMUOpzc8BXkTxaBMrwCrw.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The important part of this code is the logout id&lt;/p&gt;

&lt;p&gt;Create a handleLogout method. This can also be rewritten as a onClickListener incase you are using buttons&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--R4_wyYKk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2A-NKrqKRfrx6mNr4d3eeY5g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--R4_wyYKk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2A-NKrqKRfrx6mNr4d3eeY5g.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The following invokes handleLogout when the logout case is chosen&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pVlDdHDk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/800/1%2AEmb3acchvMdeai5eQkLNFQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pVlDdHDk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/800/1%2AEmb3acchvMdeai5eQkLNFQ.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  6 | Play with user’s data
&lt;/h1&gt;

&lt;p&gt;Now that a user has logged in, We can find some data about them to make the app more personalised to them. One way we can do this is by creating a toast if they logged back in the app. We can do this by adding the following in the MainActivity’s onCreate&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//Google sign  
GoogleSignInAccount signInAccount= GoogleSignIn._getLastSignedInAccount_(this);  
if(signInAccount!=null){  
    Toast.makeText(this, "Welcome back "signInAccount.getDisplayName() , Toast._LENGTH\_SHORT_).show();  
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  7 | Update manifest
&lt;/h1&gt;

&lt;p&gt;Make sure both LoginActivity and MainActivity are in the manifest&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cJKHxvkM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2A4wlceU9LC6-ToS6uOR69xA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cJKHxvkM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2A4wlceU9LC6-ToS6uOR69xA.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  8 | Test
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VW7tCUaf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://miro.medium.com/max/548/1%2Ai7ZCsL51Oo5rFDOuXz1Jjw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VW7tCUaf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://miro.medium.com/max/548/1%2Ai7ZCsL51Oo5rFDOuXz1Jjw.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>java</category>
      <category>googlecloud</category>
    </item>
    <item>
      <title>Top 10 IT Certifications To Take While You Are At University in 2020</title>
      <dc:creator>Alfie Torres</dc:creator>
      <pubDate>Sun, 05 Jul 2020 09:17:04 +0000</pubDate>
      <link>https://dev.to/alfielytorres/top-10-it-certifications-to-take-while-you-are-at-university-in-2020-10hg</link>
      <guid>https://dev.to/alfielytorres/top-10-it-certifications-to-take-while-you-are-at-university-in-2020-10hg</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--idKIHlc5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/f8kzjx3csaynwcm2muzy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--idKIHlc5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/f8kzjx3csaynwcm2muzy.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Studying university courses are great, but up-skilling ourselves on industry used certifications can add a lot of value to our personal bag of skills once we graduate. Here are 10 certifications you should think about getting while you are still at university.&lt;/p&gt;

&lt;h1&gt;
  
  
  1 | Google Certified Professional Cloud Architect
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Price&lt;/em&gt;:&lt;/strong&gt; AUD 285.88&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Career&lt;/em&gt;:&lt;/strong&gt; Cloud Architecture&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;About&lt;/em&gt;:&lt;/strong&gt; Ranked #1 top paying IT certification for 2019. Cloud computing is amongst one of the most popular technologies in 2019 because of its ability to make work practices more efficient and less costly. Google’s certification allows individuals to work with the Google Cloud Platform to:&lt;/p&gt;

&lt;p&gt;Design and plan a cloud solution architecture&lt;/p&gt;

&lt;p&gt;Manage and provision the cloud solution infrastructure&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cloud.google.com/certification/cloud-architect"&gt;&lt;strong&gt;&lt;em&gt;Learn More Here&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  2 | Certified ScrumMaster
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Price:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Professional Scrum Master I (Fundamental) — AUD 214.41&lt;/p&gt;

&lt;p&gt;Professional Scrum Master II (Advanced) — AUD 357.35&lt;/p&gt;

&lt;p&gt;Professional Scrum Master III(Advanced) — AUD 714.71&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Career:&lt;/em&gt;&lt;/strong&gt; Project Management&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;About:&lt;/em&gt;&lt;/strong&gt; Scrum is a methodology that allows a team to self-organize and make changes quickly, in accordance with agile principles. The scrum master manages the process for how information is exchanged. There are three levels&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.scrum.org/professional-scrum-master-i-certification"&gt;&lt;strong&gt;&lt;em&gt;Learn More Here&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  3 | AWS Certified Solutions Architect — Associate
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Price:&lt;/em&gt;&lt;/strong&gt; AUD 214.41&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Career:&lt;/em&gt;&lt;/strong&gt; Software Design&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;About:&lt;/em&gt;&lt;/strong&gt; AWS is certainly becoming an industry standard when it comes to cloud, infrastructure and automation technologies. This is why getting an AWS certificate is almost certainly going to help you later in your career path. By learning at least one AWS certificate you will be introduced to popular terms and techniques specially made in AWS rich ecosystem. One of the best certificates is AWS’ Certified Solutions Architect. This teaches you how to architect and deploy secure and robust applications on AWS technologies&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/certification/certified-solutions-architect-associate/"&gt;&lt;strong&gt;&lt;em&gt;Learn More Here&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  4| AWS Certified Developer — Associate
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Price:&lt;/em&gt;&lt;/strong&gt; AUD 214.41&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Career:&lt;/em&gt;&lt;/strong&gt; Software Development&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;About:&lt;/em&gt;&lt;/strong&gt; In comparison to AWS’ Certified Solutions Architect, this certificate is specially made for developers who want to write code in serverless applications. This helps developers best practices when writing, maintaining and debugging code modules on AWS.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/certification/certified-developer-associate/"&gt;&lt;strong&gt;&lt;em&gt;Learn More Here&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  5 | CEH — Certified Ethical Hacker
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Price:&lt;/em&gt;&lt;/strong&gt; AUD 1000+ Price varies depending on your course provider&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Career:&lt;/em&gt;&lt;/strong&gt; Cybersecurity&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;About:&lt;/em&gt;&lt;/strong&gt; master an ethical hacking methodology that can be used in a penetration testing or ethical hacking situation. You walk out the door with ethical hacking skills that are highly in demand, as well as the globally recognised Certified Ethical Hacker certification&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.eccouncil.org/programs/certified-ethical-hacker-ceh/"&gt;&lt;strong&gt;&lt;em&gt;Learn More Here&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Click&lt;/em&gt;&lt;/strong&gt; &lt;a href="https://iclass.eccouncil.org/our-courses/certified-ethical-hacker-ceh/"&gt;&lt;strong&gt;&lt;em&gt;Here&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;&lt;em&gt;to be directed to an Australian Course Provider&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  6 |Offensive Security Certified Professional (OSCP)
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Price:&lt;/em&gt;&lt;/strong&gt; AUD 1000 + Price includes Penetration Testing Training with Kali Linux&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Career:&lt;/em&gt;&lt;/strong&gt; Cybersecurity (Penetration Testing)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;About:&lt;/em&gt;&lt;/strong&gt; For hands-on experience, each student receives access to a virtual penetration testing lab where techniques learned within the course can be practiced The OSCP is among the most respected and sought-after designation within the information security space.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.offensive-security.com/pwk-syllabus/"&gt;&lt;strong&gt;&lt;em&gt;Learn More Here&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  7 | Project Management Professional
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Price:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Member: AUD 578.92&lt;/p&gt;

&lt;p&gt;Non-Member: AUD 793.33&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Career:&lt;/em&gt;&lt;/strong&gt; Project Management&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;About:&lt;/em&gt;&lt;/strong&gt; This certification is meant for experienced project managers who want to go the extra mile in up-skilling themselves. This certificate signifies that you speak and understand the global language of project management and connects you to a community of professionals, organisations and experts worldwide.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.pmi.org/certifications/types/project-management-pmp"&gt;&lt;strong&gt;&lt;em&gt;Learn More Here&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  8 | Microsoft Exam 70–761
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Price:&lt;/em&gt;&lt;/strong&gt; AUD 235.85&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Career:&lt;/em&gt;&lt;/strong&gt; Database Administrator&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;About:&lt;/em&gt;&lt;/strong&gt; This exam is intended for SQL Server database administrators, system engineers, and developers who are seeking to validate their skills and knowledge in writing queries. This would require individuals to learn technologies such as XML, JSON and temporal tables&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.microsoft.com/en-us/learning/exam-70-761.aspx"&gt;&lt;strong&gt;&lt;em&gt;Learn More Here&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  9 | ITIL v4 Foundation
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Price:&lt;/em&gt;&lt;/strong&gt; AUD 395 Price varies&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Career:&lt;/em&gt;&lt;/strong&gt; IT service management&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;About:&lt;/em&gt;&lt;/strong&gt; Focuses on using the ITIL frameworks to provide the best practices for businesses to more effectively manage there IT services. This includes key concepts from Lean, Agile, DevOps, and why these are important to deliver business value&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.axelos.com/certifications/itil-certifications/itil-foundation-level"&gt;&lt;strong&gt;&lt;em&gt;Learn More Here&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  10 | CISA: Certified Information Systems Auditor
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Price:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Members — AUD 664.69&lt;/p&gt;

&lt;p&gt;Non-Members — AUD 850.52&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Career:&lt;/em&gt;&lt;/strong&gt; Information Security Auditing&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;About:&lt;/em&gt;&lt;/strong&gt; This certificate is highly valued by recruiters as it gives you an edge if you want to get in the world of IT auditing. However, this certificate is not something you would be getting in university. since this requires 5 years of work experience (or its equivalents).&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.isaca.org/Certification/CISA-Certified-Information-Systems-Auditor/Pages/default.aspx"&gt;&lt;strong&gt;&lt;em&gt;Learn More Here&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>career</category>
    </item>
  </channel>
</rss>
