<?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: Eric Gitonga</title>
    <description>The latest articles on DEV Community by Eric Gitonga (@egimba).</description>
    <link>https://dev.to/egimba</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%2F75560%2F954de39d-1fca-4ba7-aeb2-b9171b78fed0.jpg</url>
      <title>DEV Community: Eric Gitonga</title>
      <link>https://dev.to/egimba</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/egimba"/>
    <language>en</language>
    <item>
      <title>Wrong Selection in R</title>
      <dc:creator>Eric Gitonga</dc:creator>
      <pubDate>Mon, 28 Jan 2019 23:40:03 +0000</pubDate>
      <link>https://dev.to/egimba/wrong-selection-in-r-l6p</link>
      <guid>https://dev.to/egimba/wrong-selection-in-r-l6p</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fbC6kvA1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://egmgem.com/blog/wp-content/uploads/2019/01/fig-1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fbC6kvA1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://egmgem.com/blog/wp-content/uploads/2019/01/fig-1.jpg" alt="" class="wp-image-2419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While reading the section on data frames in The Book of R, I got a result that was wrong from that in the exercise. Wrong because I had left out a comma in the code. Before I would just have corrected it and moved on, but this time around I wanted to know why it is I got that wrong result.&lt;/p&gt;

&lt;p&gt;The data frame I was working with is&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BD9-Z4p9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://egmgem.com/blog/wp-content/uploads/2019/01/fig0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BD9-Z4p9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://egmgem.com/blog/wp-content/uploads/2019/01/fig0.png" alt="mydata Data Frame" class="wp-image-2414"&gt;&lt;/a&gt;   &lt;/p&gt;

&lt;p&gt;The code I typed was &lt;code&gt;mydata[mydata$sex=="F"]&lt;/code&gt; This resulted in the following output:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LW6Ppm_N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://egmgem.com/blog/wp-content/uploads/2019/01/fig1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LW6Ppm_N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://egmgem.com/blog/wp-content/uploads/2019/01/fig1.png" alt="Unexpected Results" class="wp-image-2415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not quite what I expected. I then typed out just the test itself &lt;code&gt;mydata$sex=="F"&lt;/code&gt; and got the following vector of logicals.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kUtnKvsb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://egmgem.com/blog/wp-content/uploads/2019/01/fig2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kUtnKvsb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://egmgem.com/blog/wp-content/uploads/2019/01/fig2.png" alt="Logicals vector" class="wp-image-2416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Looking at it, and comparing it to the output I got, things started making sense. The two columns I got back from my original code coincided with the logical &lt;code&gt;TRUE&lt;/code&gt; values in the vector from the second code. What I had done by leaving out the comma was make a selection of columns instead of a selection of rows meeting the test criteria.&lt;/p&gt;

&lt;p&gt;With this knowledge, I typed out the proper code &lt;code&gt;mydata[mydata$sex=="F",]&lt;/code&gt; to get&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XUPGUKrF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://egmgem.com/blog/wp-content/uploads/2019/01/fig3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XUPGUKrF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://egmgem.com/blog/wp-content/uploads/2019/01/fig3.png" alt="Expected Results" class="wp-image-2417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The result I expected. Forcing myself to slow down and actually understand why code gives the output it does is doing wonders for my learning progress. Had I not understood from earlier reading and exercises how row and column selection coupled with logical values actually works, this would have been a much more difficult issue to figure out. Onwards with learning R!&lt;/p&gt;

&lt;p&gt;Resources:&lt;/p&gt;

&lt;p&gt;The Book of R: &lt;a href="https://nostarch.com/bookofr"&gt;https://nostarch.com/bookofr&lt;/a&gt;&lt;/p&gt;

</description>
      <category>r</category>
      <category>beginners</category>
      <category>learning</category>
    </item>
    <item>
      <title>Excluding Diagonal Elements from a Matrix in R</title>
      <dc:creator>Eric Gitonga</dc:creator>
      <pubDate>Thu, 10 Jan 2019 18:12:15 +0000</pubDate>
      <link>https://dev.to/egimba/excluding-diagonal-elements-from-a-matrix-in-r-341d</link>
      <guid>https://dev.to/egimba/excluding-diagonal-elements-from-a-matrix-in-r-341d</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%2Fegmgem.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F01%2F00-rmatrix-1024x433.jpg" 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%2Fegmgem.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F01%2F00-rmatrix-1024x433.jpg" alt="The Book of R and a 10x10 Identity Matrix"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I am going through &lt;em&gt;The Book of R&lt;/em&gt; by Tilman M. Davies as an introduction into things Data Science. During one of the exercises (4.1 part e on page 64), I came across this problem:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;By extracting the diagonal elements of the logical matrix created in (c), use  &lt;code&gt;any&lt;/code&gt; to confirm there are no &lt;code&gt;TRUE&lt;/code&gt; entries.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The said matrix is a 10×10 identity matrix. How does one do that extraction and testing? I tried everything that had been taught from the book thus far and could not find a way to do it. Off to Google I went in search of a solution.&lt;/p&gt;

