<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">

<channel>
  <title>Chinmaya Mahesh</title>
  <link>https://chinmayamahesh.me</link>
  <description>Blog posts from Chinmaya Mahesh</description>
  <item>
    <title>Why the Set of Languages over Any Non Empty Alphabet Is Uncountable</title>
    <link>https://chinmayamahesh.me/languageproof.html</link>
    <pubDate>Fri, 27 Dec 2019 00:00:00 +0000</pubDate>
    <description>
		<p><em>Warning: this is not very rigorous, I just want to provide an intuitive explanation.</em></p>
		<p>
		I have seen a lot of different proofs on why the set of languages over an alphabet  <img class="displaymath" src="img/eqn000.png" WIDTH="16" HEIGHT="17" STYLE="vertical-align: -1px; margin: 0;" alt="\Sigma" /> is uncountable, however the one I'm about to show you now is the simplest in my opinion. It involves using Cantor's diagonalisation argument and forming a couple of bijections.		</p>
		<p>
		Firstly, we can see that if we prove that the set of languages over the alphabet  <img class="displaymath" src="img/eqn001.png" WIDTH="72" HEIGHT="24" STYLE="vertical-align: -6px; margin: 0;" alt="\Sigma = \{0\}" /> denoted by  <img class="displaymath" src="img/eqn002.png" WIDTH="16" HEIGHT="17" STYLE="vertical-align: -1px; margin: 0;" alt="\mathcal{L}" /> is uncountable, then the set of languages over any non-empty alphabet is uncountable, as we can just take a one element subset of the alphabet, form a bijection to  <img class="displaymath" src="img/eqn003.png" WIDTH="31" HEIGHT="24" STYLE="vertical-align: -6px; margin: 0;" alt="\{0\}" />, and as the set of languages with that subset is uncountable, and this set is a subset of all languages possible from the alphabet, then the set of languages for the whole alphabet must be uncountable. Thus it is sufficient to prove that the set of languages over the alphabet  <img class="displaymath" src="img/eqn001.png" WIDTH="72" HEIGHT="24" STYLE="vertical-align: -6px; margin: 0;" alt="\Sigma = \{0\}" /> is uncountable.		</p>
		<p>
		Ok, first of all, let us observe the set  <img class="displaymath" src="img/eqn004.png" WIDTH="15" HEIGHT="17" STYLE="vertical-align: -1px; margin: 0;" alt="S" /> of all possible finite-length strings formed from the alphabet  <img class="displaymath" src="img/eqn001.png" WIDTH="72" HEIGHT="24" STYLE="vertical-align: -6px; margin: 0;" alt="\Sigma = \{0\}" />.  <img class="displaymath" src="img/eqn004.png" WIDTH="15" HEIGHT="17" STYLE="vertical-align: -1px; margin: 0;" alt="S" /> will just be strings of a finite number of 0s concatenated i.e.,<br/>		<center> <img class="displaymath" src="img/eqn005.png" WIDTH="210" HEIGHT="24" STYLE="vertical-align: -6px; margin: 0;" alt="S = \{0, 00, 000, 0000, ... \}" /></center><br/>		We can create an injective function<br/>
		<center> <img class="displaymath" src="img/eqn006.png" WIDTH="61" HEIGHT="17" STYLE="vertical-align: -1px; margin: 0;" alt="S \rightarrow \mathbb{N}" /></center><br/>		<center> <img class="displaymath" src="img/eqn007.png" WIDTH="61" HEIGHT="24" STYLE="vertical-align: -6px; margin: 0;" alt="s \mapsto |s|" /></center>		where  <img class="displaymath" src="img/eqn008.png" WIDTH="21" HEIGHT="24" STYLE="vertical-align: -6px; margin: 0;" alt="|s|" /> is the length of the string  <img class="displaymath" src="img/eqn009.png" WIDTH="11" HEIGHT="12" STYLE="vertical-align: -1px; margin: 0;" alt="s" />. Clearly, this is injective, and thus the set  <img class="displaymath" src="img/eqn004.png" WIDTH="15" HEIGHT="17" STYLE="vertical-align: -1px; margin: 0;" alt="S" /> is countable.		</p>
		<p>
		As  <img class="displaymath" src="img/eqn004.png" WIDTH="15" HEIGHT="17" STYLE="vertical-align: -1px; margin: 0;" alt="S" /> is countable, we can assign a unique natural number to each element of  <img class="displaymath" src="img/eqn004.png" WIDTH="15" HEIGHT="17" STYLE="vertical-align: -1px; margin: 0;" alt="S" />, i.e., we can say that  <img class="displaymath" src="img/eqn004.png" WIDTH="15" HEIGHT="17" STYLE="vertical-align: -1px; margin: 0;" alt="S" /> is of the form<br/>		<center> <img class="displaymath" src="img/eqn010.png" WIDTH="154" HEIGHT="24" STYLE="vertical-align: -6px; margin: 0;" alt="S = \{s_1, s_2, s_3, ...\}" /></center><br/>		Let  <img class="displaymath" src="img/eqn011.png" WIDTH="53" HEIGHT="19" STYLE="vertical-align: -3px; margin: 0;" alt="L \in \mathcal{L}" />. Then,  <img class="displaymath" src="img/eqn012.png" WIDTH="65" HEIGHT="21" STYLE="vertical-align: -4px; margin: 0;" alt="\forall s_i \in S" />, either  <img class="displaymath" src="img/eqn013.png" WIDTH="55" HEIGHT="21" STYLE="vertical-align: -4px; margin: 0;" alt="s_i \in L" /> or  <img class="displaymath" src="img/eqn014.png" WIDTH="55" HEIGHT="24" STYLE="vertical-align: -6px; margin: 0;" alt="s_i \notin L" />. Thus, we can represent  <img class="displaymath" src="img/eqn015.png" WIDTH="15" HEIGHT="17" STYLE="vertical-align: -1px; margin: 0;" alt="L" /> as so:<br/>		<center>
		 <img class="displaymath" src="img/eqn016.png" WIDTH="238" HEIGHT="61" STYLE="vertical-align: -24px; margin: 0;" alt="

 \begin{tabular}{||c c c c c c||} 
 \hline
 $S:$ &amp; $s_1$ &amp; $s_2$ &amp; $s_3$ &amp; $s_4$ &amp; ... \\ [0.5ex] 
 \hline\hline
 $L:$ &amp; 0 &amp; 1 &amp; 1 &amp; 0 &amp; ...\\ 
 \hline
