<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Make My Day [IO]</title>
    <link>https://makemyday.io/index.xml</link>
    <description>Recent content on Make My Day [IO]</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Sat, 03 Mar 2018 14:40:04 +0100</lastBuildDate>
    <atom:link href="https://makemyday.io/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Trying to repair a jura nespresso</title>
      <link>https://makemyday.io/post/trying-to-repair-a-jura-nespresso/</link>
      <pubDate>Sat, 03 Mar 2018 14:40:04 +0100</pubDate>
      
      <guid>https://makemyday.io/post/trying-to-repair-a-jura-nespresso/</guid>
      <description>

&lt;p&gt;A few months ago, a broken Nespresso machine fell into my hands. The first thing you notice when you try to repair a Nespresso machine is that you can&amp;rsquo;t open it because it has the &lt;strong&gt;weirdest&lt;/strong&gt; screws that you have ever seen. However, everything can be solved when the comunity comes together, as Cristopher M. Lott demonstrates in his awesome post &lt;a href=&#34;http://maultech.com/chrislott/blog/20100627_nespresso.html&#34;&gt;Repairing a Jura Nespresso Machine&lt;/a&gt;. It turns out that people started building special tools to turn the oval screws that are found in this machine, and sell it online.&lt;/p&gt;

&lt;h3 id=&#34;a-dead-machine-info-gathering&#34;&gt;A dead machine: Info gathering&lt;/h3&gt;

&lt;p&gt;Once I got the tool from ebay I decided to attack the issue and started gathering information about the machine&amp;rsquo;s behavior. It has two buttons: The red one turns the machine on and off, and the other one is used to make the coffee. Usually, when you press the red (left) button, a LED inside the right (white) button starts blinking until the machine is ready (hot enough) to make coffee.&lt;/p&gt;

&lt;p&gt;&lt;img width=100% src=&#34;https://makemyday.io/img/nespresso1.jpg&#34;&gt;&lt;/p&gt;

&lt;p&gt;In my case, when the red button is pressed, the green LED blinks twice and the machine turns off. So I cracked it open and examined it.&lt;/p&gt;

&lt;p&gt;One thing I noticed really fast is that the machine actually heats a little when the red button is pressed. Also, after exposing all the connections, nothing seemed like burned or broken. Nothing obvious like a loose wire or a popped capacitor.&lt;/p&gt;

&lt;p&gt;When I disconnect what looks like the heat sensor from the main board, the led starts blinking periodically. I asume that&amp;rsquo;s a good sign. It also means there should be some kind of logical circuit ruling the board. Maybe a programmable one. After removing all the screws I found what I was looking for hidden behind the main board: A &lt;a href=&#34;https://www.microchip.com/wwwproducts/en/PIC16F676&#34;&gt;PIC16F676 microcontroller&lt;/a&gt;. Does this mean that I may be able to reverse and reprogram the machine after repairing it? That would be so cool. But first thing first.&lt;/p&gt;

&lt;p&gt;&lt;img width=100% src=&#34;https://makemyday.io/img/nespresso3.jpg&#34;&gt;
&lt;img width=100% src=&#34;https://makemyday.io/img/nespresso2.jpg&#34;&gt;&lt;/p&gt;

&lt;h3 id=&#34;the-fix&#34;&gt;The fix&lt;/h3&gt;

&lt;p&gt;As I did not see anything obvious I did some internet research, and after some time I found &lt;a href=&#34;https://www.youtube.com/watch?v=ZCz1RJKBaNA&#34;&gt;this (spanish) video&lt;/a&gt; from &lt;a href=&#34;reparatumismo.org&#34;&gt;reparatumismo.org&lt;/a&gt;. It seemed like it could be one or both of the big, blue polyester capacitors. According to the video, it&amp;rsquo;s a rather usual problem with that particular model, and it can be easily solved by changing the 470nF capacitor by a 680nF one.&lt;/p&gt;

&lt;p&gt;So I ordered those on ebay and a few weeks later I replaced it as the video said. Now I have a functioning-nespresso :)&lt;/p&gt;

&lt;p&gt;Wonder if I can hack it now&amp;hellip;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Making secure backups in GNU/Linux with LUKS and rsync</title>
      <link>https://makemyday.io/post/secure-backup-LUKS-rsync/</link>
      <pubDate>Sun, 17 Dec 2017 14:04:08 +0200</pubDate>
      
      <guid>https://makemyday.io/post/secure-backup-LUKS-rsync/</guid>
      <description>

&lt;p&gt;In today&amp;rsquo;s post I&amp;rsquo;m going to explain how to securely backup your files using LUKS and &lt;a href=&#34;https://en.wikipedia.org/wiki/Rsync&#34;&gt;rsync&lt;/a&gt;. Please, if you decide to follow the steps depicted here, remember that &lt;strong&gt;I&amp;rsquo;m not responsible for any loss of data that this may cause&lt;/strong&gt;. Proceed with care: you can easily erase important information if you don&amp;rsquo;t know what you&amp;rsquo;re doing.&lt;/p&gt;

&lt;p&gt;Let&amp;rsquo;s say that I want to backup my home directory on an external HDD, but I want my backup to be encrypted, too. There are a couple of alternatives: I can use &lt;a href=&#34;https://veracrypt.codeplex.com&#34;&gt;Veracrypt&lt;/a&gt; or I can use &lt;a href=&#34;https://gitlab.com/cryptsetup/cryptsetup/&#34;&gt;Cryptsetup and LUKS&lt;/a&gt;. LUKS is the standard for Linux hard disk encryption, and this is the main reason I have decided to go with this one.&lt;/p&gt;

&lt;h2 id=&#34;creating-and-formatting-your-luks-partition&#34;&gt;Creating and formatting your LUKS partition&lt;/h2&gt;

&lt;p&gt;First you need to create an empty partition on the external drive, for instance, using &lt;a href=&#34;https://gparted.org/&#34;&gt;gparted&lt;/a&gt;. Make sure to &lt;strong&gt;make it big enough&lt;/strong&gt; for the data you want to backup, and keep in mind that size of said data can and probably will be bigger in future backups.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before we continue. Please, read the following. It&amp;rsquo;s important:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;ll refer to this partition as &lt;code&gt;\dev\sdb2&lt;/code&gt; for simplicity, yours may or may not be the same one, so be extra careful if you copy and paste the commands written in this post directly. You may be fucking up your device and erasing the information you intend to backup. I also must warn you, the letter (a,b,c&amp;hellip;) of each &lt;code&gt;sd&lt;/code&gt; device may change after rebooting the machine, so &lt;strong&gt;each time you perform an operation directly on a partition or device, make sure that you are doing it on the right one.&lt;/strong&gt; &lt;code&gt;sudo fdisk -l&lt;/code&gt; or &lt;code&gt;lsblk&lt;/code&gt; are your friends here. If you don&amp;rsquo;t quite grasp the concepts described in this paragraph, please find someone who can help you so you don&amp;rsquo;t fuck up your computer. You have been warned.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With that said, let&amp;rsquo;s continue.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you want extra resilience to forensic analysis, you can fill the partition with noise before formating it. This will make impossible for an attacker to see the total size of the backed up data. This will take some time, so you can skip this step if it&amp;rsquo;s not necessary for your threat model:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;shred --verbose --random-source=/dev/urandom --iterations=1 /dev/sdb2
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then, it&amp;rsquo;s time to format the partition with cryptsetup:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cryptsetup --verbose --cipher aes-xts-plain64 --key-size 256 --hash sha256 --iter-time 1000 --use-urandom luksFormat /dev/sdb2
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;These are the default values except for the hash which is more robust (SHA256 instead of SHA1). If you want to check the performance of each algorithm you can run &lt;code&gt;cryptsetup benchmark&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This step will ask you to introduce a pass-phrase. Think of a good one and &lt;strong&gt;don&amp;rsquo;t loose it or you will be never able to unlock the partition again&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;After your LUKS partition has been created, it&amp;rsquo;s time to format it.&lt;/p&gt;

&lt;p&gt;Unlock:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cryptsetup open --type luks /dev/sdb2 mybackup
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Format:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;mkfs.ext4 /dev/mapper/mybackup
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Mount:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;mount -t ext4 /dev/mapper/mybackup /mnt/test-crypt
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Change permissions:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo chown youruser:youruser /mnt/test-crypt
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Unmount:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo umount /mnt/test-crypt
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;ease-your-backups&#34;&gt;Ease your backups&lt;/h2&gt;

&lt;p&gt;Ok so, now you have an encrypted partition where you can put your data. But each time you want to perform a backup you need to unlock, mount, sync files, unmount and lock again. Those are a lot of steps, lets ease them.&lt;/p&gt;

&lt;p&gt;First, find the UUID of the partition by typing &lt;code&gt;ls -l /dev/disk/by-uuid/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Each UUID points to a block device. We are interested on the one that points to our encrypted partition &lt;code&gt;/dev/sdb2&lt;/code&gt;. It should look like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;lrwxrwxrwx 1 root root 2 Feb  1 10:22 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx -&amp;gt; ../../sdb2
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Add the following line to &lt;code&gt;/etc/crypttab&lt;/code&gt;, using the UUID that you just found&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;crypt_backup UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx none luks,noauto
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Also add the following line to &lt;code&gt;/etc/fstab&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/dev/mapper/crypt_backup /media/crypt_backup ext4 defaults,noauto,user 0  0
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now you can use the following script to backup your files (the ones contained in your home directory, in this example). You may need to reboot first.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span style=&#34;color: #75715e&#34;&gt;#!/bin/sh&lt;/span&gt;
udisksctl unlock -b /dev/disk/by-uuid/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx &lt;span style=&#34;color: #f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;\&lt;/span&gt;
mount /media/crypt_backup &lt;span style=&#34;color: #f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;\&lt;/span&gt;
rsync -avP --delete-after /home/your-user/ /media/crypt_backup/name-of-your-backup/ &lt;span style=&#34;color: #ae81ff&#34;&gt;\&lt;/span&gt;
umount /media/crypt_backup &lt;span style=&#34;color: #ae81ff&#34;&gt;\&lt;/span&gt;
udisksctl lock -b /dev/disk/by-uuid/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Run it each time you want to backup your files.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Rhino Hunt (Part 1)</title>
      <link>https://makemyday.io/post/rhino-hunt-part-1/</link>
      <pubDate>Tue, 12 Sep 2017 19:52:02 +0200</pubDate>
      
      <guid>https://makemyday.io/post/rhino-hunt-part-1/</guid>
      <description>