&lt;p&gt;From various sources, I got to learn of the &lt;code&gt;lower.tri()&lt;/code&gt; and &lt;code&gt;upper.tri()&lt;/code&gt; functions. Those seemed like they could do what I wanted. Only hitch is, I can only extract either the lower or upper half depending on the function used.&lt;/p&gt;

&lt;p&gt;However, I have learned that you can use the &lt;code&gt;c()&lt;/code&gt; function to combine different items into one vector. That means I can use the two functions to extract the portions I need, then combine the results, then do the required test.&lt;/p&gt;

&lt;p&gt;For simplicity, I shall use a 3×3 identity matrix to demonstrate. First, let us form it using the &lt;code&gt;diag()&lt;/code&gt; function and assign it to the variable &lt;code&gt;t&lt;/code&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/http%3A%2F%2Fegmgem.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F01%2F01-diag.jpg" 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/http%3A%2F%2Fegmgem.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F01%2F01-diag.jpg" alt="Command to create the 3x3 identity matrix"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next we use each of the &lt;code&gt;lower.tri()&lt;/code&gt; and &lt;code&gt;upper.tri()&lt;/code&gt; functions to identify the lower and upper halves of &lt;code&gt;t&lt;/code&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/http%3A%2F%2Fegmgem.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F01%2F02-loup.jpg" 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/http%3A%2F%2Fegmgem.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F01%2F02-loup.jpg" alt="Isolating the lower and upper halves."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the arguments of both functions, we set &lt;code&gt;diag = FALSE&lt;/code&gt; since we want to make sure the diagonals are left out. If we did not have that argument set, we would capture the ones in the diagonal, contrary to our goal.&lt;/p&gt;

&lt;p&gt;Now we can extract each of those halves of zeros from &lt;code&gt;t&lt;/code&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/http%3A%2F%2Fegmgem.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F01%2F03-extract.jpg" 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/http%3A%2F%2Fegmgem.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F01%2F03-extract.jpg" alt="Extracting the zeros from the matrix."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since we want to store these as &lt;code&gt;FALSE&lt;/code&gt;, we test to see if they are equal to &lt;code&gt;TRUE&lt;/code&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/http%3A%2F%2Fegmgem.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F01%2F04-test.jpg" 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/http%3A%2F%2Fegmgem.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F01%2F04-test.jpg" alt="Testing if equal to TRUE to get FALSE vallues."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we can use the &lt;code&gt;c()&lt;/code&gt; function to combine these two halves into one vector &lt;code&gt;s&lt;/code&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/http%3A%2F%2Fegmgem.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F01%2F05-combine.jpg" 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/http%3A%2F%2Fegmgem.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F01%2F05-combine.jpg" alt="Combining the values into one vector."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, we can carry out the operation requested in the exercise.&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/http%3A%2F%2Fegmgem.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F01%2F06-any.jpg" 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/http%3A%2F%2Fegmgem.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F01%2F06-any.jpg" alt="Using any() to test for presence of TRUE values."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This confirms that extracting the diagonals of an identity matrix will result in there being no logical &lt;code&gt;TRUE&lt;/code&gt; values left in the matrix.&lt;/p&gt;

&lt;p&gt;There is probably a simpler way to do this. I also have a niggling thought that there is a way to extract the diagonal ones and leave the zeros in the matrix, then test the matrix using &lt;code&gt;any()&lt;/code&gt;, but I have yet to find out how. This is one of those beginner solutions that a certain period from now will be proof of how much my knowledge of things R will have grown. If you are aware of how to do this in a simpler, more straight forward way, please do share in the comments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Edit:&lt;/strong&gt; And yes, there is a simpler way! I just needed to be patient and read on a few more pages of the book to page 69 which introduces the function &lt;code&gt;which&lt;/code&gt;. Using it saves so much typing!&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/http%3A%2F%2Fegmgem.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F01%2F07-which.jpg" 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/http%3A%2F%2Fegmgem.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F01%2F07-which.jpg" alt="Much typing saved by using which()"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Basically, the command selects elements in the vector that are to be extracted based on a test given. To extract some and leave others, you append a hyphen to &lt;code&gt;which&lt;/code&gt; resulting in anything that passes the test being deleted.&lt;/p&gt;