\end{tabular}
		" /> 		</center><br/>
		where a 0 means that  <img class="displaymath" src="img/eqn014.png" WIDTH="55" HEIGHT="24" STYLE="vertical-align: -6px; margin: 0;" alt="s_i \notin L" /> and a 1 means that  <img class="displaymath" src="img/eqn013.png" WIDTH="55" HEIGHT="21" STYLE="vertical-align: -4px; margin: 0;" alt="s_i \in L" /> for the  <img class="displaymath" src="img/eqn017.png" WIDTH="16" HEIGHT="16" STYLE="vertical-align: -4px; margin: 0;" alt="s_i" /> in that column. 
		</p>
		<p>
		Now, we want to prove that  <img class="displaymath" src="img/eqn002.png" WIDTH="16" HEIGHT="17" STYLE="vertical-align: -1px; margin: 0;" alt="\mathcal{L}" /> is uncountable. We will do this using a proof by contradiction. Let us assume that  <img class="displaymath" src="img/eqn002.png" WIDTH="16" HEIGHT="17" STYLE="vertical-align: -1px; margin: 0;" alt="\mathcal{L}" /> is countable. This means that there must be some enumeration of elements in  <img class="displaymath" src="img/eqn002.png" WIDTH="16" HEIGHT="17" STYLE="vertical-align: -1px; margin: 0;" alt="\mathcal{L}" /> where we assign a unique natural number to each element of  <img class="displaymath" src="img/eqn002.png" WIDTH="16" HEIGHT="17" STYLE="vertical-align: -1px; margin: 0;" alt="\mathcal{L}" />. Let us take one such enumeration.<br/>		For this enumeration, we can create a similar representation in terms of 0s and 1s for all the  <img class="displaymath" src="img/eqn011.png" WIDTH="53" HEIGHT="19" STYLE="vertical-align: -3px; margin: 0;" alt="L \in \mathcal{L}" />:<br/>
		<center>
		 <img class="displaymath" src="img/eqn018.png" WIDTH="246" HEIGHT="136" STYLE="vertical-align: -62px; margin: 0;" alt="

 \begin{tabular}{||c c c c c c||} 
 \hline
 $S:$ &amp; $s_1$ &amp; $s_2$ &amp; $s_3$ &amp; $s_4$ &amp; ... \\ [0.5ex] 
 \hline\hline
 $L_1:$ &amp; 0 &amp; 1 &amp; 1 &amp; 0 &amp; ...\\ 
 \hline
 $L_2:$ &amp; 1 &amp; 0 &amp; 0 &amp; 1 &amp; ...\\ 
 \hline
 $L_3:$ &amp; 1 &amp; 1 &amp; 0 &amp; 0 &amp; ...\\ 
 \hline
 $L_4:$ &amp; 0 &amp; 0 &amp; 0 &amp; 1 &amp; ...\\ 
 \hline