&lt;p&gt;Lately I&amp;rsquo;ve been getting into digital forensics investigation and in order to train myself I&amp;rsquo;ve been looking for some challenges. I found &lt;a href=&#34;http://aboutdfir.com/challenges-ctfs/&#34;&gt;this awesome website&lt;/a&gt; which has a great compilation of challenges, research results and CTFs.&lt;/p&gt;

&lt;p&gt;I skimmed over the different options and decided to challenge myself with &lt;a href=&#34;https://www.cfreds.nist.gov/dfrws/Rhino_Hunt.html&#34;&gt;The Rhino Hunt&lt;/a&gt;, developed by NIST.&lt;/p&gt;

&lt;h2 id=&#34;context&#34;&gt;Context&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;The Rhino Hunt data set requires examination of a small image file and  three network traces.&lt;/p&gt;

&lt;p&gt;This image was contributed by Dr. Golden G. Richard III, and was originally used in the DFRWS 2005 RODEO CHALLENGE.&lt;/p&gt;

&lt;p&gt;Scenario:&lt;/p&gt;

&lt;p&gt;The city of New Orleans passed a law in 2004 making possession of nine or more unique rhinoceros images a serious crime.   The network administrator at the University of New Orleans recently alerted police when his instance of RHINOVORE flagged illegal rhino traffic.  Evidence in the case includes a computer and USB key seized from one of the University’s labs.  Unfortunately, the computer had no hard drive.  The USB key was imaged and a copy of the dd image is on the CD-ROM you’ve been given.&lt;/p&gt;

&lt;p&gt;In addition to the USB key drive image, three network traces are also available—these were provided by the network administrator and involve the machine with the missing hard drive.    The suspect is the primary user of this machine, who has been pursuing his Ph.D. at the University since 1972.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For the purpose of solving this challenge, I have to do the following task:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Recover at least nine rhino pictures from the available evidence and include them in a brief report.  In your report, provide answers to as many of the following questions as possible:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Who gave the accused a telnet/ftp account?&lt;/li&gt;
&lt;li&gt;What’s the username/password for the account?&lt;/li&gt;
&lt;li&gt;What relevant file transfers appear in the network traces?&lt;/li&gt;
&lt;li&gt;What happened to the hard drive in the computer?  Where is it now?&lt;/li&gt;
&lt;li&gt;What happened to the USB key?&lt;/li&gt;
&lt;li&gt;What is recoverable from the dd image of the USB key?&lt;/li&gt;
&lt;li&gt;Is there any evidence that connects the USB key and the network traces?  If so, what?&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let&amp;rsquo;s begin!&lt;/p&gt;

&lt;h2 id=&#34;the-usb-key-image&#34;&gt;The USB key image&lt;/h2&gt;

&lt;p&gt;First I check the integrity of the image file that I have been given. The MD5 checksum of said file can be found in the challenge&amp;rsquo;s formulation.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;80348c58eec4c328ef1f7709adc56a54 RHINOUSB.dd&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We acknowledge that the checksum of our file is the same:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ md5sum RHINOUSB.dd
80348c58eec4c328ef1f7709adc56a54  RHINOUSB.dd
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now we know we are dealing with an untampered image file. Let&amp;rsquo;s gather some more information of the file:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ fsstat RHINOUSB.dd
FILE SYSTEM INFORMATION
--------------------------------------------
File System Type: FAT16

OEM Name: mkdosfs
Volume ID: 0x4092d9d1
Volume Label (Boot Sector):            
Volume Label (Root Directory):
File System Type Label: FAT16   

Sectors before file system: 0

File System Layout (in sectors)
Total Range: 0 - 506847
* Reserved: 0 - 0
** Boot Sector: 0
* FAT 0: 1 - 248
* FAT 1: 249 - 496
* Data Area: 497 - 506847
** Root Directory: 497 - 528
** Cluster Area: 529 - 506840
** Non-clustered: 506841 - 506847

METADATA INFORMATION
--------------------------------------------
Range: 2 - 8101622
Root Directory: 2

CONTENT INFORMATION
--------------------------------------------
Sector Size: 512
Cluster Size: 4096
Total Cluster Range: 2 - 63290

FAT CONTENTS (in sectors)
--------------------------------------------
529-536 (8) -&amp;gt; EOF
537-544 (8) -&amp;gt; EOF

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

&lt;p&gt;Before I perform any file recovery or string search on the image, I open it with a hex editor. I wanna take a look at it. The root directory of the FAT filesystem begins on sector 497, at 512 bytes per sector, this means that the offset is 254464. I find that the USB key had only two allocated files. &lt;em&gt;gumbo1.txt&lt;/em&gt; and &lt;em&gt;gumbo2.txt&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img width=100% style=&#34;display: block;  margin-left: auto;  margin-right: auto;&#34; src=&#34;https://makemyday.io/img/rhino_root.png&#34;&gt;&lt;/p&gt;

&lt;p&gt;A huge portion of the file is filled with the same bytes over and over. It&amp;rsquo;s like part of the disk has been manually overwritten with the message &amp;ldquo;SORRY&amp;rdquo; and &amp;ldquo;CHARLIE&amp;rdquo; (Coincidence? :P)&lt;/p&gt;

&lt;p&gt;&lt;img width=100% style=&#34;display: block;  margin-left: auto;  margin-right: auto;&#34; src=&#34;https://makemyday.io/img/rhino_sorry.png&#34;&gt;&lt;/p&gt;

&lt;p&gt;&lt;img width=100% style=&#34;display: block;  margin-left: auto;  margin-right: auto;&#34; src=&#34;https://makemyday.io/img/rhino_charlie.png&#34;&gt;&lt;/p&gt;

&lt;p&gt;Ok, time to recover some data, I will be using PhotoRec, and see what I can retrieve from this weirdo.&lt;/p&gt;

&lt;p&gt;&lt;img width=100% style=&#34;display: block;  margin-left: auto;  margin-right: auto;&#34; src=&#34;https://makemyday.io/img/rhino_photorec.png&#34;&gt;&lt;/p&gt;

&lt;p&gt;After going through the whole image file, PhotoRec has retrieved 134 files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 .doc file&lt;/li&gt;
&lt;li&gt;7 .jpg files&lt;/li&gt;
&lt;li&gt;2 .gif files&lt;/li&gt;
&lt;li&gt;124 .txt files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So&amp;hellip; have I found the 9 rhino images yet? Sadly, no. There are 4 rhino images, and 5 alligator images. I proceed to document the images found by computing the MD5 checksum.&lt;/p&gt;

&lt;p&gt;&lt;img width=100% style=&#34;display: block;  margin-left: auto;  margin-right: auto;&#34; src=&#34;https://makemyday.io/img/rhino_4.png&#34;&gt;&lt;/p&gt;

&lt;p&gt;Ok, so the next logical step is to take a look at the other recovered files, staring by the .doc file, which title is&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;f0335017_She_died_in_February_at_the_age_of_74.doc&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This seems to be some sort of personal diary. I skim over them, I&amp;rsquo;m looking for a lead. And I find it in the las two entries:&lt;/p&gt;

&lt;p&gt;&lt;img width=100% style=&#34;display: block;  margin-left: auto;  margin-right: auto;&#34; src=&#34;https://makemyday.io/img/rhino_diary.png&#34;&gt;&lt;/p&gt;

&lt;p&gt;This piece of evidence shows that the suspect freaked out and got rid of the hard drive of the computer. This makes sense as the computer was found without a hard drive. Also, this leads point to the existence of more hidden pictures in the USB. The accused then formatted the USB drive, thinking that such action would erase the contents of the memory. The suspect also talks about changing a password of a &amp;ldquo;gnome account&amp;rdquo; that &lt;strong&gt;Jeremy&lt;/strong&gt; gave him/her. I should take a look at the network traces and see if I can find activity related to this sentence. But first, let&amp;rsquo;s take a look at the .txt files.&lt;/p&gt;

&lt;p&gt;At first glance, the .txt can be grouped as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Two files containing recipes&lt;/li&gt;
&lt;li&gt;One 53MB file, filled with the message &amp;ldquo;SORRY&amp;rdquo; over and over&lt;/li&gt;
&lt;li&gt;One 116.8MB file, filled with the message &amp;ldquo;CHARLIE&amp;rdquo; over and over&lt;/li&gt;
&lt;li&gt;120 files of different sizes filled with the message &amp;ldquo;CHARLIE&amp;rdquo; and one last character.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I suspect that there must be a lead embedded somehow in this files. But I&amp;rsquo;m not familiar with the stego technique that may have been used. I can only guess. Also, speaking about stego&amp;hellip; Is it possible that the alligator pictures contain rhino images or secret messages embedded in them? It would make sense, but I have no clue of which algorithm could have been used.&lt;/p&gt;

&lt;p&gt;Maybe it&amp;rsquo;s time to look at the network traces and see if I can get any relevant data from them. The suspect had to use some script or program to hide the images and maybe I can find the download among the trace.&lt;/p&gt;

&lt;h2 id=&#34;first-network-trace&#34;&gt;First network trace&lt;/h2&gt;