&lt;p&gt;My original question still remains though. Is there a way to extract the unwanted elements and still remain with a matrix? A possible solution would probably be to replace the ones with zeros then just test the matrix as a whole. Again, a little patience and reading on and paying attention (as this solution came after reading page 68) is all I needed. That led me the following:&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/http%3A%2F%2Fegmgem.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F01%2F08-simplest.jpg" 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/http%3A%2F%2Fegmgem.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F01%2F08-simplest.jpg" alt="Using the == relational operator on the matrix."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here I used the &lt;code&gt;==&lt;/code&gt; relational operator to identify and replace the ones in the matrix with zeros. The subsequent steps are as before; convert the zeros to &lt;code&gt;FALSE&lt;/code&gt; then run the matrix through &lt;code&gt;any()&lt;/code&gt;, giving us the answer expected.&lt;/p&gt;

&lt;p&gt;This is all very exciting. There is lots to learn and discover about programming with R, and data science by extension!&lt;/p&gt;

&lt;p&gt;Resources:&lt;/p&gt;

&lt;p&gt;The Book of R: &lt;a href="https://nostarch.com/bookofr" rel="noopener noreferrer"&gt;https://nostarch.com/bookofr&lt;/a&gt;&lt;/p&gt;

</description>
      <category>r</category>
      <category>beginners</category>
      <category>learning</category>
    </item>
    <item>
      <title>Command Line Interface Photographs Conversion</title>
      <dc:creator>Eric Gitonga</dc:creator>
      <pubDate>Thu, 28 Jun 2018 16:17:05 +0000</pubDate>
      <link>https://dev.to/egimba/command-line-interface-photographs-conversion-4fk</link>
      <guid>https://dev.to/egimba/command-line-interface-photographs-conversion-4fk</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fegmgem.com%2Fblog%2Fwp-content%2Fuploads%2F2018%2F06%2FSwiss-Or-Corkscrew-768x512.jpg" 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/http%3A%2F%2Fegmgem.com%2Fblog%2Fwp-content%2Fuploads%2F2018%2F06%2FSwiss-Or-Corkscrew-768x512.jpg" alt="Do I choose between the Graphical User Interface Swiss Army Knife, or go for the Command Line Interface Corkscrew?"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is something magical about working on the command line. Sure, many find it super esoteric and arcane, but I love it. The world of Windows had really spoiled me big time, getting me used to the GUI for everything. Sure, there’s the command prompt, and for those that want more power, the aptly named PowerShell, but that still did not move me. After switching to Linux, I am reacquainting myself with the command line interface (CLI), and I find my love for it growing more and more.&lt;/p&gt;

&lt;p&gt;In my regular photography duties, I realized I needed to generate thumbnails of images for a certain project. I am still exploring the ins and outs of digiKam, RawTherapee and GIMP, but something in me kept telling me that for this particular task, a CLI tool was better suited. So off I went searching. I had heard of and used ImageMagick before, but initial searching led me to GraphicsMagick, which I decided to try out.&lt;/p&gt;

&lt;p&gt;After installing it, I ran GraphicsMagick with the command&lt;/p&gt;

&lt;pre&gt;gm help&lt;/pre&gt;

&lt;p&gt;to see what options it had. Among the options, the one that was of interest to me was the convert option. On searching for help about it from the man page, I found an example that fit my needs. The full command I needed was&lt;/p&gt;

&lt;pre&gt;gm convert -size 85x85 "infile.jpg" -resize 85x85 +profile "*" "outfile.jpg"&lt;/pre&gt;

&lt;p&gt;On testing it with an image, it worked just fine, giving me the output I expected.&lt;/p&gt;

&lt;p&gt;Next up was trying to figure out how to apply this command to an entire directory of images. I went googling around for instructions on how to do that. After a bit of searching, I came across a listing that I modified to suit my specific needs as shown below:&lt;/p&gt;

&lt;pre&gt;for i in *.jpg;
do
filename=${i%.*}
gm convert -size 85x85 "$filename.jpg" -resize 85x85 +profile "*" "$#filename.jpg"
done&lt;/pre&gt;

&lt;p&gt;I saved this to a file &lt;em&gt;&lt;strong&gt;gmthumbs&lt;/strong&gt;&lt;/em&gt; (since what I wanted to do was to convert full size images to thumbnails) and used&lt;/p&gt;

&lt;pre&gt;chmod 777 gmthumbs&lt;/pre&gt;

&lt;p&gt;to make it executable.&lt;/p&gt;