\end{tabular}
		" /> 		</center><br/>
		and so on. If we can prove that this enumeration does not contain every language over  <img class="displaymath" src="img/eqn000.png" WIDTH="16" HEIGHT="17" STYLE="vertical-align: -1px; margin: 0;" alt="\Sigma" />, then we know that this enumeration is not valid as it is not surjective. Now, let us create a language  <img class="displaymath" src="img/eqn019.png" WIDTH="20" HEIGHT="19" STYLE="vertical-align: -1px; margin: 0;" alt="L'" />, where the column containing  <img class="displaymath" src="img/eqn017.png" WIDTH="16" HEIGHT="16" STYLE="vertical-align: -4px; margin: 0;" alt="s_i" /> is 0 if it is 1 for  <img class="displaymath" src="img/eqn020.png" WIDTH="20" HEIGHT="21" STYLE="vertical-align: -4px; margin: 0;" alt="L_i" />, and 1 if it is 0 for  <img class="displaymath" src="img/eqn020.png" WIDTH="20" HEIGHT="21" STYLE="vertical-align: -4px; margin: 0;" alt="L_i" />. That is, we take the complement of every element in the diagonal of the above table:<br/>		<center>
		 <img class="displaymath" src="img/eqn021.png" WIDTH="246" HEIGHT="136" STYLE="vertical-align: -62px; margin: 0;" alt="

 \begin{tabular}{||c c c c c c||}
 \hline
 $S:$ &amp; $s_1$ &amp; $s_2$ &amp; $s_3$ &amp; $s_4$ &amp; ... \\ [0.5ex] 
 \hline\hline
 $L_1:$ &amp; {\bfseries 0} &amp; 1 &amp; 1 &amp; 0 &amp; ...\\ 
 \hline
 $L_2:$ &amp; 1 &amp; {\bfseries 0} &amp; 0 &amp; 1 &amp; ...\\ 
 \hline
 $L_3:$ &amp; 1 &amp; 1 &amp; {\bfseries 0} &amp; 0 &amp; ...\\ 
 \hline
 $L_4:$ &amp; 0 &amp; 0 &amp; 0 &amp; {\bfseries amp;1} &amp; ...\\ 
 \hline