&lt;p&gt;I first check the integrity of the files &lt;em&gt;rhino.log&lt;/em&gt;, &lt;em&gt;rhino2.log&lt;/em&gt; and &lt;em&gt;rhino3.log&lt;/em&gt;. Once I&amp;rsquo;ve done this, I proceed to open the first file with Wireshark.&lt;/p&gt;

&lt;p&gt;&lt;img width=100% style=&#34;display: block;  margin-left: auto;  margin-right: auto;&#34; src=&#34;https://makemyday.io/img/rhino_log1.png&#34;&gt;&lt;/p&gt;

&lt;p&gt;It looks like the IP address used by the suspect&amp;rsquo;s machine is &lt;strong&gt;137.30.122.253&lt;/strong&gt;. This first trace contains 6557 captured packets. I decide to filter by the TELNET protocol. The TELNET communication happens between the suspect machine and a machine with IP address &lt;strong&gt;137.30.120.40&lt;/strong&gt;. There seems to be two TELNET sessions in this trace.&lt;/p&gt;

&lt;h3 id=&#34;first-telnet-session&#34;&gt;First TELNET session&lt;/h3&gt;

&lt;p&gt;The session starts by exchanging some parameters and the remote maching asking for a username and a password. The suspect enters the following credentials.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Username: gnome&lt;/li&gt;
&lt;li&gt;Password: gnome123&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After the login, the user gnome starts executing some commands on the shell: ls, du, df&amp;hellip; and then, &lt;strong&gt;passwd&lt;/strong&gt;. He wants to change his password. The first try was &lt;em&gt;gnome1234&lt;/em&gt; but the terminal prompted &amp;ldquo;&lt;em&gt;passwd: Old and new passwords must differ by at least 3 positions.&lt;/em&gt;&amp;rdquo;, so he tried &lt;em&gt;gnome12345&lt;/em&gt;. The program then exits with the message &amp;ldquo;&lt;em&gt;Permission denied&lt;/em&gt;&amp;rdquo;.&lt;/p&gt;

&lt;p&gt;Then the user tried to logout twice with the non-existing command &amp;ldquo;logout&amp;rdquo;, after which he wrote &amp;ldquo;exit&amp;rdquo; and successfully logged out from the remote machine.&lt;/p&gt;

&lt;h3 id=&#34;second-telnet-session&#34;&gt;Second TELNET session&lt;/h3&gt;

&lt;p&gt;The session starts by exchanging some parameters and the remote machine asking for a username and a password. The user tries to login with the username &amp;ldquo;golden&amp;rdquo; but fails. The user then logs in with the same credentials as the first session and then executes:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cat &amp;gt; JOHNREADME
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And starts typing:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I tried to hack Golden&amp;rsquo;s account but the password was wrong.&lt;/p&gt;

&lt;p&gt;- Georgia&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It looks like someone is leaving a message for John. After saving the file, Georgia executes &lt;code&gt;ls -l&lt;/code&gt; and something catches my attention. I did not mention it, but during the first session, when the user &lt;em&gt;gnome&lt;/em&gt; executed &lt;code&gt;ls -l&lt;/code&gt; there was only three files and now there are 7. This is a screenshot of the first session:&lt;/p&gt;

&lt;p&gt;&lt;img width=100% style=&#34;display: block;  margin-left: auto;  margin-right: auto;&#34; src=&#34;https://makemyday.io/img/rhino_telnetls1.png&#34;&gt;&lt;/p&gt;

&lt;p&gt;And here&amp;rsquo;s a screenshot of the second one:&lt;/p&gt;

&lt;p&gt;&lt;img width=100% style=&#34;display: block;  margin-left: auto;  margin-right: auto;&#34; src=&#34;https://makemyday.io/img/rhino_telnetls.png&#34;&gt;&lt;/p&gt;

&lt;p&gt;Here are some suspicious files: &lt;em&gt;rhino1.jpg&lt;/em&gt;, &lt;em&gt;rhino3.jpg&lt;/em&gt; and &lt;em&gt;contraband.zip&lt;/em&gt;. Someone must have uploaded them between the first and the second session.&lt;/p&gt;

&lt;p&gt;After that last command the user tries to logout with the non-existing command &amp;ldquo;logout&amp;rdquo; (again), after which she wrote &amp;ldquo;exit&amp;rdquo; and successfully logged out from the remote machine.&lt;/p&gt;

&lt;p&gt;Someone uploaded the files to the remote machine&amp;hellip; If this has been done using the same machine that the suspect uses, there are several protocols that he could have used. But something tells me it&amp;rsquo;s gonna be FTP.&lt;/p&gt;

&lt;h3 id=&#34;ftp-session&#34;&gt;FTP session&lt;/h3&gt;

&lt;p&gt;My hypothesis was right. Just after the first TELNET session, a FTP session is started and the user &lt;em&gt;gnome&lt;/em&gt; uploads the file &lt;em&gt;rhino1.jpg&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img width=100% style=&#34;display: block;  margin-left: auto;  margin-right: auto;&#34; src=&#34;https://makemyday.io/img/rhino_ftp.png&#34;&gt;&lt;/p&gt;

&lt;p&gt;The file &lt;em&gt;rhino3.jpg&lt;/em&gt; is uploaded right after.&lt;/p&gt;

&lt;p&gt;The file &lt;em&gt;contraband.zip&lt;/em&gt; on the other hand, is uploaded right before the second TELNET session.&lt;/p&gt;

&lt;p&gt;I should be able to retrieve the files from the network packets, I&amp;rsquo;ll begin with &lt;em&gt;rhino1.jpg&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;First we have to find the packet with the beginning of the file. I find right after the STOR request has been accepted.&lt;/p&gt;

&lt;p&gt;&lt;img width=100% style=&#34;display: block;  margin-left: auto;  margin-right: auto;&#34; src=&#34;https://makemyday.io/img/rhino_wireshark.png&#34;&gt;&lt;/p&gt;

&lt;p&gt;The file signature of a JPEG file is composed of two bytes: &lt;strong&gt;FF D8&lt;/strong&gt; as can be seen in the screenshot. In order to extract the whole file, I only have to right-click the packet and select Follow-&amp;gt;TCP Stream.
The We just save the data as RAW with the name &amp;ldquo;rhino1.jpg&amp;rdquo;&lt;/p&gt;

&lt;p&gt;&lt;img width=75% style=&#34;display: block;  margin-left: auto;  margin-right: auto;&#34; src=&#34;https://makemyday.io/img/rhino_rhino1.png&#34;&gt;&lt;/p&gt;

&lt;p&gt;Looks like I found the fifth rhino! I repeat the process with the file &lt;em&gt;rhino3.jpg&lt;/em&gt; and obtain the following image:&lt;/p&gt;

&lt;p&gt;&lt;img width=75% style=&#34;display: block;  margin-left: auto;  margin-right: auto;&#34; src=&#34;https://makemyday.io/img/rhino_rhino3.png&#34;&gt;&lt;/p&gt;

&lt;p&gt;Now I can recover the file contraband.zip, following the same steps. But after I do it, I find that it has been encrypted. There&amp;rsquo;s only one file in it, called &lt;em&gt;rhino2.jpg&lt;/em&gt;. What could the password be?&lt;/p&gt;

&lt;h2 id=&#34;second-network-trace&#34;&gt;Second network trace&lt;/h2&gt;

&lt;p&gt;This trace contains HTTP traffic. I take a look at the HTTP objects and see that two more rhino images have been transfered. The images have been downloaded to a machine with IP &lt;strong&gt;137.30.123.234&lt;/strong&gt; from a machine with IP &lt;strong&gt;137.30.120.37&lt;/strong&gt; and hostname &lt;strong&gt;www.cs.uno.edu&lt;/strong&gt;. The route of the images at the remote machine is: &lt;strong&gt;/~gnome&lt;/strong&gt;. The names of the pictures are &lt;strong&gt;rhino4.jpg&lt;/strong&gt; and &lt;strong&gt;rhino5.gif&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img width=100% style=&#34;display: block;  margin-left: auto;  margin-right: auto;&#34; src=&#34;https://makemyday.io/img/rhino_45.png&#34;&gt;&lt;/p&gt;

&lt;h2 id=&#34;third-network-trace&#34;&gt;Third network trace&lt;/h2&gt;

&lt;p&gt;This trace also contains HTTP traffic. The user has downloaded an executable program called &lt;strong&gt;rhino.exe&lt;/strong&gt; from a machine with IP &lt;strong&gt;137.30.120.37&lt;/strong&gt; and hostname &lt;strong&gt;www.cs.uno.edu&lt;/strong&gt; to a machine with IP &lt;strong&gt;137.30.123.234&lt;/strong&gt;. This program is maybe the one that the suspect has used to hide rhino images among those TXT files.&lt;/p&gt;

&lt;h2 id=&#34;second-round&#34;&gt;Second round&lt;/h2&gt;

&lt;p&gt;Let&amp;rsquo;s list all the loose ends that we still have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We have found an encrypted rhino picture inside a zip container, but don&amp;rsquo;t know the password.&lt;/li&gt;
&lt;li&gt;We have a bunch of TXT files and alligator pictures that may or may not hide relevant data.&lt;/li&gt;
&lt;li&gt;We have an .exe file which purpose we so far ignore.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;relevant-retrieved-data-so-far&#34;&gt;Relevant retrieved data (so far)&lt;/h2&gt;