&lt;p&gt;I ran the command &lt;em&gt;&lt;strong&gt;./gmthumbs&lt;/strong&gt;&lt;/em&gt; in a test directory I had set up with a number of images.&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/http%3A%2F%2Fegmgem.com%2Fblog%2Fwp-content%2Fuploads%2F2018%2F06%2FListing-1.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/http%3A%2F%2Fegmgem.com%2Fblog%2Fwp-content%2Fuploads%2F2018%2F06%2FListing-1.png" alt="Listing showing the files I used to test the conversion script"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I didn’t get the results I expected, since only the first file was converted and given a new name (&lt;em&gt;&lt;strong&gt;0filename.jpg&lt;/strong&gt;&lt;/em&gt;) as shown in the following image:&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/http%3A%2F%2Fegmgem.com%2Fblog%2Fwp-content%2Fuploads%2F2018%2F06%2FListing-2.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/http%3A%2F%2Fegmgem.com%2Fblog%2Fwp-content%2Fuploads%2F2018%2F06%2FListing-2.png" alt="Listing of files showing just the first image converted"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I played around with the output variable name, having just the pound sign in the output file name, adding the dollar sign to it, then, eventually, removing the pound sign but keeping the dollar sign. That last option, listed below, gave me the results I needed.&lt;/p&gt;

&lt;pre&gt;for i in *.jpg;
do
filename=${i%.*}
gm convert -size 85x85 "$filename.jpg" -resize 85x85 +profile "*" &lt;em&gt;&lt;strong&gt;"$filename.jpg"&lt;/strong&gt;&lt;/em&gt;
done&lt;/pre&gt;

&lt;p&gt;My only problem now was the original files getting overwritten by the converted files. What I needed it to do was write the files to a new directory. I added the command to make an output directory and modified the output filename variable to have it moved to that new output folder as shown in the listing below&lt;/p&gt;

&lt;pre&gt;&lt;em&gt;&lt;strong&gt;mkdir output;&lt;/strong&gt;&lt;/em&gt;
for i in *.jpg;
do
filename=${i%.*}
gm convert -size 85x85 "$filename.jpg" -resize 85x85 +profile "*" "&lt;em&gt;&lt;strong&gt;output/&lt;/strong&gt;&lt;/em&gt;$filename.jpg"
done&lt;/pre&gt;

&lt;p&gt;On running the command and then asking for a listing of files, I found that the original files were still intact, and a new directory &lt;em&gt;&lt;strong&gt;output&lt;/strong&gt;&lt;/em&gt; had been created.&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/http%3A%2F%2Fegmgem.com%2Fblog%2Fwp-content%2Fuploads%2F2018%2F06%2FListing-3.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/http%3A%2F%2Fegmgem.com%2Fblog%2Fwp-content%2Fuploads%2F2018%2F06%2FListing-3.png" alt="Listing showing original files intact, and new folder output in place."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Going into that directory, I found the converted files in place.&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/http%3A%2F%2Fegmgem.com%2Fblog%2Fwp-content%2Fuploads%2F2018%2F06%2FListing-4.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/http%3A%2F%2Fegmgem.com%2Fblog%2Fwp-content%2Fuploads%2F2018%2F06%2FListing-4.png" alt="Listing showing output folder with properly converted files."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Success! Now I can create thumbnails of images in any folder quickly and easily using this nifty script.&lt;/p&gt;

&lt;p&gt;Before I close, I want to point out &lt;em&gt;&lt;strong&gt;feh&lt;/strong&gt;&lt;/em&gt;, which is a command line utility that I used to view the images. Running it as is without any options loads the images in a folder to a window that you can scroll through. Very handy for when I want to just view images I am working in from the command line without having to load a bulky GUI!&lt;/p&gt;

&lt;p&gt;Now off to explore what other magical CLI tools I can incorporate into my workflow.&lt;/p&gt;

&lt;p&gt;Resources:&lt;/p&gt;

&lt;p&gt;ImageMagick: &lt;a href="https://www.imagemagick.org/script/index.php" rel="noopener noreferrer"&gt;https://www.imagemagick.org/script/index.php&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GraphicsMagick: &lt;a href="http://www.graphicsmagick.org/" rel="noopener noreferrer"&gt;http://www.graphicsmagick.org/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feh: &lt;a href="https://feh.finalrewind.org/" rel="noopener noreferrer"&gt;https://feh.finalrewind.org/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>learning</category>
      <category>challenges</category>
      <category>beginners</category>
    </item>
    <item>
      <title>The Eternal Self Constraining Pseudo Student</title>
      <dc:creator>Eric Gitonga</dc:creator>
      <pubDate>Thu, 14 Jun 2018 15:01:53 +0000</pubDate>
      <link>https://dev.to/egimba/the-eternal-self-constraining-pseudo-student-3id3</link>
      <guid>https://dev.to/egimba/the-eternal-self-constraining-pseudo-student-3id3</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qohtcZ3m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/gmqwgnsjz8ipwzlgbeaa.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qohtcZ3m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/gmqwgnsjz8ipwzlgbeaa.jpg" alt="Has this good thing turned into a self imposed prison?"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Should I read more? More manuals? More books? Should I watch more? More tutorials? More lessons? Should I listen more? More podcasts? Or should I just dive in and do? Iron out the kinks as I go along? Pick up material as and when it is needed? Am I hiding behind a fear of the unknown, using this “need to learn more” as a scapegoat?&lt;/p&gt;