\end{tabular}
		" /> 	        </center><br/>
		So in thiamp;s case,  <img class="displaymath" src="img/eqn019.png" WIDTH="20" HEIGHT="19" STYLE="vertical-align: -1px; margin: 0;" alt="L'" /> includes  <img class="displaymath" src="img/eqn022.png" WIDTH="70" HEIGHT="17" STYLE="vertical-align: -6px; margin: 0;" alt="s_1, s_2, s_3" /> but doesn't include  <img class="displaymath" src="img/eqn023.png" WIDTH="18" HEIGHT="16" STYLE="vertical-align: -4px; margin: 0;" alt="s_4" /> as that is what the complement of every element in the above diagonal represents. We can see that the  <img class="displaymath" src="img/eqn024.png" WIDTH="22" HEIGHT="21" STYLE="vertical-align: -1px; margin: 0;" alt="i^{th}" /> element in  <img class="displaymath" src="img/eqn019.png" WIDTH="20" HEIGHT="19" STYLE="vertical-align: -1px; margin: 0;" alt="L'" /> differs with the  <img class="displaymath" src="img/eqn024.png" WIDTH="22" HEIGHT="21" STYLE="vertical-align: -1px; margin: 0;" alt="i^{th}" /> element in  <img class="displaymath" src="img/eqn020.png" WIDTH="20" HEIGHT="21" STYLE="vertical-align: -4px; margin: 0;" alt="L_i" />, and thus  <img class="displaymath" src="img/eqn019.png" WIDTH="20" HEIGHT="19" STYLE="vertical-align: -1px; margin: 0;" alt="L'" /> is different from every other  <img class="displaymath" src="img/eqn020.png" WIDTH="20" HEIGHT="21" STYLE="vertical-align: -4px; margin: 0;" alt="L_i" />. Thus this enumeration does not cover every element in  <img class="displaymath" src="img/eqn002.png" WIDTH="16" HEIGHT="17" STYLE="vertical-align: -1px; margin: 0;" alt="\mathcal{L}" />. As the above argument can be applied to any enumeration, no such enumeration can exist. Thus we cannot form a bijection to  <img class="displaymath" src="img/eqn025.png" WIDTH="17" HEIGHT="17" STYLE="vertical-align: -1px; margin: 0;" alt="\mathbb{N}" />, and so  <img class="displaymath" src="img/eqn002.png" WIDTH="16" HEIGHT="17" STYLE="vertical-align: -1px; margin: 0;" alt="\mathcal{L}" /> is uncountable.		</p>
		<h3>References:</h3>
		<ul>
		<li/> <a href="https://diego.assencio.com/?index=c51c5ab87e0ee7e7a5cbfafb04f2ba4b">Diego Assencio's proof for why the set of languages over {0,1} is uncountable</a>
		<li/> <a href="http://jeffe.cs.illinois.edu/teaching/algorithms/models/02-regular.pdf">Jeff Erickson's regular languages notes</a>
		</ul>
    </description>
  </item>
  <item>
    <title>Android as FOSS as possible</title>
    <link>https://chinmayamahesh.me/fossandroid.html</link>
    <pubDate>Sat, 11 Aug 2018 00:00:00 +0000</pubDate>
    <description>
		<p>
		<em>Wait... isn't Android already FOSS?</em><br/>
		Erm... kind of. The base android operating system, AOSP (Android Open Source Project) is free software, but <a href="https://arstechnica.com/gadgets/2018/07/googles-iron-grip-on-android-controlling-open-source-by-any-means-necessary/">almost every single part</a> you use and interact with everyday is completely proprietary, and Google further tightens their grasp on android by introducing concepts like <a href="https://github.com/Telegram-FOSS-Team/Telegram-FOSS/blob/master/Notifications.md">requiring messaging apps to use their proprietary push messaging services</a> in order to function the way they should. A lot of FOSS apps which used to be included by default on android (for example, the launcher, the calendar and the email client) have been abandoned and replaced by Google's own proprietary solutions (think Google Now Launcher, Google Calender, GMail etc). Imagine running Linux but having every single program you interact with be proprietary; it kind of defeats the purpose of having a FOSS operating system. Here I'm going to talk about how to make your android device as FOSS as possible while still maintaining your device's practicality. There are several ways to do this: attain root access and delete all the proprietary applications, install a custom ROM without google play services, disable all proprietary applications and so on. Here I am going to go the custom ROM route as this is the method I prefer and root access is generally not a good thing to have all the time.
		</p>

		<h2> Unlocking the Bootloader </h2>
		<p>
		Before we can begin to FOSSify our android device, we need to unlock the bootloader. The bootloader is a program which loads the rest of the Android OS for you. On an android device, it does a few more things like verifying whether the OS being booted is genuine (i.e, what was originally put by the manufacturer) or not. As the custom ROM is not what is trusted by the locked bootloader, we'll need to unlock it. On most devices, this should be possible, and a quick <strike>google</strike> duckduckgo search (for example "unlock bootloader moto g5 plus") would tell you how to do so. However, if your device doesn't have an unlocked bootloader, you're kind of stuck here. You could attain root access by exploiting a few flaws in the OS, but this varies from device to device and isn't very straightforward. <br/>
		<strong>Achtung! Unlocking the bootloader will most probably void your warranty.</strong>
		</p>

		<h2> Installing a custom recovery </h2>
		<p>
		A recovery is like a tiny OS which helps you do things like flashing/updating a ROM, making backups, and flashing/updating the recovery itself. You can boot your phone into the recovery using a specific key combination while booting (usually something like power button + volume down). While you can probably flash a ROM without a custom recovery, it is highly recommended that you use one as it makes your life much easier. Unfortunately, there is only one actively developed recovery nowadays, <a href="https://twrp.me/">TWRP</a>. On the bright side, it's open source! If your phone has an unlockable bootloader, it most probably has a TWRP port too, either an official or an unofficial one. Again, the internet is your friend, and you'll probably find an official port or an unofficial one in the <a href="https://forum.xda-developers.com/">XDA forums</a>. <br/>
		<strong>Achtung! If your port is unofficial, make sure that the porters are good with releasing the source code and that the recovery is in a good, working state by browsing the XDA thread for that port.</strong><br/>
		<strong>Sometimes, booting into stock android after flashing the recovery rewrites the recovery, resulting in you having to flash it again. To save yourself from this hassle, it might be better to boot directly into the recovery after installing it, and then flashing the custom ROM right away.</strong>
		</p>

		<h2> Installing a custom ROM </h2>
		<p>
		We're almost there! Now that you have a custom recovery installed, it's now time to install a custom ROM. The two "big" custom ROMs, in my opinion, are <a href="https://lineageos.org/">LineageOS</a> and <a href="https://www.omnirom.org/">OmniROM</a>, with LineageOS supporting more devices and being more popular among the custom ROM community. Again, there'll probably be an official port or an unofficial one on XDA. Most of the time, you'll have to wipe your phone's memory, download a .zip file, copy it onto your phone, and flash it through the recovery. The steps may vary from device to device (<a href="https://wiki.lineageos.org/devices/bacon/install">here</a>'s the steps for how to install it on the OnePlus One, for example), but they will usually follow this pattern. Refer to the install instructions from the device page on the LineageOS or OmniROM website (or an XDA thread for unoffically supported devices, or sometimes even an official XDA thread), depending on which one you choose. If in doubt, choose LineageOS as it's more popular and there will be more people to help you if you're stuck.
		</p>

		<h2> FOSS alternatives for common proprietary apps </h2>
		<p>
		With some perseverance and luck, after following all the steps detailed above, you should have a working device with a custom ROM installed! Now, time to get into the important part: the FOSS apps which I said are your saving grace from Google. First off, you won't have access to the play store, or any other Google goodies like Google Assistant, Maps, Voice recognition etc. Also, you would have noticed that a lot of the old, open source AOSP apps like the calendar, email, and gallery have appeared, slightly updated by the ROM maintainers to keep up with modern android. In the FOSS android world, you will be downloading most of your apps from <a href="https://f-droid.org/">F-Droid</a>, the free software alternative to the play store. So open the default browser on your device, go to the F-Droid website and install the app and you're set. Here are a few open source alternatives to popular proprietary apps on android, all available on F-Droid:<br/>
		<h3> Alternatives to: </h3>
		<ul>
		<li/> Chrome: <a href="https://f-droid.org/en/packages/org.mozilla.fennec_fdroid">Fennec F-Droid</a> (Firefox, but without the proprietary parts)
		<li/> YouTube: <a href="https://f-droid.org/en/packages/org.schabi.newpipe">NewPipe</a> (A FOSS lightweight frontend for YouTube and SoundCloud)
		<li/> Play Music: <a href="https://f-droid.org/en/packages/com.poupa.vinylmusicplayer">Vinyl Music Player</a>
		<li/> Google Maps: <a href="https://f-droid.org/en/packages/net.osmand.plus/">OsmAnd~</a> (A very powerful OpenStreetMap client)
		<li/> GMail/Any other email client: <a href="https://f-droid.org/en/packages/com.fsck.k9"> K-9 Mail </a> (has some neat features like PGP encryption support too!)
		<li/> WhatsApp/Facebook Messenger/Hangouts/Bla bla bla: <a href="https://f-droid.org/en/packages/im.vector.alpha">Riot</a> and maybe <a href="https://f-droid.org/en/packages/org.telegram.messenger">Telegram</a> if you can't convince anyone to use Riot (honestly, email with PGP is better than telegram, although I can't deny that telegram is very convinient to use).
		<li/> Twitter: <a href="https://f-droid.org/en/packages/com.keylesspalace.tusky/">Mastodon</a> (I've linked Tusky, a client for Mastodon, a federated social network)
		</ul>

		<h3> Not alternatives, but some cool FOSS apps: </h3>
		<ul>
		<li/> <a href="https://f-droid.org/en/packages/com.amaze.filemanager">Amaze File Manager</a>
		<li/> <a href="https://f-droid.org/en/packages/org.shadowice.flocke.andotp">andOTP 2 Factor Authentication</a>
		<li/> <a href="https://f-droid.org/en/packages/org.sufficientlysecure.viewer">Document Viewer</a>
		<li/> <a href="https://f-droid.org/en/packages/de.tap.easy_xkcd">Easy XKCD, for your XKCD viewing pleasure</a>
		<li/> <a href="https://f-droid.org/en/packages/net.sourceforge.opencamera">Open Camera, a better camera app</a>
		<li/> <a href="https://f-droid.org/en/packages/org.sufficientlysecure.keychain">OpenKeychain: PGP keystore</a>
		<li/> <a href="https://guardianproject.info/apps/orbot/">Orbot, Tor for android</a>
		<li/> <a href="https://guardianproject.info/apps/orfox/">Orfox, Tor Browser for android</a>
		<li/> <a href="https://f-droid.org/en/packages/org.supertuxkart.stk">SuperTuxKart, easily the best video game of all time™️</a>
		<li/> <a href="https://f-droid.org/en/packages/com.termux">Termux, a super cool terminal emulator with a ton of packages available</a>
		<li/> <a href="https://f-droid.org/en/packages/com.github.yeriomin.yalpstore">Yalp Store: Download apks from the Google Play Store, the trapdoor incase you absolutely need something</a>
		</ul>
		</p>

		<h2> Conclusion </h2>
		<p>
		Great! You now have a mostly FOSS android phone, with some obvious exceptions. The drivers for 3d acceleration, WiFi, the Modem, and basically every other driver is probably still a binary blob. There is not much you can do about this, unless you have a phone which has support for <a href="https://www.replicant.us/">Replicant</a>, a fully free android distribution. Even in that case, you'll still need binary blobs for some (subjectively) important features like WiFi. This is probably the most you can go while still having a functional "smart" android phone. Sadly, the state of AOSP for FOSS Purists is not very good and it certainly doesn't look like Google is going to help improve this situation in any way. XDA Forums, the hub of custom ROM development, is a complete mess and incredibly annoying to go through. This is why I am eagerly awaiting the <a href="https://puri.sm/shop/librem-5/">Purism Librem 5</a>, a Linux-running smartphone which will hopefully not contain any proprietary blobs. But no matter what the current situation is, run FOSS and support the great people behind custom ROMs, F-Droid and all the open source apps out there!
		</p>
    </description>
  </item>
  <item>
    <title>My Firefox Setup</title>
    <link>https://chinmayamahesh.me/ff.html</link>
    <pubDate>Thu, 02 Aug 2018 00:00:00 +0000</pubDate>
    <description>
		<p>
		One reason often stated when someone is asked why they use Firefox over other fine alternatives like Chromium (and its sidekicks Opera, Brave et al), w3m, <strike>Internet Explorer</strike> is that Firefox has a very rich addon ecosystem and is (still) very <em>customizable</em> (some of the posts on <a href="https://reddit.com/r/unixporn">/r/unixporn</a> will blow your mind). With that thought, I thought I would share how I use Firefox to browse the web everyday.
		</p>
		<h2> Look and Feel </h2>
		<p> First off, this is what my Firefox setup looks like:<br/>
		<img src="img/ff.png"></img>
		Right off, you can notice a few obvious things. The most obvious one is that the tab list is not on the top, but rather to the left. Removing the default tab bar was pretty simple with a declaration in userChrome.css (<a href="https://i.redd.it/v7lkiqannojz.png">useful guide</a> on how to do so by /u/DylanBoss, and the <a href="https://www.reddit.com/r/firefox/comments/736cji/how_to_hide_native_tabs_in_firefox_57_tree_style/">specific rules</a> you have to add). The addon used for the vertical tree like tab structure is called <a href="https://addons.mozilla.org/en-US/firefox/addon/tree-style-tab/">Tree Style Tab</a>, which I'll talk about later. The second thing is that there is no searchbar, but that was pretty useless in the first place as you can just search from the normal url bar.
		</p>
		<p> Another thing different from the default firefox config is the dark theme. This can be set from the Firefox <em>Customize...</em> option in the menu, along with setting a dark gtk theme (mine is arc-dark).</p>
		<h2> Addons </h2>
		<p> No discussion about Firefox would be complete without mentioning addons. These are the addons which I view as 'must-have'.
		<ul>
		<li/> <a href="https://addons.mozilla.org/en-US/firefox/addon/ublock-origin/">uBlock Origin</a>:<br/>
		If you only get to install one addon in your life, this should be it. Hands down the best ad-blocker for any browser. Just install it and you're done, you never have to touch it again.
		<li/> <a href="https://addons.mozilla.org/en-US/firefox/addon/https-everywhere/">HTTPS Everywhere</a>:<br/>
		Does what it says on the tin. Enforces HTTPS wherever possible, so that you don't have to use insecure HTTP ever again, even if you click on a HTTP link!
		<li/> <a href="https://addons.mozilla.org/en-US/firefox/addon/cookie-autodelete/">Cookie Autodelete</a>:<br/>
		Everytime you exit a tab, Cookie Autodelete automatically deletes all cookies associated with that website so that they can't be used to track you.
		<li/> <a href="https://addons.mozilla.org/en-US/firefox/addon/tree-style-tab/">Tree Style Tab</a>:<br/>
		Tree style tabs have provided the greatest increase in usability out of any of the addons I have installed. Having 20+ tabs open on the default tab bar is anxiety inducing. Tree style tabs have 2 advantages over regular tabs: vertical arrangement (useful on widescreen displays), and a tree heirarchy for tabs (i.e., if you click on a link on a website, the new tab opened will be considered a "child" of the current tab and will show up below it slightly indented) This provides a ton of neat features, like collapsing certain branches, closing all related tabs at once and more. This allows you to effortlessly manage your tabs and the vertical arrangement makes sure that the titles are always readable.
		</ul>
		</p>
		<p> Honourable mentions go to <a href="https://addons.mozilla.org/en-US/firefox/addon/noscript/">NoScript</a>, <a href="https://addons.mozilla.org/en-US/firefox/addon/privacy-badger17/">Privacy Badger</a>, and <a href="https://addons.mozilla.org/en-US/firefox/addon/tridactyl-vim/">Tridactlyl</a>.
		</p>

		<h2> Miscellanous Preferences </h2>
		<p>
		<ul>
		<li/> Default Search Engine: Duckduckgo. The bangs search feature is incredible, however I find the regular search result accuracy to be lacking compared to google, especially for a few niche/obscure areas.
		<li/> I've also got history and any sort of telemetry permanently disabled, and so Firefox is always considered to be in 'Private Browsing' mode.
		</ul>
		</p>
		
		<h2> Conclusion </h2>
		<p> Even with addons moving to WebExtensions, I haven't missed many things from the XUL days, and all the addons I regularly use have made the switch. Especially since the quantum update, Firefox has been a very pleasant browser to use.</p> 
    </description>
  </item>
</channel>

</rss>