&lt;p&gt;Four rhino images (1 - 4) have been found stored on the USB drive. These images had been deleted, but have been recovered from the unallocated space. Two images (5 - 6) have been recovered from the &lt;em&gt;rhino.log&lt;/em&gt; trace. Two images (7 - 8) have been recovered from the &lt;em&gt;rhino2.log&lt;/em&gt; trace.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;f0106393.jpg with MD5sum ca03f2eed3db06a82a8a31b3a3defa24&lt;/li&gt;
&lt;li&gt;f0106409.jpg with MD5sum ed870202082ea4fd8f5488533a561b35&lt;/li&gt;
&lt;li&gt;f0106865.gif with MD5sum 76610b7bdb85e5f65e96df3f7e417a74&lt;/li&gt;
&lt;li&gt;f0106889.gif with MD5sum d03dc23d4ec39e4d16da3c46d2932d62&lt;/li&gt;
&lt;li&gt;rhino1.jpg with MD5sum d5a83cde0131c3a034e5a0d3bd94b3c9&lt;/li&gt;
&lt;li&gt;rhino3.jpg with MD5sum b058218ea0060092d4e01ef3d7a3b815&lt;/li&gt;
&lt;li&gt;rhino4.jpg with MD5sum aa64102afff71b93ed61fb100af8d52a&lt;/li&gt;
&lt;li&gt;rhino5.gif with MD5sum 1e90b7f70b2ecb605898524a88269029&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;I&amp;rsquo;ll continue the hunt in the next post!&lt;/strong&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Lessons learned from building a Magic Hoodie</title>
      <link>https://makemyday.io/post/magic-hoodie/</link>
      <pubDate>Fri, 28 Jul 2017 20:45:19 +0200</pubDate>
      
      <guid>https://makemyday.io/post/magic-hoodie/</guid>
      <description>

&lt;p&gt;Earlier this month we were able to finish our &lt;a href=&#34;TCS3200-Color-Sensor.md&#34;&gt;magic hoodie project&lt;/a&gt;. It&amp;rsquo;s been a cool thing to build with the kids. Maybe a bit complicated, specially regarding the TCS3200 part, but they really liked the result. It worked pretty well with the poor code we developed. But I&amp;rsquo;m sure that they learned a lot.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://makemyday.io/img/magic-hoodie-lower.gif&#34; width=&#34;100%&#34;&gt;&lt;/p&gt;

&lt;p&gt;The effect is rather magic: &amp;ldquo;Oh! Nice shirt, I like the color, let me copy it.&amp;rdquo;, one tocuh and BAM! the LEDs light the same color. However, being this my (our) first wereable project, I&amp;rsquo;ve learned some things that I want to share.&lt;/p&gt;

&lt;h2 id=&#34;connections-are-fragile&#34;&gt;Connections are fragile&lt;/h2&gt;

&lt;p&gt;Yes, wereable electronics are for wearing (duh) them. This means the piece you have made will be dressed, moved, undressed and folded. This means that whatever you have soldered will break if not protected correctly. I learned this the hard way. First I was like: &amp;ldquo;Sure, some tape will do it&amp;rdquo;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No, it doesn&amp;rsquo;t.&lt;/strong&gt; LEDs stopped working randomly because the wires kept breaking.&lt;/p&gt;

&lt;p&gt;So after that, we tried protecting the soldered connections with &lt;strong&gt;hot glue&lt;/strong&gt;, and it&amp;rsquo;s safe to say it does the trick. However, LED stripes are not made to be bended constantly. Some of the internal lines of the strip broke, and as a consequence, some LEDs of the strip don&amp;rsquo;t light up. This is something to be taken into consideration: You have to treat the piece of clothing with care.&lt;/p&gt;

&lt;h2 id=&#34;using-a-12v-led-strip-may-be-overkill&#34;&gt;Using a 12V LED strip may be overkill&lt;/h2&gt;

&lt;p&gt;I chose to use a 12V strip because I read that 5V strips have powering issues when using more than 1m of the strip. Initially, I did not know how much of the strip I would use, so 12V looked like the best option. I ended up using 120cm of the strip so now I wonder if a 5V strip would have been enough (I am almost certain). The other problem of using a 12V power source is that the Arduino transforms a big part of the energy into heat.&lt;/p&gt;

&lt;h2 id=&#34;sewing-properly-is-important&#34;&gt;Sewing properly is important&lt;/h2&gt;

&lt;p&gt;I used 8-wire telephone cable to connect the TCS3200 color sensor to the Arduino UNO hidden in the pocket of the hoodie. The cable keeps moving and although we tried to sew it directly several times, the thread kept breaking. Next time we should use sew a piece of fabric that holds the telephone cable on its place.&lt;/p&gt;

&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;We made a very cool hoodie, but next time we&amp;rsquo;ll be extra careful with the connections, the strip and the sewing part, so we make a wereable electronics piece of clothing that also can last (at least more than 15 days). But it was a fun project.&lt;/p&gt;

&lt;p&gt;Code can be found &lt;a href=&#34;https://github.com/charlieMKR/MagicHoodie&#34;&gt;here&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Playing with the TCS3200 Color Sensor</title>
      <link>https://makemyday.io/post/TCS3200-Color-Sensor/</link>
      <pubDate>Fri, 19 May 2017 11:23:30 +0200</pubDate>
      
      <guid>https://makemyday.io/post/TCS3200-Color-Sensor/</guid>
      <description>

&lt;p&gt;I&amp;rsquo;m working in really cool project with some of my students. We want to make a &lt;strong&gt;magic hoodie&lt;/strong&gt;. The idea is simple: We take a basic hoodie, some LEDs, a color sensor, and an Arduino board. We decorate the hoodie with the LEDs, and try to make them mimic the color detected with the sensor. But the &lt;a href=&#34;https://www.dfrobot.com/wiki/index.php/TCS3200_Color_Sensor_(SKU:SEN0101)&#34;&gt;TCS3200 sensor&lt;/a&gt; is trickier than I first thought, so in order to understand it better, I&amp;rsquo;ve written this post. Hope it&amp;rsquo;s useful.&lt;/p&gt;

&lt;h2 id=&#34;the-sensor&#34;&gt;The sensor&lt;/h2&gt;

&lt;p&gt;The TCS3200 is a color sensor that comes with 4 white LEDs. It has an array of photodetectors with different filters (red, green, blue, clear). Inside the chip there&amp;rsquo;s an oscillator which produces a square-wave output whose frequency is proportional to the intensity of the chosen color.&lt;/p&gt;

&lt;p&gt;&lt;img width=50% style=&#34;display: block;  margin-left: auto;  margin-right: auto;&#34; src=&#34;https://makemyday.io/img/tcs3200.jpg&#34;&gt;&lt;/p&gt;

&lt;h3 id=&#34;specs&#34;&gt;Specs&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Single-Supply Operation (2.7V to 5.5V)&lt;/li&gt;
&lt;li&gt;High-Resolution Conversion of Light Intensity to Frequency&lt;/li&gt;
&lt;li&gt;Programmable Color and Full-Scale Output Frequency&lt;/li&gt;
&lt;li&gt;Power Down Feature&lt;/li&gt;
&lt;li&gt;Communicates Directly to Microcontroller&lt;/li&gt;
&lt;li&gt;S0~S1: Output frequency scaling selection inputs&lt;/li&gt;
&lt;li&gt;S2~S3: Photodiode type selection inputs&lt;/li&gt;
&lt;li&gt;OUT Pin: Output frequency&lt;/li&gt;
&lt;li&gt;OE Pin: Output frequency enable pin (active low), can be impending when using&lt;/li&gt;
&lt;li&gt;Support LED lamp light supplement control&lt;/li&gt;
&lt;li&gt;Size: 28.4x28.4mm&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;filters-and-frequencies&#34;&gt;Filters and frequencies&lt;/h3&gt;

&lt;p&gt;The TCS3200 allows the microcontroller to activate the different filters and also lets it scale the output frequency (fo).  For this purpose, the S0, S1, S2 and S3 pins are used. The microcontroller can set the pins to HIGH or LOW in order to obtain the desired results.&lt;/p&gt;

&lt;p&gt;To control de &lt;strong&gt;output frequency&lt;/strong&gt;:&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;S0&lt;/th&gt;
&lt;th&gt;S1&lt;/th&gt;
&lt;th&gt;OUTPUT FREQUENCY SCALING&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;

&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;L&lt;/td&gt;
&lt;td&gt;L&lt;/td&gt;
&lt;td&gt;Power down&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;L&lt;/td&gt;
&lt;td&gt;H&lt;/td&gt;
&lt;td&gt;2%&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;H&lt;/td&gt;
&lt;td&gt;L&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;H&lt;/td&gt;
&lt;td&gt;H&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;hr /&gt;

&lt;p&gt;To control the &lt;strong&gt;color filters&lt;/strong&gt;:&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;S2&lt;/th&gt;
&lt;th&gt;S3&lt;/th&gt;
&lt;th&gt;PHOTODIODE TYPE&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;

&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;L&lt;/td&gt;
&lt;td&gt;L&lt;/td&gt;
&lt;td&gt;RED&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;L&lt;/td&gt;
&lt;td&gt;H&lt;/td&gt;
&lt;td&gt;BLUE&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;H&lt;/td&gt;
&lt;td&gt;L&lt;/td&gt;
&lt;td&gt;Clear&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;H&lt;/td&gt;
&lt;td&gt;H&lt;/td&gt;
&lt;td&gt;GREEN&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;hr /&gt;

&lt;p&gt;At this point I had some doubts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What&amp;rsquo;s the order of the frequency?&lt;/li&gt;
&lt;li&gt;What&amp;rsquo;s the output frequency proportion?&lt;/li&gt;
&lt;li&gt;What&amp;rsquo;s the proportion between different colors?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;figuring-out-how-it-works&#34;&gt;Figuring out how it works&lt;/h2&gt;

&lt;p&gt;Time to look at &lt;a href=&#34;http://image.dfrobot.com/image/data/SEN0101/TCS3200%20TCS3210.pdf&#34;&gt;the datasheet&lt;/a&gt;!
&lt;img width=100% src=&#34;https://makemyday.io/img/tcs3200-fo.png&#34;&gt;&lt;/p&gt;