&lt;p&gt;Today, when pushed against the wall, I realized that this, indeed, might just be the case. RawTherapee is the software I am now using to edit photographs. Having gotten so used to Lightroom, this new software is a beast to get to grips with. Everything really is, the first time round. And the lure of the familiar triples that percieved difficulty. The event that forced me to learn about features of RawTherapee that I need for my day to day editing was a godsent. It forced me to look through the software to figure out how to carry out certain editing operations that I have been otherwise lax to learn.&lt;/p&gt;

&lt;p&gt;Beyond this, what else I’m I putting off doing because the difficulty of actually learning it is so uncomfortable I would rather spend hours reading/watching/listening to learning media? It is now time to take stock. Time to work on that personal photography project. Time to start building. Time to bring out the drawing/painting material and create. Time to join an open source project and contribute. Time to put away the literature/videos/podcasts (other than for use as reference when stuck) and just do.&lt;/p&gt;

&lt;p&gt;Sketch from photograph Libre by &lt;a href="https://unsplash.com/photos/lk5MYKmGyFE?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Tony Rojas&lt;/a&gt; on &lt;a href="https://unsplash.com/search/photos/blindfold?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://rawtherapee.com/"&gt;RawTherapee&lt;/a&gt;&lt;/p&gt;

</description>
      <category>learning</category>
      <category>beginners</category>
      <category>experience</category>
    </item>
    <item>
      <title>Rediscovering the Joy of Linux*</title>
      <dc:creator>Eric Gitonga</dc:creator>
      <pubDate>Sat, 09 Jun 2018 17:43:37 +0000</pubDate>
      <link>https://dev.to/egimba/rediscovering-the-joy-of-linux-2hdl</link>
      <guid>https://dev.to/egimba/rediscovering-the-joy-of-linux-2hdl</guid>
      <description>&lt;p&gt;&lt;a href="http://egmgem.com/blog/wp-content/uploads/2018/06/DSC_0001.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fegmgem.com%2Fblog%2Fwp-content%2Fuploads%2F2018%2F06%2FDSC_0001-1024x721.jpg" alt="Masochist shaving yak dreaming of Linux"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Recently I installed Ubuntu 18.04 to dual boot on a troublesome laptop alongside Windows 10. Everything went relatively fine eventually. That is after a rocky start trying to get my files on Windows backed up. I had to do so via a LiveCD before installing Ubuntu. That took quite some time. The hard disk is probably faulty, so it has to be replaced soon. Once it was up and running, it was time to install the various software applications I need.&lt;/p&gt;

&lt;p&gt;I found that Cinelerra isn't natively supported by Ubuntu, so I need to figure out how to get that sorted. It is such a powerful tool from what I have read of it (and with such beautiful results as shown in the sample of user videos on its site) that I have to grok it.&lt;/p&gt;

&lt;p&gt;I was surprised to see that Blender is supported. I really shouldn't have, seeing as it is open source, but I guess using it in Windows had made me forget its open source origins.&lt;/p&gt;

&lt;p&gt;Handbrake is also supported! That, I don't think I'd have known. I got to know of it one time while looking for a proper way to convert video files in Windows.&lt;/p&gt;

&lt;p&gt;I had forgotten that GIMP doesn't natively open raw files, so in reading around for a solution, I found RawTherapee. I haven't yet played with it though. Once I do, be sure I will write down my thoughts on it. I had known of Ufraw as a raw file editor, but on researching, what I found suggested RawTherapee was a much better option.&lt;/p&gt;

&lt;p&gt;digiKam gets to replace Lightroom. From what little I've read about it, it is quite the powerful application. There's the digiKam Recipes Book that I am getting soon to help me learn the software. As its author Dmitri Popov points out, actually working on projects, albeit recipe format, is a much better and more effective way to learn software than to go through each menu option individually. And it is high time I got out of tutorial purgatory!**&lt;/p&gt;