&lt;p&gt;&lt;img width=60% style=&#34;display: block;  margin-left: auto;  margin-right: auto;&#34; src=&#34;https://makemyday.io/img/responsivity.png&#34;&gt;&lt;/p&gt;

&lt;p&gt;Ok, here I can see the frequency values that I can expect when exposing the sensor to different colors.
By looking at this information I can start thinking about a proper algorithm to measure color. I need to generate 8-bit RGB values that I can use to set the colors of the LED strip. I could measure the frequency with the clear filter first and then with the rest in order to generate this values consistently, as it seems that the frequency obtained with the color filters are dependent on the one obtained with the clear one.&lt;/p&gt;

&lt;p&gt;Yes, I can break down the steps now:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Measure&lt;/strong&gt; the four frequencies.&lt;/li&gt;
&lt;li&gt;Compute the &lt;strong&gt;percentage&lt;/strong&gt; of the clear frequency obtained by each color.&lt;/li&gt;
&lt;li&gt;Transform (I&amp;rsquo;ll start by mapping), the percentages obtained to a 8-bit scale&lt;/li&gt;
&lt;li&gt;Set the colors to the LED strip. (I&amp;rsquo;ve used a setup similar to &lt;a href=&#34;https://learn.adafruit.com/rgb-led-strips/usage&#34;&gt;this one&lt;/a&gt;).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img width=100% src=&#34;https://makemyday.io/img/magic-schematic.png&#34;&gt;&lt;/p&gt;

&lt;p&gt;I feel like writing a small library for this, It will ease everything.&lt;/p&gt;

&lt;h2 id=&#34;testing&#34;&gt;Testing&lt;/h2&gt;

&lt;p&gt;It turned out that reading the datasheet and trying to decide the color from it just wasn&amp;rsquo;t enough. I needed to take some samples and watch the output for myself, so I wrote a very simple code (using my newly created library) that gave me the measured frequency for each filter as an output (the average of ten samples) and then tested it with different colors. These were the results:&lt;/p&gt;

&lt;p&gt;&lt;img width=100% src=&#34;https://makemyday.io/img/rgb-percentages.png&#34;&gt;&lt;/p&gt;

&lt;p&gt;&lt;img width=100% src=&#34;https://makemyday.io/img/clear-frequencies.png&#34;&gt;&lt;/p&gt;

&lt;p&gt;With this data I was able to write a second iteration of my code, in particular, a &lt;em&gt;generateRGB&lt;/em&gt; function which was able to translate the input provided by the sensor into 8-bit RGB values that I could use for the led strip. I used the graphs shown above to discuss with my students how could we approach this problem and they were very surprised of the results of their guessing. They had engineered a solution, and it worked!&lt;/p&gt;

&lt;p&gt;The solution consisted on looking at the dominant color and then guessing the possible color &amp;ldquo;family&amp;rdquo; depending on the other values, in order to correctly mp the inputs to the outputs. In the following code, the array &lt;em&gt;values&lt;/em&gt; contains the &amp;ldquo;clear frequency&amp;rdquo;, the % of red, % of green and % of blue. By % of [color] I mean the frequency obtained with that color filter expressed as a percentage of the clear one. The rgb array is an array containing the resulting 8-bit values: red, green and blue.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span style=&#34;color: #66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;Hoodie&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;generateRGB(&lt;/span&gt;&lt;span style=&#34;color: #66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;rgb[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;unsigned&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;long&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;values[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;])&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
  &lt;span style=&#34;color: #75715e&#34;&gt;// Begin with red. If &amp;gt;40 means it&amp;#39;s the dominant color&lt;/span&gt;
  &lt;span style=&#34;color: #66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;(values[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;40&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #75715e&#34;&gt;// Red, Orange, yellow, Fucsia, pink...&lt;/span&gt;
    &lt;span style=&#34;color: #75715e&#34;&gt;// Check blue&lt;/span&gt;
    &lt;span style=&#34;color: #66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;(values[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;30&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #75715e&#34;&gt;//Mix of red and blue: Fucsia / Pink&lt;/span&gt;
      &lt;span style=&#34;color: #f8f8f2&#34;&gt;rgb[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #75715e&#34;&gt;// Max value&lt;/span&gt;
      &lt;span style=&#34;color: #f8f8f2&#34;&gt;rgb[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;map(values[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;18&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;23&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;100&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt; &lt;span style=&#34;color: #75715e&#34;&gt;// For pink&lt;/span&gt;
      &lt;span style=&#34;color: #f8f8f2&#34;&gt;rgb[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;100&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #75715e&#34;&gt;// Mix of red and green: Yellow - Orange - Red&lt;/span&gt;
      &lt;span style=&#34;color: #f8f8f2&#34;&gt;rgb[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
      &lt;span style=&#34;color: #f8f8f2&#34;&gt;rgb[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;map(values[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;17&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;34&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt; &lt;span style=&#34;color: #75715e&#34;&gt;//min: red, max: yellow&lt;/span&gt;
      &lt;span style=&#34;color: #f8f8f2&#34;&gt;rgb[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #75715e&#34;&gt;// We don&amp;#39;t want any blue&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
  &lt;span style=&#34;color: #75715e&#34;&gt;// If not, check Blue&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;(values[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;40&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #75715e&#34;&gt;//check red&lt;/span&gt;
    &lt;span style=&#34;color: #66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;(values[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;30&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #75715e&#34;&gt;// No red: Blue colors / Turquoise&lt;/span&gt;
      &lt;span style=&#34;color: #f8f8f2&#34;&gt;rgb[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #75715e&#34;&gt;// No red&lt;/span&gt;
      &lt;span style=&#34;color: #f8f8f2&#34;&gt;rgb[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;map(values[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;23&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;30&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;100&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;
      &lt;span style=&#34;color: #f8f8f2&#34;&gt;rgb[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;map(values[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;40&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;50&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;100&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #75715e&#34;&gt;// No green: Purple colors&lt;/span&gt;
      &lt;span style=&#34;color: #f8f8f2&#34;&gt;rgb[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;map(values[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;16&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;39&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;100&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;
      &lt;span style=&#34;color: #f8f8f2&#34;&gt;rgb[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #75715e&#34;&gt;// No green&lt;/span&gt;
      &lt;span style=&#34;color: #f8f8f2&#34;&gt;rgb[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
  &lt;span style=&#34;color: #75715e&#34;&gt;// If not, check green&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;(values[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;30&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #75715e&#34;&gt;//check red&lt;/span&gt;
    &lt;span style=&#34;color: #66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;(values[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;30&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #75715e&#34;&gt;//Mix of green and blue&lt;/span&gt;
      &lt;span style=&#34;color: #f8f8f2&#34;&gt;rgb[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #75715e&#34;&gt;// No red&lt;/span&gt;
      &lt;span style=&#34;color: #f8f8f2&#34;&gt;rgb[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
      &lt;span style=&#34;color: #f8f8f2&#34;&gt;rgb[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;map(values[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;23&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;34&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;100&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #75715e&#34;&gt;//Mix of green and red&lt;/span&gt;
      &lt;span style=&#34;color: #f8f8f2&#34;&gt;rgb[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;map(values[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;27&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;34&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;100&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;);&lt;/span&gt;
      &lt;span style=&#34;color: #f8f8f2&#34;&gt;rgb[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
      &lt;span style=&#34;color: #f8f8f2&#34;&gt;rgb[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #75715e&#34;&gt;// No blue&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
    &lt;span style=&#34;color: #75715e&#34;&gt;// White / black&lt;/span&gt;
    &lt;span style=&#34;color: #66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;(&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;values[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;70000&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #f8f8f2&#34;&gt;rgb[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
      &lt;span style=&#34;color: #f8f8f2&#34;&gt;rgb[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
      &lt;span style=&#34;color: #f8f8f2&#34;&gt;rgb[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;255&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color: #66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;(values[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;15000&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color: #f8f8f2&#34;&gt;{&lt;/span&gt;
      &lt;span style=&#34;color: #f8f8f2&#34;&gt;rgb[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
      &lt;span style=&#34;color: #f8f8f2&#34;&gt;rgb[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
      &lt;span style=&#34;color: #f8f8f2&#34;&gt;rgb[&lt;/span&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
  &lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color: #f8f8f2&#34;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Yes, it could be better, but it solves the problem for this project. The next step will be putting the pieces together in the hoodie and perform tests in different conditions :D&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Setting up a Let&#39;s Encrypt SSL Certificate</title>
      <link>https://makemyday.io/post/ssl-certificate-letsencrypt/</link>
      <pubDate>Tue, 25 Apr 2017 14:04:00 +0200</pubDate>
      
      <guid>https://makemyday.io/post/ssl-certificate-letsencrypt/</guid>
      <description>

&lt;p&gt;Since I first thought of creating this site I wanted to set up an SSL certificate and to use HTTPS by default. Enabling HTTPS on your website enhances the security of your users in several ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Confidentiality&lt;/strong&gt;: The messages between the clients (web browsers) and the web server are encrypted so no third party can read them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integrity&lt;/strong&gt;: Not only the messages are secret, but they also have integrity protections, so no one can modify them or inject messages in the conversation between your browser and the server.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Authenticity&lt;/strong&gt;: There&amp;rsquo;s another word for this. Trust. SSL provides a way for your browser to verify the identity the web server and trust it by using the so called SSL certificates.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let&amp;rsquo;s take a look on SSL/TLS so we can add some light to how this is done:&lt;/p&gt;

&lt;h3 id=&#34;ssl-tls&#34;&gt;SSL/TLS&lt;/h3&gt;

&lt;p&gt;SSL and TLS are cryptographic protocols that aim to provide privacy and integrity of communications. SSL is the predecessor of TLS but sometimes they are both called SSL. The goals of the &lt;a href=&#34;https://tools.ietf.org/html/rfc5246&#34;&gt;TLS protocol&lt;/a&gt; are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Cryptographic security: Secure communications between two parties&lt;/li&gt;
&lt;li&gt;Interoperability: Applications using TLS built by different programmers should be able to exchange cryptographic messages.&lt;/li&gt;
&lt;li&gt;Extensibility: TLS is a framework into which other methods can be incorporated. This means tat other protocols, like HTTP, can be used on top of TLS.&lt;/li&gt;
&lt;li&gt;Relative efficiency: TLS tries to minimize CPU use, given that cryptographic operations tend to be highly CPU intensive.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&#34;how-ssl-certificates-work&#34;&gt;How SSL Certificates work&lt;/h3&gt;

&lt;p&gt;Ok, so you can connect securely to an HTTP server using TLS (HTTPS) but you need a way to verify that the messages that you receive come in fact, from said server, and you&amp;rsquo;re not receiveing/sending messages from/to someone else. The server will have a private/public key pair, so it can sign a message and you can verify the signature. But how do you trust the public key that the server is handing to you? It could be handed by a man-in-the-middle attacker!&lt;/p&gt;

&lt;p&gt;This is where the SSL certificate, and the Certificate Authorities (CA) play their role. You need a trusted Certificate Authority to sign the certificate of your web server if you want browsers to trust your public key (AKA show the green lock next to your URL). So basically, a SSL certificate proves the ownership of the public key. The key is signed by someone your browser trusts (CA), and therefore, it trusts the key as well. The CA is the responsible of verifying that the public key belongs to the owner of the domain, in order to sign it.&lt;/p&gt;

&lt;p&gt;I decided to use &lt;em&gt;Let&amp;rsquo;s Encrypt&lt;/em&gt;, a free and automated CA created by the &lt;a href=&#34;https://letsencrypt.org/isrg/&#34;&gt;ISRG&lt;/a&gt;. Next, I&amp;rsquo;ll show you how I generated and installed my &lt;em&gt;Let&amp;rsquo;s Encrypt&lt;/em&gt; certificate on an NGINX server, and how I configured it to get an A+ rating on the &lt;a href=&#34;https://www.ssllabs.com/ssltest/&#34;&gt;Qualys SSL Server test&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://makemyday.io/img/makemyday_score.png&#34; width=&#34;100%&#34;&gt;&lt;/p&gt;

&lt;h3 id=&#34;setting-up-the-certificate-with-nginx-on-debian-jessie&#34;&gt;Setting up the certificate with NGINX on Debian Jessie&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Let&amp;rsquo;s Encrypt&lt;/em&gt; issues its certificates using the &lt;a href=&#34;https://ietf-wg-acme.github.io/acme/&#34;&gt;ACME protocol&lt;/a&gt;. This protocol allows a server to obtain a browser-trusted SSL certificate without human intervention. You can see how it&amp;rsquo;s done &lt;a href=&#34;https://letsencrypt.org/how-it-works/&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So, the next thing I need is an ACME client that interacts with &lt;em&gt;Let&amp;rsquo;s Encrypt&lt;/em&gt; server, in order to generate the certificate. I&amp;rsquo;ve chosen to use &lt;a href=&#34;https://certbot.eff.org/&#34;&gt;Certbot&lt;/a&gt;, because it&amp;rsquo;s the one recommended by &lt;em&gt;Let&amp;rsquo;s Encrypt&lt;/em&gt;. If Certbot does not fit your needs, &lt;a href=&#34;https://letsencrypt.org/docs/client-options/&#34;&gt;there are many more ACME clients&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id=&#34;1-installing-certbot&#34;&gt;1. Installing certbot&lt;/h4&gt;

&lt;p&gt;First, I needed to enable the Jessie Backports repository by adding the following line to &lt;em&gt;/etc/apt/sources.list&lt;/em&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;deb http://ftp.debian.org/debian jessie-backports main
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Backports are recompiled packages from testing (mostly) and unstable (in a few cases only, e.g. security updates) in a stable environment so that they will run without new libraries (whenever it is possible) on a Debian stable distribution.&lt;/p&gt;

&lt;p&gt;In order to install certbot&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;$ sudo apt-get install certbot -t jessie-backports
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And we have successfully installed the client.&lt;/p&gt;

&lt;h4 id=&#34;2-obtaining-a-valid-certificate&#34;&gt;2. Obtaining a valid certificate&lt;/h4&gt;

&lt;p&gt;For the most part, next steps have been done following &lt;a href=&#34;https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-14-04&#34;&gt;this&lt;/a&gt; and &lt;a href=&#34;https://certbot.eff.org/#debianjessie-nginx&#34;&gt;this&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There are many ways to obtain a valid SSL certificate with certbot. I&amp;rsquo;ve used the Webroot plugin. This plugin places a special file under the &lt;em&gt;./well-known&lt;/em&gt; directory in the root directory of your web server.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Certbot generates a key pair, then sends the public key to the &lt;em&gt;Let&amp;rsquo;s Encrypt&lt;/em&gt; server and says something like &amp;ldquo;I&amp;rsquo;m the ACME agent of the domain yourdomain.com and this is my key. Challenge me!&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Let&amp;rsquo;s Encrypt&lt;/em&gt; sends a &lt;a href=&#34;https://en.wikipedia.org/wiki/Cryptographic_nonce&#34;&gt;nonce&lt;/a&gt; to certbot.&lt;/li&gt;
&lt;li&gt;Certbot signs the nonce with the private key and places it under the &lt;em&gt;./well-known&lt;/em&gt; directory. Then it notifies &lt;em&gt;Let&amp;rsquo;s Encrtypt&lt;/em&gt; again.&lt;/li&gt;
&lt;li&gt;The CA then downloads the signed nonce placed in the public directory and verifies the signature.&lt;/li&gt;
&lt;li&gt;If the signature is valid, then certbot is authorized to do the certificate management. The key pair becomes &amp;ldquo;authorized&amp;rdquo; and then it can send certificate management messages to &lt;em&gt;Let&amp;rsquo;s Encrypt&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Then, certbot proceeds to ask the CA to issue a valid certificate for the domains it has proved ownership. This is done by generating a Certificate Signing Request (CSR). Certbot generates a new key pair. The CSR contains information about the domain, the recently generated public key and a signature with the associated private key. Certbot signs the CSR with its authorized private key and sends it to the CA.&lt;/li&gt;
&lt;li&gt;The CA then verifies the signatures. If everything is ok, it issues a new certificate for the domain with the public key that was contained in the CSR.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let&amp;rsquo;s see how to do this: In order to let certbot access &lt;em&gt;./well-known&lt;/em&gt;, you have to modify your nginx configuration file, usually under &lt;em&gt;/etc/nginx/sites-available/default&lt;/em&gt;. Find the &lt;em&gt;server block&lt;/em&gt;, and add the following lines between its brackets:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;location ~ /.well-known &lt;span style=&#34;color: #f92672&#34;&gt;{&lt;/span&gt;
    allow all&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #f92672&#34;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You can test your changes with&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;$ sudo nginx -t
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;and restart nginx to load the new configuration&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;$ sudo service nginx restart
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Now you are ready to obtain your SSL certificate!&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;$ certbot certonly --webroot -w /var/www/example -d yoursite.com -d www.yoursite.com -w /var/www/thing -d thing.is -d m.thing.is
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In the example above, you will obtain a unique SSL certificate for &lt;strong&gt;yoursite.com&lt;/strong&gt;, &lt;strong&gt;www.yoursite.com&lt;/strong&gt;, &lt;strong&gt;thing.is&lt;/strong&gt; and &lt;strong&gt;m.thing.is&lt;/strong&gt;. It&amp;rsquo;s very intuitive, you use &lt;strong&gt;-w&lt;/strong&gt; to point where the root directory of your site is and &lt;strong&gt;-d&lt;/strong&gt; to point out the domains and subdomains used by the site. The webroot plugin will generate a challenge in each of the root deractories to check the ownership of the domains.&lt;/p&gt;

&lt;h4 id=&#34;3-server-configuration&#34;&gt;3. Server configuration&lt;/h4&gt;

&lt;p&gt;After executing certbot as described above, the following files have been generated under &lt;em&gt;/etc/letsencrypt/live/yoursite.com&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cert.pem: The domain&amp;rsquo;s certificate&lt;/li&gt;
&lt;li&gt;chain.pem: The Let&amp;rsquo;s Encrypt chain certificate&lt;/li&gt;
&lt;li&gt;fullchain.pem: cert.pem and chain.pem combined&lt;/li&gt;
&lt;li&gt;privkey.pem: The certificate&amp;rsquo;s private key&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once we have obtained the certificate we need to properly configure the server to use it. First, let&amp;rsquo;s install openSSL&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;sudo apt-get install openssl
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Not only we want to use TLS, but we want to do it the right way. First, we should generate strong Diffie-Hellman parameters. Why? &lt;a href=&#34;https://weakdh.org/sysadmin.html&#34;&gt;take a look&lt;/a&gt;. This can be done using the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Next, we will configure nginx to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use these parameters&lt;/li&gt;
&lt;li&gt;Use strong ciphers only, ensuring Perfect Forward Secrecy.&lt;/li&gt;
&lt;li&gt;Use only TLS, &lt;a href=&#34;http://disablessl3.com/&#34;&gt;not allowing SSLv3&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Use &lt;a href=&#34;https://tools.ietf.org/html/rfc6797&#34;&gt;Strict Transport Security&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Again, we look for the &lt;strong&gt;server&lt;/strong&gt; block in the nginx configuration file, and replace these lines:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;listen &lt;span style=&#34;color: #ae81ff&#34;&gt;80&lt;/span&gt; default_server&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
listen &lt;span style=&#34;color: #f92672&#34;&gt;[&lt;/span&gt;::&lt;span style=&#34;color: #f92672&#34;&gt;]&lt;/span&gt;:80 default_server &lt;span style=&#34;color: #f8f8f2&#34;&gt;ipv6only&lt;/span&gt;&lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt;on&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;with&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;listen &lt;span style=&#34;color: #ae81ff&#34;&gt;443&lt;/span&gt; ssl&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #75715e&#34;&gt;# SSL/TLS port&lt;/span&gt;

server_name yoursite.com www.yoursite.com&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color: #75715e&#34;&gt;# REPLACE WITH YOUR DOMAINS&lt;/span&gt;
        
&lt;span style=&#34;color: #75715e&#34;&gt;###&lt;/span&gt;
&lt;span style=&#34;color: #75715e&#34;&gt;# SSL Settings &lt;/span&gt;
&lt;span style=&#34;color: #75715e&#34;&gt;###&lt;/span&gt;

&lt;span style=&#34;color: #75715e&#34;&gt;# Certificate and key&lt;/span&gt;
ssl_certificate /etc/letsencrypt/live/yoursite.com/fullchain.pem&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
ssl_certificate_key /etc/letsencrypt/live/yoursite.com/privkey.pem&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #75715e&#34;&gt;# Protect your users by not using SSLv3 and previous protocols  &lt;/span&gt;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;    

&lt;span style=&#34;color: #75715e&#34;&gt;# WeakDH project recommended configuration for the supported ciphers&lt;/span&gt;
ssl_prefer_server_ciphers on&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;           
ssl_ciphers &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:!DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA&amp;#39;&lt;/span&gt;&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
				
&lt;span style=&#34;color: #75715e&#34;&gt;# Use strong DH parameters&lt;/span&gt;
ssl_dhparam /etc/ssl/certs/dhparam.pem&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #75715e&#34;&gt;# Other optimizations&lt;/span&gt;
ssl_session_cache   shared:SSL:10m&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
ssl_session_timeout 1h&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
ssl_stapling on&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt; 
ssl_stapling_verify on&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;

&lt;span style=&#34;color: #75715e&#34;&gt;# Tell your clients that your site ONLY suports HTTPS&lt;/span&gt;
add_header Strict-Transport-Security &lt;span style=&#34;color: #e6db74&#34;&gt;&amp;quot;max-age=31536000; includeSubDomains&amp;quot;&lt;/span&gt; always&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt; 
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If you want to learn more about how to properly configure TLS in NGNIX I recommend you to read &lt;a href=&#34;https://leandromoreira.com.br/2015/10/12/how-to-optimize-nginx-configuration-for-http2-tls-ssl/&#34;&gt;this article&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Finally, in order to redirect port 80 to port 443, we add another &lt;em&gt;server&lt;/em&gt; block with the following lines:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;server &lt;span style=&#34;color: #f92672&#34;&gt;{&lt;/span&gt;
    listen 80&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
    server_name yoursite.com www.yoursite.com&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
    &lt;span style=&#34;color: #66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;301&lt;/span&gt; https://$host$request_uri&lt;span style=&#34;color: #f8f8f2&#34;&gt;;&lt;/span&gt;
&lt;span style=&#34;color: #f92672&#34;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;We can now test the syntax errors&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;$ sudo nginx -t
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;and then restart the server to load the new configuration:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;$ sudo service nginx restart
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Now you can test it! Visit &lt;a href=&#34;https://www.ssllabs.com/ssltest/&#34;&gt;https://www.ssllabs.com/ssltest/&lt;/a&gt; and you&amp;rsquo;ll be able to see if you have properly configured your server.&lt;/p&gt;

&lt;h4 id=&#34;4-automated-renewal&#34;&gt;4. Automated renewal&lt;/h4&gt;

&lt;p&gt;There&amp;rsquo;s a very simple command to renew a Letsencrypt certficate:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;certbot renew
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If you run this command, certbot will attept to renew every SSL certificate. But if the certificate is due in more than 30 days, it will return this message:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;Cert not yet due &lt;span style=&#34;color: #66d9ef&#34;&gt;for&lt;/span&gt; renewal

The following certs are not due &lt;span style=&#34;color: #66d9ef&#34;&gt;for&lt;/span&gt; renewal yet:
  /etc/letsencrypt/live/yoursite.com/fullchain.pem &lt;span style=&#34;color: #f92672&#34;&gt;(&lt;/span&gt;skipped&lt;span style=&#34;color: #f92672&#34;&gt;)&lt;/span&gt;
  No renewals were attempted.
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If the certificate is due in less than 30 days, then it will renew it for 90 more days. I have created a cronjob that will try to renew the certficates every two weeks at 3 AM and then another one that will reload the nginx configuration 5 minutes later.&lt;/p&gt;

&lt;p&gt;First I hit&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;$ sudo crontab -e
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Then I add&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span style=&#34;color: #ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;3&lt;/span&gt; 1,15 * * /usr/bin/certbot renew &amp;gt;&amp;gt; /var/log/letsencrypt-renew.log
&lt;span style=&#34;color: #ae81ff&#34;&gt;5&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;3&lt;/span&gt; 1,15 * * /etc/init.d/nginx reload
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And there it is. A properly configured (A+) HTTPS web server with a SSL certificate that will be atuomatically renewed.&lt;/p&gt;

&lt;p&gt;Further reading:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/ssllabs/research/wiki/SSL-and-TLS-Deployment-Best-Practices&#34;&gt;SSL and TLS Deployment Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://weakdh.org/imperfect-forward-secrecy-ccs15.pdf&#34;&gt;Imperfect Forward Secrecy: How Diffie-Hellman Fails in Practice&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>The battle of transfer protocols or &#34;How do I update this site&#34; </title>
      <link>https://makemyday.io/post/rsync-ssh-static-page/</link>
      <pubDate>Sat, 15 Apr 2017 14:55:59 +0200</pubDate>
      
      <guid>https://makemyday.io/post/rsync-ssh-static-page/</guid>
      <description>

&lt;p&gt;All right, so as you may know, this website is made with &lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt;, the awesome static web generator created in &lt;a href=&#34;https://golang.org/&#34;&gt;go&lt;/a&gt;. I have also used the amazing &lt;a href=&#34;http://themes.gohugo.io/base16/&#34;&gt;base16 theme&lt;/a&gt; by &lt;a href=&#34;https://github.com/htdvisser&#34;&gt;Hylke Visser&lt;/a&gt;. I have tweaked it a lil&amp;rsquo; bit so it fits my needs. Actually, after going through the documentation, I want to try and learn go. Next time, I guess.&lt;/p&gt;

&lt;p&gt;Today I&amp;rsquo;m going to talk about how I update this static website.&lt;/p&gt;

&lt;p&gt;One thing I really like about Hugo is that it comes with a tiny webserver so you can actually build your website in your local machine and see how your last update looks like. You can use, for example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;$ hugo server --buildDrafts
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And your machine starts serving the website on port 1313. This is something I find really cool, because it means that you have a development &lt;strong&gt;and&lt;/strong&gt; a testing environment all together. I like the simplicity of developing/testing locally and then uploading the updates to the production server. Check hugo&amp;rsquo;s &lt;a href=&#34;https://gohugo.io/overview/quickstart/&#34;&gt;quickstart guide&lt;/a&gt; to see how easily you can generate a static site with this tool.&lt;/p&gt;

&lt;p&gt;Each time you&amp;rsquo;re done updating your site, you can just hit:&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;$ hugo
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And volià! Your static website has been generated under the /public directory. Now you can upload it anywhere. But as always, there are different ways I could think about, namely &lt;em&gt;ftp&lt;/em&gt;, &lt;em&gt;scp&lt;/em&gt;, &lt;em&gt;sftp&lt;/em&gt; and &lt;em&gt;rsync&lt;/em&gt;. Lets take a look at them, shall we?&lt;/p&gt;

&lt;h3 id=&#34;ftp&#34;&gt;FTP&lt;/h3&gt;

&lt;p&gt;Ok, to be fair, I was not even considering this one. Mainly because all the transmissions in the &lt;em&gt;File Transfer Protocol&lt;/em&gt; are in plaintext. It just amazes me how many hosting companies offer &lt;strong&gt;only&lt;/strong&gt; this system to manage remote files. Just take a quick look at the &lt;a href=&#34;https://en.wikipedia.org/wiki/File_Transfer_Protocol#Security&#34;&gt;Wikipedia article&lt;/a&gt; and you&amp;rsquo;ll get my point. It&amp;rsquo;s fine to use it when you&amp;rsquo;re connecting both machines through a VPN but I&amp;rsquo;m not creating a VPN just so I can use FTP instead of the multiple alternatives.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But what about FTPS?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;FTPS is an extension of FTP. It adds support for TLS/SSL. This gives me a security layer that would meet my goals. There&amp;rsquo;s only one problem and it is that I have to install a FTP server that supports FTPS (like the FileZilla server), and then configure it to only use secure connections.&lt;/p&gt;

&lt;p&gt;But I already have a SSH server running on the remote machine, and there are many ways to transfer a file over SSH&amp;hellip; so what&amp;rsquo;s the point of adding another server? After all, SSH is a cryptographic protocol, not an extension of a non-cryptographic one, so there&amp;rsquo;s no way you can mess up in this aspect. Therefore, let&amp;rsquo;s see what options I can use over SSH.&lt;/p&gt;

&lt;h3 id=&#34;sftp-scp-rsync&#34;&gt;SFTP, SCP, RSYNC&lt;/h3&gt;

&lt;p&gt;Here&amp;rsquo;s where I started doubting. In the beggining, every one of these options looked good to me. They all work over SSH, so there&amp;rsquo;s no need to install new software on the remote machine. I&amp;rsquo;ve used all of them for different purposes, such as backing up my data, accessing my smartphone files remotely or copying certain files quickly from/to a raspberry pi. At that point I could say they were all good enough for me, but as the goal of this blog is to learn new things (and do them right), I&amp;rsquo;ve done a little research to find the differences between these three programs in order to decide which one is the best to use by default.&lt;/p&gt;

&lt;h4 id=&#34;scp&#34;&gt;SCP&lt;/h4&gt;

&lt;p&gt;SCP stands for &amp;ldquo;Secure Copy&amp;rdquo;. It works like the UNIX command &lt;em&gt;cp&lt;/em&gt; but over SSH. You can either use it to copy files in a local machine or to/from a remote host. It&amp;rsquo;s a very simple command-line utility, and you can specify &lt;a href=&#34;https://linux.die.net/man/1/scp&#34;&gt;a few options&lt;/a&gt;. After a quick search I found some issues with this tool:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the transfer is interrupted, it can&amp;rsquo;t be resumed&lt;/li&gt;
&lt;li&gt;It makes a plain copy from A to B, regardless of the files in B.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hence, this tool makes sense for a first upload, but not for the following updates, as I don&amp;rsquo;t want to be uploading &lt;strong&gt;the whole website&lt;/strong&gt; each time.&lt;/p&gt;

&lt;h4 id=&#34;sftp&#34;&gt;SFTP&lt;/h4&gt;

&lt;p&gt;SFTP stands for &amp;ldquo;SSH File Transfer Protocol&amp;rdquo;. This protocol allows for many more operations than SCP. The program &lt;a href=&#34;http://www-hep2.fzu.cz/computing/adm/sftp.html&#34;&gt;&lt;em&gt;sftp&lt;/em&gt;&lt;/a&gt; is interactive, it allows you to navigate through the directories of the remote machine, and to put or get what you want. Even if this system would easily allow me to see what&amp;rsquo;s on the remote machine and quickly upload only what I want&amp;hellip; it just looks too complex. I want something that allows me to update my files on the remote machine, without uploading them all again, and without having to check manually what do I have to upload. Something I can script once, then execute and &lt;em&gt;zoop&lt;/em&gt;, it&amp;rsquo;s done.&lt;/p&gt;

&lt;h4 id=&#34;rsync&#34;&gt;RSYNC&lt;/h4&gt;

&lt;p&gt;&lt;a href=&#34;https://linux.die.net/man/1/rsync&#34;&gt;Rsync&lt;/a&gt; is a copying tool. As SCP, it can copy both locally and to/from another host. It works over remote shell protocols or by using its own daemon. The thing that I find interesting about this program is the fact that it&amp;rsquo;s very versatile and allows for a lot of fine tunning. But there&amp;rsquo;s more. It uses a &lt;strong&gt;delta-transfer&lt;/strong&gt; algorithm, which only sends the differences between the source files and the destination files. Also, it allows me to write my own filter rules, so I can script ahead what directories I want to update, delete or preserve. It looks like the perfect tool for what I want to do.&lt;/p&gt;

&lt;h3 id=&#34;final-setup&#34;&gt;Final setup&lt;/h3&gt;

&lt;p&gt;In order to make my life easier, I use &lt;a href=&#34;https://macnugget.org/projects/publickeys/&#34;&gt;SSH public-key authentication&lt;/a&gt;. I also have written the following (trivial) script which I call &lt;em&gt;zoop.sh&lt;/em&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34; style=&#34;background: #272822&#34;&gt;&lt;pre style=&#34;line-height: 125%&#34;&gt;&lt;span style=&#34;color: #75715e&#34;&gt;#!/bin/bash&lt;/span&gt;
&lt;span style=&#34;color: #75715e&#34;&gt;# This script should be placed in the hugo working directory&lt;/span&gt;
hugo &lt;span style=&#34;color: #f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; rsync -rtuv &lt;span style=&#34;color: #ae81ff&#34;&gt;\&lt;/span&gt;
	--delete-after &lt;span style=&#34;color: #ae81ff&#34;&gt;\&lt;/span&gt;
	--exclude&lt;span style=&#34;color: #f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color: #e6db74&#34;&gt;&amp;#39;not-hugo/&amp;#39;&lt;/span&gt; &lt;span style=&#34;color: #ae81ff&#34;&gt;\ &lt;/span&gt;
	public/ foo@remotemachine:/path/to/website/directory/
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The script generates the static site with &lt;em&gt;hugo&lt;/em&gt; and then calls &lt;em&gt;rsync&lt;/em&gt; with the following options:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;-r&lt;/strong&gt;: Copy directories recursively.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;-t&lt;/strong&gt;: Preserve timestamps.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;-u&lt;/strong&gt;: Skips files which are newer on the destination than on the source.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;-v&lt;/strong&gt;: Verbose.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&amp;ndash;delete-after&lt;/strong&gt;: Delete files that no longer exist on the source after updating.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&amp;ndash;exclude=&amp;lsquo;not-hugo/&amp;rsquo;&lt;/strong&gt;: Prevents rsync from deleting certain files, in this example, the &lt;em&gt;not-hugo&lt;/em&gt; directory.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And that&amp;rsquo;s it! Once I&amp;rsquo;ve made and tested my changes to the site, I just call &lt;em&gt;zoop.sh&lt;/em&gt;, hit my passphrase and the site is updated secrurely and efficiently :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>About</title>
      <link>https://makemyday.io/about/</link>
      <pubDate>Sun, 09 Apr 2017 19:08:32 +0200</pubDate>
      
      <guid>https://makemyday.io/about/</guid>
      <description>

&lt;p&gt;Welcome to &lt;strong&gt;Make My Day [IO]&lt;/strong&gt;, you&amp;rsquo;re probably wondering what you&amp;rsquo;re looking at. This is a personal blog. Who I am is not really relevant, just call me Charlie.&lt;/p&gt;

&lt;p&gt;This is the place I&amp;rsquo;ve created to document my journey walking the path of hacking/making/tinkering with electronics, programming and much more. I love learning new things, playing with devices, cracking them open, looking at how things work. I am just a very curious person looking for a place to write about the things that make me happy. The things that make my day.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;m by no means an expert, I am an eternal apprentice. However, I hope that what I share here helps you, just as what many others share openly helps me to better understand technology.&lt;/p&gt;

&lt;p&gt;If you want to contact me, feel free to send an email to &lt;img src=&#34;https://makemyday.io/img/mail.png&#34; alt=&#34;Mail&#34; /&gt;. For more information about how did I get here, read the &lt;a href=&#34;../post/hello-world&#34;&gt;first post&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&#34;privacy&#34;&gt;PRIVACY&lt;/h3&gt;

&lt;p&gt;This website does not use cookies nor trackers of any kind and it uses HTTPS by default.&lt;/p&gt;

&lt;h3 id=&#34;subscribe&#34;&gt;SUBSCRIBE&lt;/h3&gt;

&lt;p&gt;If you want to follow the updates of the blog, you can subscribe to rhe &lt;a href=&#34;../index.xml&#34;&gt;RSS feed&lt;/a&gt; of the site.&lt;/p&gt;

&lt;p&gt;You can also follow them on my rather inactive &lt;a href=&#34;https://twitter.com/makemydayIO&#34;&gt;Twitter account&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>First post</title>
      <link>https://makemyday.io/post/hello-world/</link>
      <pubDate>Fri, 07 Apr 2017 21:25:35 +0200</pubDate>
      
      <guid>https://makemyday.io/post/hello-world/</guid>
      <description>&lt;p&gt;During 2016 I decided to join the Barcelona Hub project, created by the Inceptum Foundation. The Hub is a collaborative workplace, with different areas, including office and coworking space. The goal of Inceptum is to help and promote projects (from personal to corporate) with a special interest in those with a social purpose, non-profits, free software and STEM education projects.&lt;/p&gt;

&lt;p&gt;But what made me join them is their workshop. The place I like to call &lt;strong&gt;The Makerspace&lt;/strong&gt;. I came here with just one idea in my mind: Spend my days hacking and making things, learning about the stuff that I like: DIY, electronics, Linux, coding and security. It&amp;rsquo;s been a tough start, mainly because I&amp;rsquo;m a quite a chaotic being. So far I&amp;rsquo;ve been able to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create an emergency exit system based on an Adafruit Trinket by hacking a wireless-triggered alarm system.&lt;/li&gt;
&lt;li&gt;Create a crappy, Raspberry Pi-based home surveillance system using a PIR sensor, a camera, a relay and a lamp.&lt;/li&gt;
&lt;li&gt;Create a full-length smart mirror, using a Raspberry Pi and by repairing a broken 22&amp;rdquo; TV that I got for 10€.&lt;/li&gt;
&lt;li&gt;Build a &lt;a href=&#34;http://www.prusaprinters.org/prusa-i3/&#34;&gt;Prusa i3&lt;/a&gt; 3D printer.&lt;/li&gt;
&lt;li&gt;Create an interactive art project using Processing, Arduino and the capacitance of the human body.&lt;/li&gt;
&lt;li&gt;Make the most awesome marriage proposition by mixing my skills in videogames, networking, 3D printing, RFID, electronics and programming.&lt;/li&gt;
&lt;li&gt;Repair my bike several times, saving some money.&lt;/li&gt;
&lt;li&gt;Do a lot of microprojects that I&amp;rsquo;m putting together in order to create my first on-line course on programming, electronics and Arduino (in spanish).&lt;/li&gt;
&lt;li&gt;Create this website using &lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt;!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I thought&amp;hellip; Why am I not documenting these? I am constantly discovering things that I find useful and could be useful to others.
I have always admired those who publish their projects and share them with everyone. Lots of anonymous people have helped me by sharing their experience and knowledge openly. I always wanted to do it. I finally feel confident that what I do may be handy to others, to you, maybe :) What I share in this place are the things that I like the most, my interests, the silly things that make my day.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>