&lt;p&gt;Some other applications I installed are Chrome, Libre Writer/Calc, Filezilla, Git, Geany (after reading about it on Dev.to as a possible alternative to Windows' Notepad++) and Audacity.&lt;/p&gt;

&lt;p&gt;There are other applications I had gotten used to in Windows that I need linux alternatives for. As and when the need to use them arises, I shall document the process of getting them. I do know that I need to set up wireless printing on the Canon PIXMA for both documents and discs. Initial research shows I can get that done. I just need to sit down and go into the details of it.&lt;/p&gt;

&lt;p&gt;I want to do Whatsapp/Instagram/other apps sans mobile phone. It was an adventure trying to get that sorted. Prior to switching to Linux, I had come across a site that had an application called Franz which enables one to have several messaging apps under one roof. I thought I had struck gold until I downloaded and installed it. Instead of it being an emulator that allowed me to run the native Whatsapp app, it turns out it was just a wrapper that used web Whatsapp, which meant I needed an actual phone to scan the barcode to allow it to run my account. Clearly, that was not going to work for me.&lt;/p&gt;

&lt;p&gt;On searching some more, I found a site called TechViola that listed seven applications that would allow me to run Whatsapp natively. Some of the applications are in alpha stage, some in beta, some paid, some free. I tried the easiest at first glance (Andy OS), only to realise it is a Windows only option. Next was via an extension on Chrome (ARC Welder), but that failed to launch the apps. Next, I tried Anbox and rain into issues installing it. They do say it is in alpha mode, so I shouldn't have been too surprised. Only thing is, getting it off was a problem. The installation hang, thus making it impossible to do anything else with apt. Each time I did, I was asked to run the command&lt;/p&gt;

&lt;pre&gt;sudo dpkg --configure -a&lt;/pre&gt;

&lt;p&gt;to clean things up. Which then just hang again. Running&lt;/p&gt;

&lt;pre&gt;sudo apt update
sudo apt upgrade&lt;/pre&gt;

&lt;p&gt;led nowhere either. In researching, I realised I needed to delete the two anbox modules in &lt;em&gt;/usr/src&lt;/em&gt;, since each time I tried to update, apt would look there to see what sources lay therein to work on. I ended up deleting the two offending sources manually. Then ran&lt;/p&gt;

&lt;pre&gt;sudo dpkg --purge -a&lt;/pre&gt;

&lt;p&gt;to clean up any pending config issues. I then ran&lt;/p&gt;

&lt;pre&gt;sudo apt update&lt;/pre&gt;

&lt;p&gt;to clear up the configuration. Finally&lt;/p&gt;

&lt;pre&gt;sudo apt upgrade&lt;/pre&gt;

&lt;p&gt;executed smoothly without any errors.&lt;/p&gt;

&lt;p&gt;In the process, I got reacquanted with a lock file and the commands &lt;em&gt;ps&lt;/em&gt;, &lt;em&gt;grep&lt;/em&gt; and &lt;em&gt;kill&lt;/em&gt;. Each time I tried working on apt after the hang, I would get a message that the /var/lib/dpkg/lock file was being held by a process. How was I to find that process? Well, run the command&lt;/p&gt;

&lt;pre&gt;ps aux | grep dpkg&lt;/pre&gt;

&lt;p&gt;This listed the offending process. Then just run the command&lt;/p&gt;

&lt;pre&gt;kill xxx&lt;/pre&gt;

&lt;p&gt;where xxx is the process number.&lt;/p&gt;

&lt;p&gt;Back to that emulator...&lt;/p&gt;

&lt;p&gt;I then decided to just go ahead and try out Genymotion. I followed the install instructions given on the documentation site. I ran into issues where the needed Virtual Box stated that the kernel drivers were not installed. However, on checking and seeing that it appeared in the applications menu, I thought that that was enough for Genymotion. So I tried launching the application and ran into an error stating it needed the &lt;em&gt;vboxdrv&lt;/em&gt; module. So I still neded to figure out how to get that module installed.&lt;/p&gt;

&lt;p&gt;After searching around, I came across a forum post that recommended removing virtualbox&lt;/p&gt;

&lt;pre&gt;sudo apt-get remove virtualbox-\*&lt;/pre&gt;

&lt;p&gt;then downloading the package from VirtualBox.org and installing it manually.&lt;/p&gt;

&lt;pre&gt;sudo dpkg -i ./virtualbox-5.2_5.2.8-121009~Ubuntu~xenial_amd64.deb&lt;/pre&gt;

&lt;p&gt;I did that then ran into dependency issues. The installation process stated it needed &lt;em&gt;libcurl4&lt;/em&gt;. I ran the command&lt;/p&gt;

&lt;pre&gt;sudo apt install libcurl4&lt;/pre&gt;

&lt;p&gt;Then repeated the virtualbox installation command. It installed just fine after that.&lt;/p&gt;

&lt;p&gt;I then went back to Genymotion, executed it, and it started up without a problem.&lt;/p&gt;

&lt;p&gt;The next stage was setting up a virtual device. The one I chose was a custom tablet running Android 8.0. Unfortunately, Whatsapp was not compatible with that device, so I had to select a different one. I chose the Samsung Galaxy 8. Same problem! What was going on? Back to searching for a solution. At some point, I decided to put back the custom tablet and tried installing Instagram. It installed without any fuss whatsoever! Just for giggles I tried installing Whatsapp again. Aye, it showed it was compatible and installed without any issue too! This I don't understand. The next time I have nothing to do I'll do a little digging to find out what the issue was. But for now, the apps are up and running. And I am a happy camper!&lt;/p&gt;

&lt;p&gt;Not so fast! The following day when I tried to start Genymotion it failed! Reason? The needed Virtualbox modules did not get loaded! On looking at the &lt;em&gt;/dev&lt;/em&gt; folder, those modules had gone missing! Back to troubleshooting mode...&lt;/p&gt;

&lt;p&gt;In the applications tab, Virtualbox was shown as having been installed. And I could actually run it. However, it did issue a warning that the character device &lt;em&gt;/dev/vboxdrv&lt;/em&gt; did not exist, stating that virtual machines would not get started without it.&lt;/p&gt;

&lt;p&gt;I went back to the instructions from the Virtualbox forum and tried them again. In the process, I came across an error that stated insertion of the &lt;em&gt;vboxdrv&lt;/em&gt; failed. Time to use another almost forgotten instruction to figure things out: &lt;em&gt;dmesg&lt;/em&gt;. Running it, however, yielded no clues. On re-reading the error message from the build process, it showed that there was an error executing the &lt;em&gt;vboxdrv.sh&lt;/em&gt; script. Looking through the script file, I couldn't pick out anything. And then, while thinking about it, I remembered reading in one of the numerous sites I found researching this issue yesterday that secure boot needed to be disabled for successful installation of Virtualbox. I thought that once installed, then I could re-enable it. Sure enough, after I disabled it again, everything worked just fine. But, I can't leave it unsecure, so I went looking to see if I could operate Virtualbox while still enabling secure boot.&lt;/p&gt;

&lt;p&gt;The resource I found by Øyvind Stegard was super clear on resolving this issue. He explains in his blog that the vbox modules are not loaded since they are usigned. Ubuntu does not sign third party modules, suggesting that secure boot should be turned off to allow them. However, since that is not an option, he provides a way to sign them so that they are loaded just like any other modules with secure boot turned on. His instructions were very clear, and on testing after implementing them, I found (using &lt;em&gt;lsmod | grep vbox&lt;/em&gt;) that the modules were indeed loaded. Genymotion, of course, started without any problems. I just need to remember to sign the modules each time the kernel is updated. Maybe I can find a way to automate this process, so that once an update is detected, the signing is activated. Hmm...&lt;/p&gt;

&lt;p&gt;I know I had vented how yak shaving chased me from Windows. Yet, here I am, doing the same exact thing in Linux. That said, I think shaving yaks in Linux land is a much better and more exciting proposition than the same in Windows land. And I learn so much more in the process!&lt;/p&gt;

&lt;p&gt;Two takeaways from all this...&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Why was I willing to stay in the abusive Windows and Bluestacks relationships this long? Why? And for the Windows part, I knew long before of a better alternative! Bluestacks, I always had the inkling that there must be something better, but the trouble of researching, sorting out issues and installing an alternative seemed more of a problem than the abuse it was handing out to me. Ah, this masochism, never again!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I really should have stuck mucking around the kernel and other innards of things Linux way back when. How far would I be today had I continued along that path? It hit me the other day how at one point I was able to not only compile the linux kernel on my own after numerous customizations, but that I was also able to go into the actual source code and change things that didn't seem to work as expected for my machine. This, after successfully setting up Gentoo, then later, Arch. Today I can barely tell you the first thing about downloading the source code, let alone configuring it! Time to get back to that space, this time, permanently! And on that note, I think I'll revive that moribund laptop in storage just for this experimentation!&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These chronicles are a way to record the steps I take in doing various things in the entire Linux ecosystem as a reminder to my future self on how to deal with problems I may have encountered in the past. Frequency of posts may be as many as several a day, or as few as some every few months.&lt;/p&gt;

&lt;p&gt;References, links and notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;There is indeed a book by that title. Do check it out &lt;a href="https://www.goodreads.com/book/show/1871619.The_Joy_of_Linux" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://www.goodreads.com/book/show/1871619.The_Joy_of_Linux" rel="noopener noreferrer"&gt;https://www.goodreads.com/book/show/1871619.The_Joy_of_Linux&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ubuntu: &lt;a href="https://www.ubuntu.com/" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://www.ubuntu.com/" rel="noopener noreferrer"&gt;https://www.ubuntu.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cinelerra: &lt;a href="http://cinelerra.org/" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="http://cinelerra.org/" rel="noopener noreferrer"&gt;http://cinelerra.org/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Blender: &lt;a href="https://www.blender.org/" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://www.blender.org/" rel="noopener noreferrer"&gt;https://www.blender.org/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;HandBrake: &lt;a href="https://handbrake.fr/" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://handbrake.fr/" rel="noopener noreferrer"&gt;https://handbrake.fr/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GIMP: &lt;a href="https://www.gimp.org/" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://www.gimp.org/" rel="noopener noreferrer"&gt;https://www.gimp.org/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;RawTherapee: &lt;a href="http://rawtherapee.com/" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="http://rawtherapee.com/" rel="noopener noreferrer"&gt;http://rawtherapee.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;UFRaw: &lt;a href="http://ufraw.sourceforge.net/" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="http://ufraw.sourceforge.net/" rel="noopener noreferrer"&gt;http://ufraw.sourceforge.net/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;digiKam: &lt;a href="https://www.digikam.org/" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://www.digikam.org/" rel="noopener noreferrer"&gt;https://www.digikam.org/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;digiKam Recipes Book: &lt;a href="https://www.digikam.org/recipes_book/" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://www.digikam.org/recipes_book/" rel="noopener noreferrer"&gt;https://www.digikam.org/recipes_book/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;** Tutorial Purgatory &lt;a href="https://medium.freecodecamp.org/how-to-escape-tutorial-purgatory-as-a-new-developer-or-at-any-time-in-your-career-e3a4b2384a40" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://medium.freecodecamp.org/how-to-escape-tutorial-purgatory-as-a-new-developer-or-at-any-time-in-your-career-e3a4b2384a40" rel="noopener noreferrer"&gt;https://medium.freecodecamp.org/how-to-escape-tutorial-purgatory-as-a-new-developer-or-at-any-time-in-your-career-e3a4b2384a40&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Franz: &lt;a href="https://meetfranz.com/" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://meetfranz.com/" rel="noopener noreferrer"&gt;https://meetfranz.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;TechViola article: &lt;a href="https://www.techviola.com/2018/04/android-emulator-ubuntu.html" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://www.techviola.com/2018/04/android-emulator-ubuntu.html" rel="noopener noreferrer"&gt;https://www.techviola.com/2018/04/android-emulator-ubuntu.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ask Ubuntu forum that explained how to get rid of the lock file in use problem: &lt;a href="https://askubuntu.com/questions/15433/unable-to-lock-the-administration-directory-var-lib-dpkg-is-another-process" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://askubuntu.com/questions/15433/unable-to-lock-the-administration-directory-var-lib-dpkg-is-another-process" rel="noopener noreferrer"&gt;https://askubuntu.com/questions/15433/unable-to-lock-the-administration-directory-var-lib-dpkg-is-another-process&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Genymotion: &lt;a href="https://www.genymotion.com/" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://www.genymotion.com/" rel="noopener noreferrer"&gt;https://www.genymotion.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fabian Lee's post on installing genymotion &lt;a href="https://fabianlee.org/2017/09/23/ubuntu-installing-the-genymotion-android-emulator/" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://fabianlee.org/2017/09/23/ubuntu-installing-the-genymotion-android-emulator/" rel="noopener noreferrer"&gt;https://fabianlee.org/2017/09/23/ubuntu-installing-the-genymotion-android-emulator/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;VirtualBox forum: &lt;a href="https://forums.virtualbox.org/viewtopic.php?f=7&amp;amp;t=87335&amp;amp;p=422615#p422615" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://forums.virtualbox.org/viewtopic.php?f=7&amp;amp;t=87335&amp;amp;p=422615#p422615" rel="noopener noreferrer"&gt;https://forums.virtualbox.org/viewtopic.php?f=7&amp;amp;amp;t=87335&amp;amp;amp;p=422615#p422615&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Øyvind Stegard's article on signing third party modules &lt;a href="https://stegard.net/2016/10/virtualbox-secure-boot-ubuntu-fail/" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://stegard.net/2016/10/virtualbox-secure-boot-ubuntu-fail/" rel="noopener noreferrer"&gt;https://stegard.net/2016/10/virtualbox-secure-boot-ubuntu-fail/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Yak shaving: [MIT AI Lab, after 2000: orig. probably from a Ren &amp;amp; Stimpy episode.] Any seemingly pointless activity which is actually necessary to solve a problem which solves a problem which, several levels of recursion later, solves the real problem you're working on. &lt;a href="http://www.catb.org/~esr/jargon/html/Y/yak-shaving.html" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="http://www.catb.org/%7Eesr/jargon/html/Y/yak-shaving.html" rel="noopener noreferrer"&gt;http://www.catb.org/~esr/jargon/html/Y/yak-shaving.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>operatingsystem</category>
      <category>opensource</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
