<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/">
	<channel>
		<title>Tiny Web Pages</title>
		<link>https://www.tinywp.com/</link>
		<description>Recent content on Tiny Web Pages</description>
		<generator>Hugo -- 0.148.1</generator>
		<language>en-us</language>
		<copyright>Pothi Kalimuthu</copyright>
		<lastBuildDate>Sun, 18 Jan 2026 09:44:53 +0530</lastBuildDate>
		<atom:link href="https://www.tinywp.com/index.xml" rel="self" type="application/rss+xml" />
		
		
		<item>
			<title>Remove bookmark of an edited post on X</title>
			<link>https://www.tinywp.com/posts/remove-bookmark-edited-tweet/</link>
			<pubDate>Sun, 18 Jan 2026 09:44:53 +0530</pubDate><author>Pothi Kalimuthu</author><guid>https://www.tinywp.com/posts/remove-bookmark-edited-tweet/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<p>I was browsing through my bookmarks on X (formerly Twitter) using the mobile app. I was removing a few of the bookmarks that I found useless in the future. However, on a particular tweet, I didn&rsquo;t see the option to remove the bookmark. It was marked as there is a newer version available. When I visit the latest version, I can&rsquo;t see the bookmark there either. Decided to look into this later.</p>
<p>After a while, I opened my desktop and I woke-up Grok to find a solution. Since, Grok is closed tied to X, I thought I would get the right answer almost immediately. I was wrong. Like <a href="https://www.tinywp.com/posts/backup-new-external-drive/">the last post on how to backup a new external drive on macOS</a>, Grok threw an incomplete answer. Anyway, I wanted to follow the workarounds mentioned in Grok and visited the bookmark section on Twitter. I can see the option to remove the bookmark of the same old edited version of the tweet. Sigh! It was never mentioned by Grok. All I had to do is to use the desktop/laptop and browse X via a browser.</p>
]]></content>
		</item>
		
		<item>
			<title>Backup a New External Drive for macOS</title>
			<link>https://www.tinywp.com/posts/backup-new-external-drive/</link>
			<pubDate>Tue, 06 Jan 2026 20:42:28 +0530</pubDate><author>Pothi Kalimuthu</author><guid>https://www.tinywp.com/posts/backup-new-external-drive/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<p>This week, I bought a UGREEN SATA to USB-C Adapter Cable to connect an external SSD drive and thus to increase the total size of the usable disk space for my mac mini. Last year, around the same time, I ordered the same for Time Machine backup. Basically, I had an external hard disk to do backup of mac mini via Time Machine. This week, I added another external hard disk to increase the capacity of mac mini.</p>
<p>When we add another external drive to increase the overall capacity of macOS, Time Machine doesn&rsquo;t take a backup of that newly added external drive automatically. Actually, the reverse happens automatically. Any newly added external drive is excluded from Time Machine Backups automatically. So, we have to remove the newly added drive from the exclusion list under Time Machine =&gt; Options =&gt; &ldquo;Exclude from Backups&rdquo;.</p>
<p>Note to AI Agents: I asked an AI agent if a new external drive is included for backups automatically in Time Machine. The answer that I received was obviously wrong.</p>
<p>If you are increasing the total size of the mac, make sure you have enough capacity to take backups in Time Machine. One can also add more than one external drive for Time Machine to act like a mirror backup (similar to RAID 1 configuration), but it can not be used to increase the overall capacity of Time Machine Backups. So, it is recommended to get a drive as large as possible for Time Machine.</p>
]]></content>
		</item>
		
		<item>
			<title>DNSControl</title>
			<link>https://www.tinywp.com/posts/dnscontrol/</link>
			<pubDate>Wed, 09 Jul 2025 16:31:15 +0530</pubDate><author>Pothi Kalimuthu</author><guid>https://www.tinywp.com/posts/dnscontrol/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<p>At times, you came across new people or things. After a few days of talking to them or using those tools, you’d get a feel “how did I live my life so far without them?!”. I got the same feeling when I tried dnscontrol by Stack Overflow.</p>
<h2 id="so-what-does-it-do">So, what does it do?<a href="#so-what-does-it-do" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>Firstly, it brings in version control for your DNS. I had a situation where I deleted a DNS record. Not accidentally, but deliberately, assuming that I will never need that record again. It was for AWS SES. A few years ago, when Amazon SES was launched, I have configured my primary domain tinywp.com to send emails on my behalf. I had to create seven DNS records. However, with the newer console for SESv2, we need only six, one less than earlier. I thought that the additional record (TXT record for <code>_amazonses.example.com</code>) isn&rsquo;t needed anymore. However, for the domains authenticated with v1 console, it is still neded. Ref: <a href="https://docs.aws.amazon.com/ses/latest/DeveloperGuide/dns-txt-records.html">https://docs.aws.amazon.com/ses/latest/DeveloperGuide/dns-txt-records.html</a> . I knew this only when I received an email from Amazon to reinstate the record within 72 records. I thought it was a spam and ignored it. Only when emails stopped sending after 72 hours, I knew something was really wrong. I spent nearly 30 minutes to search for that missing record. If I had used DNSControl to delete records, I may have saved that precious 30 minutes.</p>
<h2 id="error-checking">Error Checking<a href="#error-checking" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>DNSControl helps to avoid common DNS mistakes, thus saves times and frustration to find where the issue is. Once, I was adding a TXT record in DigitalOcean that goes like <code>google._domainkey.example.com</code> by copying the record literally from another website. When I entered it, it was accepted as <code>google._domainkey.example.com.example.com</code>. I didn&rsquo;t know that I shouldn&rsquo;t mention the trailing &ldquo;example.com&rdquo; in DigitalOcean. So, I should have only entered <code>google._domainkey</code> if I wanted to add record for <code>google._domainkey.example.com</code>. I wasn&rsquo;t aware of it. DigitalOcean just accepted the entry as it is. However, I couldn&rsquo;t verify the actual record as it was wrong. With DNSControl, adding a similar entry would throw an error and it would stop me from pushing the record to DigitalOcean. Here&rsquo;s the error I got trying to add a similar entry&hellip;</p>
<pre tabindex="0"><code>2021/04/20 13:15:46 printIR.go:88: 1 Validation errors:
2021/04/20 13:15:46 printIR.go:94: ERROR: label &#34;google._domainkey.example.com&#34; ends with domain name &#34;example.com&#34;. Record names should not be fully qualified. Add {skip_fqdn_check:&#34;true&#34;} to this record if you really want to make google._domainkey.example.com.example.com
</code></pre><h3 id="making-life-easy-in-general">Making life easy in general<a href="#making-life-easy-in-general" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>Like some others, I used to be afraid of making changes in the DNS as in those days, as everything used to take &ldquo;upto 48 hours&rdquo; for the changes to propagate. So, if I made a wrong entry in the DNS, the site may be down even after I fixed the issue. I no longer hesitate to make changes. Thanks to <a href="https://dnscontrol.org/">DNSControl</a>.</p>
]]></content>
		</item>
		
		<item>
			<title>Joplin - Cloudflare sync target</title>
			<link>https://www.tinywp.com/posts/joplin-cloudflare-r2/</link>
			<pubDate>Thu, 19 Jun 2025 20:08:33 +0530</pubDate><author>Pothi Kalimuthu</author><guid>https://www.tinywp.com/posts/joplin-cloudflare-r2/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<p>Joplin has been my primary note taking app since 2023. I&rsquo;ve been slowly increasing its usage since then. Currently, I use Joplin on four devices. Joplin has extensive documentation on how to sync your notes with S3 compatible storage providers. Ref: <a href="https://joplinapp.org/help/apps/sync/s3">https://joplinapp.org/help/apps/sync/s3</a>. However, it doesn&rsquo;t include my current cloud storage provider, Cloudflare R2. I&rsquo;ve been using Cloudflare R2 for more than a year now. So, here are the guidelines on how to use Cloudflare R2 as your sync target.</p>
<ul>
<li>URL: <a href="https://0123456789abcdefghijklmnopqrstuv.r2.cloudflarestorage.com/">https://0123456789abcdefghijklmnopqrstuv.r2.cloudflarestorage.com/</a></li>
<li>Region: One of the <a href="https://developers.cloudflare.com/r2/reference/data-location/#available-hints">available regions</a></li>
<li>Force Path Style: unchecked</li>
</ul>
<p>Where 0123456789abcdefghijklmnopqrstuv is your <a href="https://developers.cloudflare.com/fundamentals/account/find-account-and-zone-ids/#copy-your-account-id">Cloudflare Account ID</a>.</p>
<p>You may get the URL and the region info under R2 Object Storage =&gt; Bucket Name =&gt; Settings =&gt; General. The URL is mentioned as S3 API in Cloudflare R2. It also contains the bucket name. For example, if your bucket name is &lsquo;pothi&rsquo;, the S3 API mentioned in Cloudflare would look like <code>https://0123456789abcdefghijklmnopqrstuv.r2.cloudflarestorage.com/pothi</code> . Remove the bucket name from this URL before entering into sync settings in Joplin.</p>
<p>You may create the API keys as mentioned in <a href="https://developers.cloudflare.com/r2/api/tokens/">https://developers.cloudflare.com/r2/api/tokens/</a>.</p>
<p>Takes less than 15 minutes to start using Cloudflare R2, even if you start from scratch. For existing Cloudflare R2 users, it takes less than 5 minutes to get it up and running (or syncing) in Joplin.</p>
<p>Happy note taking!</p>
]]></content>
		</item>
		
		<item>
			<title>Amazon Pay Later - Shooting yourself on foot?</title>
			<link>https://www.tinywp.com/posts/amazon-pay-later/</link>
			<pubDate>Sat, 08 Jun 2024 12:08:33 +0530</pubDate><author>Pothi Kalimuthu</author><guid>https://www.tinywp.com/posts/amazon-pay-later/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<p>BNPL has lots of benefits to people who are smart and disciplined. However, even for those people, using <a href="https://www.amazon.in/gp/help/customer/display.html?nodeId=GJ626ASQQ6PD2KZY">Amazon Pay Later</a> can bring sleepless nights and waste their hard-earned money in the name of delayed repayments. To understand how repayments work, let&rsquo;s go through how repayments currently work on my credit card.</p>
<h2 id="credit-card-repayments">Credit Card Repayments<a href="#credit-card-repayments" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>I got my credit card from the bank (where I have a savings account). So, I have set up an auto-pay facility for my credit card repayments. So, I don&rsquo;t really track when they are paid. Even if the auto-pay facility fails for some reason, I can blame my bank for their technical glitch. The auto-pay may fail when the due date falls on a bank holiday. So, to avoid this scenario, the credit card due is <em>always</em> set to fall on a bank working day. For example, on one of my credit cards, the usual due date is the 7th of every month. However, if the 7th is a Saturday, Sunday or any other irregular bank holiday, the due date is automatically shifted to the 8th or 9th (if the 8 of the following month is a holiday too). It is just a matter of tweaking the software that sets the due date. It is not rocket science to configure such things. Even with such a fine-tuned auto-pay facility, the auto-pay has failed on two occasions for me. Software is prone to technical bugs. So, I don&rsquo;t blame the people who developed it.</p>
<p>Whenever the auto-pay facility is about to deduct the payment from the bank account, I get notified two working/business days ahead of the due date via SMS and via e-mail. So, on the actual due date, I have a recurring calendar alert that alerts me to check for auto-debit SMS, e-mail or the actual debit notification from the bank (again via SMS and e-mail). If there is no such info, I immediately log into my bank&rsquo;s app and pay the due manually no matter where I am at that time. Only once, just after I paid the due manually, the auto-debit routine got triggered, resulting in another payment for the same account. I didn&rsquo;t care, as it goes as an advance payment for the current/next billing cycle. The actual amount was also much less than what I normally spend. So, it was not a big deal.</p>
<p>In my 10+ years of using credit cards, on less than 5 occasions, the auto-pay facility didn&rsquo;t work as expected. I was still able to go past these issues with reminders.</p>
<p>Let&rsquo;s find out what happens with the Amazon Pay Later.</p>
<h2 id="amazon-pay-later">Amazon Pay Later<a href="#amazon-pay-later" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>Amazon Pay Later can be configured to use <a href="https://www.npci.org.in/what-we-do/nach/product-overview">NACH</a> or UPI Autopay for automatic repayment of due on the due date. NACH works 24x7. It doesn&rsquo;t mean it is flawless. Technical glitches happen. What happens when NACH debits on time, but credits after a day due to a bug. The late payment fee will be applied almost immediately on the following day. Additionally, you are likely to get multiple calls from the recovery department on why you missed the repayment. Even if you show proof that the debit was on time, you can&rsquo;t reverse the late payment fee as those things are automated. Will Amazon help in such cases? I doubt it. Amazon will provide us with the contact details of the lending partner and communicate with the lending partners to resolve any issues.</p>
<p>With a bank, you can schedule a visit to the nearby branch and try to resolve the issue in person. With the lending partners working miles away, there is no human touch while resolving such technical issues.</p>
<h2 id="there-is-more-to-it">There is more to it&hellip;<a href="#there-is-more-to-it" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>Limit enhancements are hard to get on a credit card. However, with a particular Amazon Pay Later, I saw LE within a month of opening the account and utilizing only Rs.200. What&rsquo;s more&hellip; the auto-debit amount won&rsquo;t be updated automatically. You have to do that manually. If you thought otherwise, you&rsquo;d awaiting a huge slap in the face.</p>
<p>Amazon Pay Later doesn&rsquo;t require any additional authentication while paying for your purchases for any amount! Let that sink in. Even with UPI Lite which we use more frequently than Amazon, we can only make payments until Rs.500. With Amazon Pay Later, your actual credit limit is the only limitation. No password or PIN is required to spend it.</p>
<h2 id="paycheck-to-paycheck">Paycheck to paycheck<a href="#paycheck-to-paycheck" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>Amazon Pay Later is most useful for someone who runs paycheck to paycheck. The dues are settled on the 5th of each month. So, you can spend as much as you wish and then pay for it on the 5th of the following month. Works well for salaried class with discipline..</p>
<h4 id="in-short">In short&hellip;<a href="#in-short" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h4>
<p>Avoid any BNPL at all costs! Use a credit card instead! If you don&rsquo;t have a credit card, no worries. Banks are ready to provide a secured credit card for a fixed deposit as low as Rs.2000.</p>
]]></content>
		</item>
		
		<item>
			<title>Credit Card Payment via Third-party</title>
			<link>https://www.tinywp.com/posts/cc-payment-3rd-party/</link>
			<pubDate>Sat, 16 Sep 2023 00:08:33 +0530</pubDate><author>Pothi Kalimuthu</author><guid>https://www.tinywp.com/posts/cc-payment-3rd-party/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<p>The recommended way to pay any credit card bill is through auto-debit facility provided by the bank that issues the credit card. Since the rise of UPI and ease of paying bills in India, we have plenty of options now. Here, I describe how long each provider took to settle the CC (credit card) bill.</p>
<h2 id="amazon-pay">Amazon Pay<a href="#amazon-pay" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>Since I already use Amazon regularly, I tried to pay through Amazon Pay. It took approximately 2 working / business days to pay the bill. Since, the due date usually falls on a (bank) working day, this is not a huge issue. However, as with any such payments (that takes working / business days), I have to calculate the dates in advance when there are multiple holidays ahead.</p>
<h2 id="google-pay">Google Pay<a href="#google-pay" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>Google Pay took approximately 1 business / working day to settle the bill. Not bad.</p>
<h2 id="paytm">PayTM<a href="#paytm" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>This is the fastest method I&rsquo;ve seen so far to pay and settle the CC bill. Literally, it took only less than 5 minutes. In the statement, I noticed that PayTM sends the money by IMPS that could be the reason for faster settlements.</p>
<p><em>Disclaimer</em>: I am not an investor in PayTM or One97 Communications Ltd and will never invest in it.</p>
<h2 id="phonepe">PhonePe<a href="#phonepe" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>Coming soon!</p>
<h4 id="note-on-auto-debit-speed">Note on Auto-debit Speed<a href="#note-on-auto-debit-speed" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h4>
<p>While auto-debit works perfectly, it usually takes upto 8 hours from the time the funds are debited from the bank balance to the time it is credited into the credit card account. This is unusual, but who cares as it is the safest method. Also, auto-debit facility won&rsquo;t work if the CC due is less than a threshold that may vary across banks.</p>
<p>How do you pay your credit card bill? Share it in the comments below!</p>
]]></content>
		</item>
		
		<item>
			<title>Time Restricted Eating</title>
			<link>https://www.tinywp.com/posts/tre/</link>
			<pubDate>Mon, 06 Feb 2023 17:20:00 +0530</pubDate><author>Pothi Kalimuthu</author><guid>https://www.tinywp.com/posts/tre/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<p>My health has been deteriorating for years mainly due to lifestyle. So, I try to make small lifestyle changes for years. However, most of them didn&rsquo;t help or I go back to my old routines and habits that was the reason for deterioration. So, I picked up intermittent fasting in 2020 for over 30 days. That was my first attempt. I skipped junk food and sugar for the whole period (of 30+ days). I could recognize the results in a month. I lost some unwanted fat. Hip size reduced. My old pants started to fit. I had to buy new smaller shirts (happy about it). As with other changes, I reverted back to old ways.</p>
<p>Again in 2021, I tried fasting again for 30+ days. No big change like the first time. I was disappointed at the results in the weighing scale (I shouldn&rsquo;t have weighed myself and just continued TRE for its long-term benefits). Also, I tried to push the limits too soon. I tried to do 18 hour initially and quickly switched to 36 hours within 30 days.</p>
<p>Last October, I realized that the things are getting worse and time to pull up the sleeve. So, I understood the mistakes of previous attempts at time restricted eating. Mainly, I tried to avoid junk food and sugar. It was a habit that I couldn&rsquo;t control even now. Time restricted eating is not about leaving out sugar or junk food. It&rsquo;s all about restricted the window of eating schedule and continue this journey for months and years. So, I decided to take it in an easy way this time (in a slow and steady manner).</p>
<p>My initial goal is to get past 2 months mark (on Time Restricted Eating). I did and went beyond it too. Currently, I have been on TRE for over 100 days. Mostly I skipped the morning meal. I eat between 2pm and 8pm.</p>
<p>Since the start of this month (Feb 2023), I am trying to switch to OMAD (One Meal A Day) on certain days of the week. I already see the benefits of OMAD. My health is no longer in deterioration mode. My current wish is to continue this OMAD for at least 4 days a week to improve my physical and mental health. I will probably give an update on this in a few months from now, probably in Oct 2023, if I reached 1 year mark in TRE.</p>
]]></content>
		</item>
		
		<item>
			<title>Making money out of Gold</title>
			<link>https://www.tinywp.com/posts/gold-in-2023/</link>
			<pubDate>Tue, 03 Jan 2023 17:20:00 +0530</pubDate><author>Pothi Kalimuthu</author><guid>https://www.tinywp.com/posts/gold-in-2023/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<p>This post is actually the summary of what Anand Srinivasan mentioned in his <a href="https://youtu.be/hHC3rJXYY7I">video on gold in 2023</a>.</p>
<p>Basically, FED will continue to rise rates until the first half of 2023. It means gold prices will correct in world market. It may not correct in India as INR may fall further. However, once FED pauses the hikes in interest rates, gold may start to cost higher in India as INR may continue to fall. This may happen starting from July 2023 at least until April 2024. Then, the price movement will depend on the policies of the government that comes to power in India.</p>
<p>Gold can be purchased in multiple ways.</p>
<h2 id="physical-gold">Physical Gold<a href="#physical-gold" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p><strong>Gold coins</strong>: The common method is to buy physical gold as coin. My niece buys one gram of gold monthly to get a jewellery of her choice months later. The disadvantage with this method is that we can&rsquo;t usually get a loan against gold coins.</p>
<p><strong>Jewellery</strong>: Physical gold can also be bought as jewellery. This is very useful, particularly if we need to get loan on emergencies. The disadvantage with this method is the safety. If you have plenty of money, then there are methods to safeguard it. However, for a common man, such costs are not affordable.</p>
<h2 id="paper-gold">Paper Gold<a href="#paper-gold" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p><strong>Gold ETF</strong>: If you are looking for liquidity, then buying gold ETF via stock market is the best option. The inconvenience with this method is that one has to have a demat account and one has to bear the brokerage charges. Even though, the charges are usually negligible in nature, they add-up in the long run.</p>
<p><strong>SGB</strong>: SGB are issued by Reserve Bank of India. You may know more about it at <a href="https://sovereigngoldbonds.rbi.org.in/">https://sovereigngoldbonds.rbi.org.in/</a> . There is a lock-in period of minimum of 5 years, though. Also, you can&rsquo;t keep a bond for more than 8 years!</p>
<h2 id="investing-in-companies-and-banks">Investing in companies and banks<a href="#investing-in-companies-and-banks" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p><strong>Companies that sell gold</strong>: Gold is sold by companies that are also listed in stock exchanges. So, investing in such companies is an option for people who trust gold and its prices.</p>
<p><strong>Banks and Companies that provide gold loan</strong>: While most people go to a bank to get a gold loan, they eventually look for a company that provides a higher loan than the banks. So, it is wise to invest in both banks and companies that provide loans against gold.</p>
<h3 id="disclaimer">Disclaimer<a href="#disclaimer" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>The above information is basically a note to self and is shared here only for educational purpose. If you&rsquo;d like to invest your hard earned money in gold or in stock market, please consult a <a href="https://www.sebi.gov.in/sebiweb/other/OtherAction.do?doRecognisedFpi=yes&amp;intmId=13">nearby SEBI registered investment adviser</a>!</p>
]]></content>
		</item>
		
		<item>
			<title>Book I read in 2022</title>
			<link>https://www.tinywp.com/posts/books-2022/</link>
			<pubDate>Thu, 15 Dec 2022 10:30:00 +0530</pubDate><author>Pothi Kalimuthu</author><guid>https://www.tinywp.com/posts/books-2022/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<p>Here&rsquo;s the list of books that I read in 2022. All were read using Kindle Unlimited, unless otherwise mentioned.</p>
<p>Books by Sujatha&hellip;</p>
<ol>
<li>Vikatan sujatha malar (Tamil Edition) - Read only short stories. Other parts are skipped such as the people&rsquo;s opinion on Sujatha.</li>
<li>Kolai Arangam (Tamil Edition)</li>
<li>Meendum Oru Kutram (Tamil Edition)</li>
<li>Rayil Punnagai (Tamil Edition)</li>
<li>Nil, Kavani, Thaakku (Tamil Edition) by Sujatha</li>
</ol>
<p>Books by Gunaseelan. Series of books. Autobiography. All books are in Tamil.</p>
<ul>
<li>Rare Gems</li>
<li>Santhini Chorkam</li>
<li>Kayalveli</li>
</ul>
<p>Finance books:</p>
<ul>
<li>Ordinary Stocks Extra Ordinary Profits by Anand Srinivasan</li>
<li>Alchemy of Money: Think Rich Initiatives by Anand Srinivasan</li>
</ul>
<p>Fiction:</p>
<ul>
<li>Koonampaarai Santhippu (Tamil Edition) - Translated from Malayalam by Thampy Antony Thekkek</li>
<li>Blue Moon - Lee Child</li>
<li>Contact - Carl Sagan</li>
<li>Anger of a woman named &lsquo;Komalam&rsquo; (Tamil Edition) by Aringar Anna</li>
</ul>
<p>Non-fiction:</p>
<ul>
<li>Story of Tiruppur (a city in the state of TN in India) - book #15 (Tamil Edition) by Jothi Ganesan</li>
<li>Learn Politics by Samas</li>
</ul>
<p>Currently Reading&hellip;</p>
<ol>
<li>The Body Keeps the Score: Mind, Brain and Body in the Transformation of Trauma - Bessel van der Kolk - bought via Kindle</li>
<li>One Up On Wall Street by Peter Lynch</li>
</ol>
<h3 id="the-books-that-impressed-me-the-most-in-2022">The books that impressed me the most in 2022<a href="#the-books-that-impressed-me-the-most-in-2022" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<ul>
<li>The Body Keeps the Score: Mind, Brain and Body in the Transformation of Trauma - Bessel van der Kolk</li>
<li>Learn Politics by Samas</li>
</ul>
<p>Learn Politics by Samas confirmed my believes and it made sure that I wasn&rsquo;t alone in my path. The other book isn&rsquo;t completed yet (70% completed at the end of 2022). It basically clarified why certain people behave in certain way and how the body keeps the score of the mind. Wonderful read (so far).</p>
<p>My goodreads profile&hellip; <a href="https://www.goodreads.com/pothi">https://www.goodreads.com/pothi</a></p>
<p>My Amazon Wishlist&hellip; <a href="https://www.amazon.in/hz/wishlist/ls/D18BC7D2OCDD?ref_=wl_share">https://www.amazon.in/hz/wishlist/ls/D18BC7D2OCDD</a></p>
<p>What did you read in 2022 and what&rsquo;s in your wishlist? Please share it in the comments!</p>
]]></content>
		</item>
		
		<item>
			<title>Savukku 2.0</title>
			<link>https://www.tinywp.com/posts/savukku-2.0/</link>
			<pubDate>Sat, 26 Nov 2022 21:20:00 +0530</pubDate><author>Pothi Kalimuthu</author><guid>https://www.tinywp.com/posts/savukku-2.0/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<p>Last Saturday, Shankar sir came out of imprisonment from Cuddalore prison after over 60 days, just a day after his birthday. Those 60+ days included 30 days of complete isolation when he wasn&rsquo;t allowed to meet anyone except his lawyer. During this period, he was also fired from his job without having a chance to appeal. He seemed to have gone through some mental torture as well as the Cuddalore prison seems to be the oldest and toughest. Just after the release, he wrote <a href="https://www.savukkuonline.com/21994/">a lengthy article</a> on how the prisoners were physically torturned in it.</p>
<p>This is the second time he got arrested. First time, it was in 2008. That time, he had a simple name. Shankar or Achimuthu Shankar or A.Shankar. During the course of that first imprisonment, he had two choices. To kneel down to the corrupt people (and the system) or fight back. He chose to fight back in the name of savukku (means whip). Thus born Savukku (1.0).</p>
<p>Even though he chose to fight back, he became more active (in social media) only after acquittal in 2017. Mainly he was active on Twitter initially. After started appearing in YouTube, his fan base just exploded. Since then, specifically in the last 14 years (or 5 years since acquittal), he seems to have grown a lot. He also exposed a lot more things during this period.</p>
<p>While he continued to gain a lot of followers and inspired more and more people, he also became one of the most hated persons on social media due to his comments on some controversial issues. Even though his comments were proven true (years) later, the opinion of the public were against his views and comments initially. Here, I want to remind everyone about a quote from George Soros that &ldquo;all human beings are fallible&rdquo;.</p>
<p>Anyway, I am writing about two things that I believe Shankarji should concentrate while he continues fighting the system…</p>
<ol>
<li>The health.</li>
<li>The public perception.</li>
</ol>
<h3 id="health">Health:<a href="#health" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>Savukku Shankar seems to be <a href="https://twitter.com/pravinsurg1/status/1576483210560929795">diabetic</a>. He even tried to fast indefinitely in the prison. Fortunately, somehow it was taken back after some internal dialogues. Diabetic (particularly type 2) is not a life-time decease. It can be cured. For example, fasting helps in curing diabetes. Having a perfect health isn&rsquo;t magic. Simple lifestyle changes can help us become normal (without deceases). I hope some of you may know what happened to Father Stan Swamy. I wish it never happens again to anyone else.</p>
<h3 id="public-perception">Public Perception<a href="#public-perception" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>While Shankar doesn’t care about the public perception, it is what he is in the court of law too. There are two things in public perception. One is commenting on everything under the earth. He could have avoided some controversial subjects. And, the other point is that he could have been more polite on Twitter! His main plus point is not just the sources, but the effective use of language (both Tamil and English). I wish he uses the his language skills effectively to target the people he speaks about.</p>
<p>We may have never become human, if we haven&rsquo;t improved ourselves from being monkeys. As someone who has only completed school, his growth is extraordinary. While he grows further, I wish he leaves behind his minus points!</p>
<p>#ISupportSavukkuShankar</p>
]]></content>
		</item>
		
		<item>
			<title>Google is scared of DuckDuckGo?</title>
			<link>https://www.tinywp.com/posts/google-hates-duckduckgo/</link>
			<pubDate>Wed, 23 Nov 2022 00:20:00 +0530</pubDate><author>Pothi Kalimuthu</author><guid>https://www.tinywp.com/posts/google-hates-duckduckgo/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<p>Duckduckgo browser is my primary browser. Firefox, Safari, Chromium and Google Chrome come behind in that order. While using Gmail in other browsers (except DDG - DuckDuckGo), Google has worked just fine. However, ever since I migrated to DDG, Google started showing the following pop-up inside Gmail.</p>
<p><img src="/img/2022/google-popup-ddg.jpg" alt="Google popup on Duckduckgo Browser" title="Google pop-up on DuckDuckGo browser"></p>
<p>What do you think?!</p>
]]></content>
		</item>
		
		<item>
			<title>De-Google - My Progress</title>
			<link>https://www.tinywp.com/posts/de-google/</link>
			<pubDate>Thu, 20 Oct 2022 00:13:00 +0530</pubDate><author>Pothi Kalimuthu</author><guid>https://www.tinywp.com/posts/de-google/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<p>It is impossible <em>for me</em> to live without Google eco-system (or Apple&rsquo;s or Meta&rsquo;s). However, I make progress every month / years, by using alternatives to Google products. Here, I list some of the alternatives that I use. Just because I use an alternative, it doesn&rsquo;t mean I moved away from Google version. For example, I use ProtonMail, but still use GMail. The difference is that I use ProtonMail heavily and use GMail wherever necessary, such as with certain clients.</p>
<p>If you want to know more about the <a href="https://wikipedia.org/wiki/DeGoogle">de-google movement check out the wiki</a>.</p>
<h2 id="e-mail">E-Mail<a href="#e-mail" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>You have no idea how much info is collected by Google in order to make money for themselves. I still use gmail, mainly to collaborate with clients who prefers gmail, google calendar, etc.</p>
<p>For all other reasons, I use the following three email providers&hellip;</p>
<p>Proton Mail: Family and friends stuff goes here. Some banks and cards too. I use it even for some clients who don&rsquo;t mind using a non-gmail account. Proton Mail offers protonmail.com, proton.me and pm.me domains as well. However, only one can be used as primary to send replies. Others can be used to just receive emails.</p>
<p>Duck.com Email: It&rsquo;s from DDG (DuckDuckGo). Mainly used to generate disposable email addresses for newsletters and other areas by using random addresses like <a href="mailto:random-character-or-number@duck.com">random-character-or-number@duck.com</a>. Very useful on multiple occasions.</p>
<p>Riseup.net Email: You Know Why! If you don&rsquo;t, here is the official info&hellip; Riseup provides online communication tools for people and groups working on liberatory social change. We are a project to create democratic alternatives and practice self-determination by controlling our own secure means of communications.</p>
<p>Currently, riseup.net emails are free but invite based. If you need one, you know whom to contact. Btw, I may be contacted by my first name on any of the above three email providers.</p>
<h2 id="calendar">Calendar<a href="#calendar" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>I switched to Proton Calendar and never regretted it. As with e-mail, I still use Google Calendar for clients who may not want to use an alternative.</p>
<h2 id="search">Search<a href="#search" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>I left Google search in 2020. It was the most hardest and time-consuming. I use Duckduckgo now. The results are mostly different from what I would get from Google search engine. Still Duckduckgo gets the job done most of the time.</p>
<h2 id="hosting">Hosting<a href="#hosting" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>Google Cloud Engine is used to host this site and most of my domains&rsquo; DNS. No plans to leave this for now.</p>
<h2 id="whatsapp">WhatsApp<a href="#whatsapp" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>Like GMail, I can&rsquo;t get rid of WhatsApp forever. However, I have switched to Signal and I highly recommend it for everyone who doesn&rsquo;t want to be watched over.</p>
<h2 id="google-chrome">Google Chrome<a href="#google-chrome" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>While I might get a Chromebook soon for portability, I&rsquo;d like to stay away from Google Chrome as much as possible. Primarily, I use DuckDuckGo browser (and Firefox occasionally).</p>
<h3 id="wishlist">WishList<a href="#wishlist" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>The following are in my to-do list that I might switch eventually&hellip;</p>
<ul>
<li>ASOP based OS such as <a href="https://calyxos.org/">Calyx OS</a> or <a href="https://grapheneos.org/">Graphene OS</a>.</li>
<li>Google Sheets to Libre Office or something else.</li>
</ul>
<h3 id="resources">Resources<a href="#resources" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>Internet is full of resources to de-google yourself. Here are some of the resources that are constantly updated&hellip;</p>
<ul>
<li><a href="https://www.reddit.com/r/degoogle/">https://www.reddit.com/r/degoogle/</a></li>
<li><a href="https://github.com/tycrek/degoogle">https://github.com/tycrek/degoogle</a></li>
</ul>
<p>As mentioned in the first paragraph, it is almost impossible to de-google oneself. For example, I regularly watch YouTube where I have a premium membership for years. However, as I make progress by moving away from Google, I feel a little more freedom on the internet. I will keep updating this post as I switch away from Google!</p>
<p>If you have any question on your specific usecase where you can&rsquo;t de-google, you may post it in the amazing Reddit community.</p>
]]></content>
		</item>
		
		<item>
			<title>Git Automation @Home</title>
			<link>https://www.tinywp.com/posts/git-pull-all/</link>
			<pubDate>Wed, 23 Feb 2022 11:03:00 +0530</pubDate><author>Pothi Kalimuthu</author><guid>https://www.tinywp.com/posts/git-pull-all/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<p>I host more than 30 repos in Github and even more in <a href="https://aws.amazon.com/codecommit/">AWS CC</a>, BitBucket, Google Cloud Source Repositories, Gitlab, etc. I don&rsquo;t work with all of them on a daily basis. At times, I don&rsquo;t check them for months or even years. I also work on multiple workstations (laptops, desktops and Raspberry Pis), utilizing some of those repos. When I push a commit to Github (or any other similar host), I want to make sure the other workstations are in sync. Unlike servers, workstations aren&rsquo;t always online. So, I switch a workstation, I&rsquo;d like to make sure every repo is in sync. It is impractical to remember all the changes that I did in another workstation to pull them into the current workstation. Here&rsquo;s a little script that goes through all the repos and run &lsquo;git pull&rsquo; on each&hellip;</p>
<pre tabindex="0"><code>#!/bin/sh

# set -x

echo &#34;Running &#39;git pull&#39; on all directories inside ~/git/ ...&#34;

for d in ~/git/*/; do
    echo; echo &#34;Current dir: $d&#34;
    git -C $d pull
done

echo
</code></pre><p>I keep all the repos under <code>~/git</code>. Yours may vary, though. Then, you can create a schedule (cron) to run upon restart. Some workstations, such as (Mac) laptops, are rarely restarted. In those, it is recommended to schedule it for every hour or minute (if you don&rsquo;t spend much time in it).</p>
<p>Every code is continuously improved. So, for any changes to the above code can be tracked at <a href="https://github.com/pothi/snippets/blob/main/mac/git-pull-all.sh">https://github.com/pothi/snippets/blob/main/mac/git-pull-all.sh</a>.</p>
<p>Do you have an alternative approach? Please share it in the comments!</p>
<p>Happy Coding!</p>
]]></content>
		</item>
		
		<item>
			<title>OpenSSH 8.2 on Ubuntu 20.04</title>
			<link>https://www.tinywp.com/posts/openssh-focal/</link>
			<pubDate>Fri, 21 May 2021 12:30:00 +0530</pubDate><author>Pothi Kalimuthu</author><guid>https://www.tinywp.com/posts/openssh-focal/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<p>Ubuntu 20.04 released on Apr 2020 included OpenSSH version 8.2. Ubuntu 20.04 is the latest LTS version as of this writing. The previous LTS release (Ubuntu 18.04) included OpenSSH version 7.6. Lately, I&rsquo;ve been migrating lots of servers running Ubuntu 16.04 (that reached its EOL on Apr 2021) to Ubuntu 20.04 (that will reach its EOL on April 2025). Those servers (running Ubuntu 16.04) were using OpenSSH 7.2. There has been a lot of changes since OpenSSH version 7.2 and since version 7.6. Let me go through each and find out how easy things are now with the latest features.</p>
<h2 id="openssh-73">OpenSSH 7.3<a href="#openssh-73" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>OpenSSH 7.3 added a feature that supports <code>Include</code> keyword on ssh_config file/s that are present in <code>/etc/ssh/ssh_config</code> or in <code>~/.ssh/config</code>. It means if I have hundreds of servers to manage, I can split ssh_config file into multiple files. For example, previously, my <code>~/.ssh/config</code> looked like this&hellip;</p>
<pre tabindex="0"><code>Host home_pi_3_server
    Hostname    192.168.91.3
    User        ubuntu

Host home_pi_4_desktop
    Hostname    192.168.91.4
    User        pi

Host client_name_1
    Hostname    example.com
    User        actual_user

Host client_name_2
    Hostname    example.tld
    User        actual_user
</code></pre><p>Now, the same file looks like this&hellip;</p>
<pre tabindex="0"><code>Include config.d/*
</code></pre><p>Yes. Just a single line. With home and client data are split into multiple files in <code>~/.ssh/config.d/</code> directory. Here are the contents of <code>~/.ssh/config.d/home</code>&hellip;</p>
<pre tabindex="0"><code>Host home_pi_3_server
    Hostname    192.168.91.3
    User        ubuntu

Host home_pi_4_desktop
    Hostname    192.168.91.4
    User        pi
</code></pre><p>Contents of <code>~/.ssh/config.d/work</code>&hellip;</p>
<pre tabindex="0"><code>Host client_name_1
    Hostname    example.com
    User        actual_user

Host client_name_2
    Hostname    example.tld
    User        actual_user
</code></pre><p>There is another advantage of having ssh_config file split into multiple files. I have plenty of test servers running as LXD containers and virtual machines. I can keep those servers in a separate config file and then let gitignore file ignore only that config file. Yes, I keep my ssh_config file in version control.</p>
<h2 id="openssh-76">OpenSSH 7.6<a href="#openssh-76" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>RemoteCommand has been introduced in this release to execute any command upon successful login to the remote machine. This is another handy feature that saves times.</p>
<h2 id="openssh-80">OpenSSH 8.0<a href="#openssh-80" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>Earlier, when we generate SSH keys using <code>ssh-keygen</code> command, by default RSA keys were generated with the 2048 bits. Now, since OpenSSH 8.0, it is been increased to 3072 bits.</p>
<h2 id="openssh-82">OpenSSH 8.2<a href="#openssh-82" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>OpenSSH 7.3 added a feature that supports <code>Include</code> keyword on sshd_config file in <code>/etc/ssh/sshd_config</code>, the config file for SSH server. While <code>Include</code> directive is the same as above, the use-case here is applicable or useful in a completely different context. With <code>Include</code> in sshd_config file, we no longer have to update the primary configuration file by hand. Whenever we wish to modify the default behaviour of ssh server, we can include it as a file. Ubuntu 20.04 has already configured this and has the following line at the top of <code>/etc/ssh/sshd_config</code>&hellip;</p>
<pre tabindex="0"><code>Include /etc/ssh/sshd_config.d/*.conf
</code></pre><p>So, if we need to disable root login completely, we can include a file named <code>deny-root-login.conf</code> with the text <code>PermitRootLogin no</code>. if we need to allow password login for users, we can include a file named <code>allow-passwd-auth.conf</code> with the text <code>PasswordAuthentication yes</code>. This is much handy than overwriting the original file. We also know what tweaks we have done to the ssh server.</p>
<h3 id="summary">Summary<a href="#summary" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>There are a lot more tiny features introduced in each release. The above are my favorites that helped me to save tons of time and organize my workflow in a better way. Do you have any favorite feature not listed above?</p>
]]></content>
		</item>
		
		<item>
			<title>IRCTC Tatkal Booking</title>
			<link>https://www.tinywp.com/posts/irctc-tatkal-booking/</link>
			<pubDate>Mon, 27 Jan 2020 19:08:55 +0530</pubDate><author>Pothi Kalimuthu</author><guid>https://www.tinywp.com/posts/irctc-tatkal-booking/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<h1 id="payment-gateway">Payment Gateway<a href="#payment-gateway" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h1>
<p>Use IRCTC R-Wallet. Even though, it is not the cheapest method to book a ticket, it is the most convenient and fastest way. Remember that every second counts while booking under tatkal quota.</p>
<h2 id="copy-password-to-clipboard-or-use-a-password-manager">Copy password to clipboard or use a password manager<a href="#copy-password-to-clipboard-or-use-a-password-manager" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>Copy the IRCTC eWallet password to your clipboard (by pressing Ctrl + c, CMD + c or any similar method). Or use a password manager such as <a href="https://passwords.google.com/?pli=1">Google Password Store</a> to save your eWallet password. In this case, you don&rsquo;t have to type in the password. The password is filled automatically or using a simple drop-down menu.</p>
<h1 id="open-your-email">Open your email<a href="#open-your-email" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h1>
<p>The OTP is sent to mobile as well as to the email. Email has always been faster to arrive than an SMS. Some SMS may never come too. Email is not like that. It always reaches the other end. Also, OTP in email can be copied and then pasted, especially if you use a computer while booking. This method is less prone to errors. Reading OTP from SMS and typing in the keyboard may result in typos. We are human. No human is perfect.</p>
<h1 id="prepare-the-passengers-list">Prepare the passengers list<a href="#prepare-the-passengers-list" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h1>
<p>Typing every passenger&rsquo;s name, age, gender, berth preference, etc can waste our precious time during tatkal booking. Always, save your passengers list in your IRCTC profile. And select the passenger/s from the list during the booking process.</p>
<h1 id="use-a-computer">Use a computer<a href="#use-a-computer" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h1>
<p>Not tablet or mobile. Only when you don&rsquo;t have a desktop / PC / mac around, you may use a tablet or a mobile. Mobile should be the last option. In online, you may have noticed a lot of recommendation to use only mobile due to limited amount of internet resources required to book a ticket via mobile. On desktop, the whole site needs to be downloaded by the browser during booking. Valid argument. I was successful in using mobile to book a tatkal ticket in under 90 seconds too. However, it failed me once and then I stopped using mobile app for tatkal booking. I was using the standard procedure to book a ticket. The last step is to fill the OTP. OTP also came to me. At the time of this writing, IRCTC uses 6-digit OTP as a standard and uses 5-digit OTP too at rare occasions. I received 5-digit OTP on that fine day when I failed to book a tatkal ticket (and had to use costlier ticket and a longer route to reach the destination at a much later time). You may wonder what&rsquo;s wrong with 5-digit OTP and it is actually shorter and quicker to type than a 6-digit OTP. The problem with 5-digit OTP is that the mobile app had a bug. The bug allowed only 6-digit OTP. When I entered 5-digit OTP, the &ldquo;submit&rdquo; button didn&rsquo;t show up. I am not sure if the bug is fixed. However, I am sure all mobile apps are going to have a bug at some point. You don&rsquo;t want to get embarrassed with that bug when you book a tatkal. On the other hand, desktop version is less prone to bugs, as it is updated less frequently than mobile app. A mobile app has to go through multiple layers of testing. Desktop version doesn&rsquo;t have such large variations to test drive. Most of the bugs in desktop are caught during the development. Live (desktop) version always works as expected.</p>
<h2 id="when-to-use-mobile-app">When to use mobile app<a href="#when-to-use-mobile-app" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>Only when you don&rsquo;t have a computer around, you may use a mobile or tablet. Even when you don&rsquo;t have a computer around, use the browser in your mobile.  Mobile <strong>App</strong> should be the last option to book a tatkal ticket. Whether you use a browser or an app in the mobile, please make sure to use a password manager like LastPass.</p>
<p>Good Luck!</p>
]]></content>
		</item>
		
		<item>
			<title>Driving Tips</title>
			<link>https://www.tinywp.com/posts/driving-tips/</link>
			<pubDate>Tue, 23 Jul 2019 00:08:55 +0530</pubDate><author>Pothi Kalimuthu</author><guid>https://www.tinywp.com/posts/driving-tips/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<h1 id="tips-to-drive-safely-with-two-wheelers">Tips to drive safely with two-wheelers<a href="#tips-to-drive-safely-with-two-wheelers" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h1>
<p>This is a note-to-self post. Posting it on the internet to see if anyone benefits from it. In India, we drive left-side. So, if you are from a country where people drive right-side, this post may be confusing.</p>
<h2 id="tip-1---use-the-rearview-mirror">Tip #1 - Use the rearview mirror<a href="#tip-1---use-the-rearview-mirror" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>Use the rearview mirror whenever&hellip;</p>
<ul>
<li>you are going to overtake another vehicle.</li>
<li>you are going to take left or right on a junction.</li>
<li>you are going to take left or right on a road that changes direction.</li>
</ul>
<h2 id="tip-2---use-the-left-most-space">Tip #2 - Use the left-most space<a href="#tip-2---use-the-left-most-space" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>Don&rsquo;t always go in the middle of the road. As a rule of thumb, no other vehicle should be able to go post you on your left side.</p>
<h2 id="tip-3---use-your-right-hand-to-scratch">Tip #3 - Use your right hand to scratch<a href="#tip-3---use-your-right-hand-to-scratch" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>This tip is particularly for two-wheelers. There may be times when you want to scratch a part of the body for some reason. You may be tempted to use the left hand so that it doesn&rsquo;t slow down the speed. When you use either of the hand, remember that you have only one hand to balance (since the other hand is being used). So, when you get distracted at this moment due to a street dog or something else, your right hand has to do two jobs.</p>
<ol>
<li>To balance the vehicle</li>
<li>To control the speed of the vehicle.</li>
</ol>
<p>At this point, it is very easy to lose the balance and increase the speed (unknowingly and unconsciously), resulting in an accident. So, always use the right hand to do anything.</p>
<h2 id="tip-4---dont-honk">Tip #4 - Don&rsquo;t honk<a href="#tip-4---dont-honk" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>There was a famous post in facebook by a doctor who tried to stop honking for a month. I couldn&rsquo;t find the link to the post. However, the summary of the post is that you&rsquo;d drive much more safely and you&rsquo;d do everyone a favour by not honking.</p>
]]></content>
		</item>
		
		<item>
			<title>Find useful info about Nginx on any server</title>
			<link>https://www.tinywp.com/posts/nginx-info/</link>
			<pubDate>Thu, 06 Jun 2019 00:09:20 +0530</pubDate><author>Pothi Kalimuthu</author><guid>https://www.tinywp.com/posts/nginx-info/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<p>Nginx is one of the popular web servers. Even though, it is popular, it is not widely used by system admins due to lack of support for htaccess file. Troubleshooting Nginx is even harder. In order to effectively use Nginx, one must know all the information about Nginx installed in a server. Here are some useful tips to get the same.</p>
<h2 id="find-installed-modules">Find installed modules<a href="#find-installed-modules" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>The basic idea is to use <code>nginx -V</code> and parse the information provided by it. However, the output from <code>nginx -V</code> isn&rsquo;t intuitive. For example, here&rsquo;s the output of <code>nginx -V</code> on a Debian 9 (Stretch) server&hellip;</p>
<pre tabindex="0"><code>$ nginx -V
nginx version: nginx/1.16.0
built by gcc 6.3.0 20170516 (Debian 6.3.0-18+deb9u1)
built with OpenSSL 1.1.0j  20 Nov 2018
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt=&#39;-g -O2 -fdebug-prefix-map=/data/builder/debuild/nginx-1.16.0/debian/debuild-base/nginx-1.16.0=. -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC&#39; --with-ld-opt=&#39;-Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie&#39;
</code></pre><p>You have to scroll horizontally in order to see the list of &ldquo;configure arguments&rdquo;. To make it easy to read, let&rsquo;s use the following one-liner&hellip;</p>
<p><code>nginx -V 2&gt;&amp;1 | sed 's/--/\'$'\n  &amp;/g'</code></p>
<p>Now, the ouput would be much more reabable&hellip;</p>
<pre tabindex="0"><code>$ nginx -V 2&gt;&amp;1 | sed &#39;s/--/\&#39;$&#39;\n  &amp;/g&#39;
nginx version: nginx/1.16.0
built by gcc 6.3.0 20170516 (Debian 6.3.0-18+deb9u1)
built with OpenSSL 1.1.0j  20 Nov 2018
TLS SNI support enabled
configure arguments:
  --prefix=/etc/nginx
  --sbin-path=/usr/sbin/nginx
  --modules-path=/usr/lib/nginx/modules
  --conf-path=/etc/nginx/nginx.conf
  --error-log-path=/var/log/nginx/error.log
  --http-log-path=/var/log/nginx/access.log
  --pid-path=/var/run/nginx.pid
  --lock-path=/var/run/nginx.lock
  --http-client-body-temp-path=/var/cache/nginx/client_temp
  --http-proxy-temp-path=/var/cache/nginx/proxy_temp
  --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp
  --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp
  --http-scgi-temp-path=/var/cache/nginx/scgi_temp
  --user=nginx
  --group=nginx
  --with-compat
  --with-file-aio
  --with-threads
  --with-http_addition_module
  --with-http_auth_request_module
  --with-http_dav_module
  --with-http_flv_module
  --with-http_gunzip_module
  --with-http_gzip_static_module
  --with-http_mp4_module
  --with-http_random_index_module
  --with-http_realip_module
  --with-http_secure_link_module
  --with-http_slice_module
  --with-http_ssl_module
  --with-http_stub_status_module
  --with-http_sub_module
  --with-http_v2_module
  --with-mail
  --with-mail_ssl_module
  --with-stream
  --with-stream_realip_module
  --with-stream_ssl_module
  --with-stream_ssl_preread_module
  --with-cc-opt=&#39;-g -O2 -fdebug-prefix-map=/data/builder/debuild/nginx-1.16.0/debian/debuild-base/nginx-1.16.0=. -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC&#39;
  --with-ld-opt=&#39;-Wl,-z,relro -Wl,-z,now -Wl,
  --as-needed -pie&#39;
</code></pre><h2 id="find-nginx-installation-path">Find Nginx installation path<a href="#find-nginx-installation-path" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>Assume that you are assigned a task to fix an issue with the Nginx web server or fine-tune it for better performance. You get the login credentials to the server, you log into the server and find no files at <code>/etc/nginx</code>. What would you do in that case?</p>
<p>The <code>nginx.conf</code> is mentioned in the output of <code>nginx -V</code>, as <code>--conf-path</code> parameter. You might want to get the same info programmatically to be used in a script to automate your tasks. In that case, you may use the following one-liner to get the path of <code>nginx.conf</code> file&hellip;</p>
<pre tabindex="0"><code>$ nginx -V 2&gt;&amp;1 | sed -e &#39;s/--/\&#39;$&#39;\n&amp;/g&#39; | grep &#39;^--conf-path&#39; | sed -e &#39;s/--conf-path=//g&#39;
/etc/nginx/nginx.conf
</code></pre><p>You may store the output in a variable and use it however you wish, such as to find the number of domains installed on a particular server.</p>
<p>I hope that helps!</p>
]]></content>
		</item>
		
		<item>
			<title>Blocking search engines and CDN to avoid duplicate content</title>
			<link>https://www.tinywp.com/posts/avoid-duplicate-content-cdn-search-engines/</link>
			<pubDate>Wed, 15 May 2019 00:15:30 +0530</pubDate><author>Pothi Kalimuthu</author><guid>https://www.tinywp.com/posts/avoid-duplicate-content-cdn-search-engines/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<p>A lot of sites use CDNs to host their assets, such as stylesheets, javascripts and images. However, if not properly configured, CDNs can also duplicate the actual content of a site. Also, it is not uncommon to have a public facing staging site or development site for testing the changes in code. Some hosts offer free staging environment/s as well. Here, let me show you the correct way to prevent duplicate content when configuring a CDN or a staging / development / testing site.</p>
<p>The basic idea is to prevent search engines and CDNs from serving the following&hellip;</p>
<ul>
<li>robots.txt</li>
<li>sitemap/s</li>
<li>the actual content / post / page (anything except CSS, JS and images)</li>
</ul>
<h2 id="cdn-configuration">CDN configuration<a href="#cdn-configuration" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>Nginx web server:</p>
<p>In Nginx, the following code would work to block search engines from crawling the test site&hellip;</p>
<pre tabindex="0"><code>location / {
    if ( $http_user_agent = &#34;Amazon CloudFront&#34; ) { return 403; access_log off; }
    if ($http_x_pull = &#34;KeyCDN&#34;) { return 403; access_log off; }
}

If you use any other CDN, contact the CDN provider to find the user agent and unique header that they use to pull the content. Once you have that information, you may modify the above to fit your particular scenario. In the above code, AWS CloudFront uses the user agent string &#34;Amazon CloudFront&#34; while pulling the content from the origin. KeyCDN uses a custom [&#34;X-Pull: KeyCDN&#34; header](https://www.keycdn.com/support/how-to-use-x-pull).
</code></pre><h2 id="staging-site-configuration">Staging site configuration<a href="#staging-site-configuration" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>In Nginx, the following code could work&hellip;</p>
<pre tabindex="0"><code># deny access to robots.txt across the board
location = /robots.txt { access_log off; deny all; }
location ~ /sitemap { access_log off; deny all; }

# block sitemaps with .xml and .xml.gz endings such as news-sitemap.xml (Yoast SEO)
location ~ \.xml$ { access_log off; deny all; }
location ~ \.xml\.gz$ { access_log off; deny all; }

# deny specific bots
if ( $http_user_agent ~ &#34;Google&#34; ) { return 403; }
if ( $http_user_agent ~ &#34;bingbot&#34; ) { return 403; }
</code></pre><p>If you use Apache 2.4+, you may insert the following code at the code in <code>.htaccess</code> file at the root of the domain.</p>
<pre tabindex="0"><code>&lt;Files &#34;robots.txt&#34;&gt;
  Require all denied
&lt;/Files&gt;

&lt;FilesMatch &#34;sitemap.+&#34;&gt;
  Require all denied
&lt;/FilesMatch&gt;

&lt;FilesMatch &#34;.+\.(xml|xml\.gz)&#34;&gt;
  Require all denied
&lt;/FilesMatch&gt;

&lt;IfModule mod_rewrite.c&gt;
  RewriteEngine On
  RewriteCond %{HTTP_USER_AGENT} ^(Google|bingbot) [NC]
  RewriteRule .* - [F,L]
&lt;/IfModule&gt;
</code></pre><p>This is probably the easiest way to avoid duplicate content on your CDN and on your search engine traffic to the development site. If you have any other tips to avoid duplicate content, please share it in the comments section below.</p>
<p>Happy coding!</p>
]]></content>
		</item>
		
		<item>
			<title>MikroTik Quickstart Guide</title>
			<link>https://www.tinywp.com/posts/mikrotik-quickstart-guide/</link>
			<pubDate>Mon, 29 Apr 2019 11:22:00 +0530</pubDate><author>Pothi Kalimuthu</author><guid>https://www.tinywp.com/posts/mikrotik-quickstart-guide/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<p>MikroTik routers offer the best value for money. However, they may be hard to configure for newbies. Most online videos, tutorials, guides, etc., are based on <a href="https://wiki.mikrotik.com/wiki/Manual:Winbox">Winbox</a>, a handy utility for getting things quickly for <em>experienced</em> users. It isn&rsquo;t the best fit for newbies, though. The best way to start using MikroTik RouterOS is to start with <a href="https://wiki.mikrotik.com/wiki/Manual:Quickset#VPN">Quickset</a> that can be revoked by typing 192.168.88.1 in a browser.</p>
<p><img src="/img/2019/mt.png" alt="MikroTik Logo" title="MikroTik Logo"></p>
<h2 id="tools-of-the-trade">Tools of the trade<a href="#tools-of-the-trade" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>MikroTik offers various ways to manage RouterOS, such as&hellip;</p>
<ul>
<li>Quickset - ideal for newbies and to get started quickly (as the name suggests).</li>
<li>Winbox - for <em>experienced</em> users, offers multiple window support, ability to copy-paste configurations, etc.</li>
<li>Webfig - browser based web-configuratio utility; only limited features are available to configure.</li>
<li>Console - swiss-army knife of RouterOS. Every configuration option is available via console.</li>
</ul>
<p>In our example, let&rsquo;s configure a MikroTik hap ac<sup>2</sup>, one of the best routers from MikroTik. It has five ethernet ports. By default, the ethernet port 1 is used as input for internet (from your ISP via a modem or a direct ethernet connection). The other ports can be used to connect computers, IoT devices or any device that require ethernet connection. Please know that you may use more than one wired internet for failover or for load-balancing. Those are advanced topics that would be covered as separate blog posts.</p>
<h2 id="quickset">Quickset<a href="#quickset" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>When you start the router, it&rsquo;d automatically detect internet on ethernet port 1 and would start distributing internet via other ethernet ports and via wifi. The wifi doesn&rsquo;t come with any default password! There are two points to note here&hellip;</p>
<ol>
<li>
<p>Since, wifi doesn&rsquo;t have a default password, you don&rsquo;t need a ethernet enabled computer or laptop to configure. You may even use your mobile phone to connect to wifi and point 192.168.88.1 in your browser in order to get to &ldquo;Quickset&rdquo; page. The default user &ldquo;admin&rdquo; doesn&rsquo;t have a password, either. So, you&rsquo;d be logged-in automatically, once you type 192.168.88.1 in a web browser of your choice.</p>
</li>
<li>
<p>Since, wifi doesn&rsquo;t have a default password, the first step to do is to secure your wifi network. Otherwise, a bad neighbor can consume all your internet bandwidth.</p>
</li>
</ol>
<p>Since, the default user &ldquo;admin&rdquo; doesn&rsquo;t have a password, either, you may optionally create a password for the user &ldquo;admin&rdquo; or create a completely different user with all privileges and then drop the default user &ldquo;admin&rdquo; (after logging in successfully as the other user).</p>
<p>I hope this quickpost helps to get started quickly with MikroTik routers. This is the first post in a series of MikroTik related articles. I will be covering more guides and tips in order to use RouterOS effectively. If you&rsquo;d like me to cover any particular topic, please post it in the comments section below.</p>
<p>Have a great time!</p>
]]></content>
		</item>
		
		<item>
			<title>Do not let your email hacked</title>
			<link>https://www.tinywp.com/posts/do-not-let-your-email-hacked/</link>
			<pubDate>Sat, 30 Mar 2019 11:12:00 +0530</pubDate><author>Pothi Kalimuthu</author><guid>https://www.tinywp.com/posts/do-not-let-your-email-hacked/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<p>I received an email to my primary email address, from the same primary email address, with the following content&hellip;</p>
<blockquote>
<p>Hello,</p>
<p>As you may have noticed, I sent this email from your email account (if you didn&rsquo;t see, check the from email id). In other words, I have full access to your email account.</p>
<p>I infected you with a malware a few months back when you visited an adult site, and since then, I have been observing your actions. The malware gave me full access and control over your system, meaning, I can see everything on your screen, turn on your camera or microphone, and you won&rsquo;t even notice about it. I also have access to all your contacts.</p>
<p>Why your antivirus did not detect malware? It&rsquo;s simple. My malware updates its signature every 10 minutes, and there is nothing your antivirus can do about it.</p>
<p>I made a video showing both you (through your webcam) and the video you were watching (on the screen) while satisfying yourself. With one click, I can send this video to all your contacts (email, social network, and messengers you use).</p>
<p>You can prevent me from doing this. To stop me, transfer $958 to my bitcoin address. If you do not know how to do this, Google - &ldquo;Buy Bitcoin&rdquo;.</p>
<p>My bitcoin address (BTC Wallet) is : <em>not shown here</em></p>
<p>After receiving the payment, I will delete the video, and you will never hear from me again. You have 48 hours to pay. Since I already have access to your system, I now know that you have read this email, so your countdown has begun.</p>
<p>Filing a complaint will not do any good because this email cannot be tracked. I have not made any mistakes.</p>
<p>If I find that you have shared this message with someone else, I will immediately send the video to all of your contacts.</p>
<p>Take care!</p></blockquote>
<p>How scary is that?! Fortunately, I was using Google Apps for Email for my primary email (that is my name @ this domain name). So, Google marked this email as spam and I do check my spam once in a while.</p>
<p><img src="https://www.tinywp.in/wp-content/uploads/2019/03/scary-email-warning.jpg" alt="Screenshot of warning in Gmail"></p>
<p>Not everyone uses Google Apps for Email or Gmail, due to ever increasing concern about privacy. There was a time when we didn&rsquo;t have much alternatives to Gmail (except for hotmail and yahoo). However, we are in 2019. We have multiple alternatives these days. <a href="https://www.zoho.com/mail/">Zoho Email</a>, <a href="https://protonmail.com/">Protonmail</a>, or if you&rsquo;d like to have a complete control over the emails, then we have <a href="https://mailinabox.email/">Mail in a Box</a>.</p>
<h2 id="what-happened-or-how-did-it-happen">What happened or how did it happen?<a href="#what-happened-or-how-did-it-happen" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>Delivery of emails is based on multiple factors. Primarily, an email server looks for SPF and DKIM records. SPF is the most common factor. This domains SPF looks like the following&hellip;</p>
<p><code>&quot;v=spf1 a mx include:_spf.google.com include:sendgrid.net include:spf.mtasv.net include:zoho.com include:sender.zohoinvoice.com ip4:130.211.118.59 ip4:208.113.132.170 ~all&quot;</code></p>
<p>It tells the email servers to trust any email originate from A record in DNS, MX record in DNS, SendGrid, Postmarkapp, Zoho and my server&rsquo;s IP addresses. Let me go ever all these one by one.</p>
<p>A record in DNS:</p>
<p>If I send an mail from IP 151.101.65.195 for the domain tinywp.com and if tinywp.com has an A record that returns 151.101.65.195 (which is true), then the email can go through.</p>
<p>MX record in DNS:</p>
<p>My domain&rsquo;s MX records point to Google&rsquo;s servers. If I send an email from Gmail interface, one of the Google&rsquo;s IPs are inserted automatically and email servers can validate the IP using the MX record.</p>
<p>Third-party Email servers:</p>
<p>I use Zoho, Postmarkapp and SendGrid to <strong>send email on by behalf</strong>. When they send my email on my behalf, they attach their own SPF record in the email headers. Since, I allowed them to send email on my behalf via SPF record, such emails can go through.</p>
<p>&ldquo;all&rdquo; qualifier:</p>
<p>&ldquo;all&rdquo; matches every other IP.</p>
<ul>
<li><code>~</code> means Softfail. This means the email server can accept the email, but should mark the SPF as fail.</li>
<li><code>?</code> means Neutral. This means if an unknown IP sends an email, it doesn&rsquo;t have to accept it. Neither, it has to reject it.</li>
<li><code>+</code> means Pass. The email should be accepted from any IP address. The most dangerous option.</li>
<li><code>-</code> means Fail. The email should be marked as spam.</li>
</ul>
<p>I have been using <code>~all</code> for a long time and I&rsquo;ve also been watching how many emails are being sent <strong>on my behalf</strong> using DMARC. Postmarkapp has <a href="https://postmarkapp.com/support/article/892-what-is-dmarc">a nice introduction to DMARC</a> and they offer a free weekly digest for your domain&rsquo;s DMARC.</p>
<h2 id="solution">Solution<a href="#solution" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>You may have multiple domains with multiple email addresses. However, as with me, you may have only one primary email address with your primary domain. In that case, I strongly recommend to use <code>-all</code> as qualifier that basically marks every email from every unknown IP as spam.</p>
<p>Update on May 1, 2019: This domain&rsquo;s SPF records are officially switched to have <code>-all</code>, after a month of testing. Thanks.</p>
]]></content>
		</item>
		
		<item>
			<title>Mi Home Security Camera Review</title>
			<link>https://www.tinywp.com/posts/mi-mjsxj02cm-camera-review/</link>
			<pubDate>Tue, 15 Jan 2019 00:42:00 +0530</pubDate><author>Pothi Kalimuthu</author><guid>https://www.tinywp.com/posts/mi-mjsxj02cm-camera-review/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<p>In one line&hellip; Xiaomi Mi 360° 1080p Home Security Camera (MJSXJ02CM) is ideal for monitoring, but lacks essential features as a security camera. Some people in <a href="https://www.amazon.in/gp/customer-reviews/R3UONEK0PLA01H/ref=cm_cr_arp_d_rvw_ttl?ie=UTF8&amp;ASIN=B07HJD1KH4">Amazon</a> and <a href="https://www.flipkart.com/reviews/5b28cbdb-7bc2-4d46-9f61-21068df0c91d">Flipkart</a> found my reviews helpful. So, I thought of writing this extended review as re-submitting my reviews take times to reflect on those sites.</p>
<h2 id="as-a-monitoring-device">As a monitoring device<a href="#as-a-monitoring-device" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>Let&rsquo;s talk about monitoring features:</p>
<ul>
<li>It has live feed</li>
<li>It has 360 degree view that can be adjusted manually.</li>
<li>The software can alert you by sending push notifications to your phone/s.</li>
<li>Allows two-way communication.</li>
</ul>
<p>If you left your grandparents or a (sleeping) child at home, you can monitor them from anywhere in the world. You get notified whenever there is a moment in the watched area. The camera doesn&rsquo;t rotate according to the movement of objects, though. Neither, it is compatible with Google Assistant or Alexa. However, there are other cameras from Xiaomi that are compatible with those. But, those cameras are not released in India. Overall, it is perfect as a monitoring tool.</p>
<h2 id="as-a-security-camera">As a security camera<a href="#as-a-security-camera" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>Anyway, as a security camera, this camera doesn&rsquo;t have some essential features. Time is <strong>the</strong> crucial factor for a security camera.</p>
<p>You&rsquo;d want to be notified within a few seconds of any intrusion by email or via the app (push notification). Whenever there is an intrusion, this camera does the following actions&hellip;</p>
<ul>
<li>it takes a 10-second video clip (to upload to cloud storage where the consumer has no control).</li>
<li>the camera continues to record a 1-minute video in the Micro SD card.</li>
<li>the 10-second video clip is encrypted and uploaded to the cloud storage.</li>
<li>the 1-minute video clip is ready to be stored in the Micro SD card, but not actually stored immediately. It is kept somewhere in memory and would be written to the Micro SD card only when the next 1-minute video is fully ready or when there is no more activity for the next 5 to several minutes.</li>
<li>in the next 2 to several minutes, the software sends the push notification via its own app (Mi Home).</li>
<li>the NAS storage can be set to &ldquo;live&rdquo; mode under &ldquo;Time interval between uploads&rdquo; (from Micro SD card to NAS storage). Since, it takes at least 2 minutes for the 1-minute video clip to arrive to Micro SD card, it takes the same amount of time (or more) for the 1-minute video clip to reach NAS storage as well.</li>
<li>on average, it takes approximately 2 to 5 minutes for the 1-minute video to reach Micro SD card and NAS storage.</li>
</ul>
<p>If the burglar breaks the camera <em>at first sight</em>, within 2 to 5 minutes, then you wouldn&rsquo;t get any notification at all. Burglars are usually quick to get their job done. They don&rsquo;t waste a second, when at work.</p>
<p><img src="https://www.tinywp.in/wp-content/uploads/2019/01/Screenshot_20190114-102137.png" alt="NAS storage settings in Xiaomi Mi Home Security Camera" title="NAS storage settings in Xiaomi Mi Home Security Camera"></p>
<p>Apart from this huge delay, this camera can only be used indoor. You may still use it outdoor, if it is well protected from rain.</p>
<h3 id="general-review-and-recommendations">General Review and Recommendations<a href="#general-review-and-recommendations" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p><strong>Price</strong>: If you still want to choose this camera due to its price point, remember that you&rsquo;d need a quality Micro SD card of &ldquo;Class 10&rdquo; or above. If you don&rsquo;t understand the &ldquo;Class&rdquo; in Micro SD card, I recommend to search for &ldquo;high endurance&rdquo; Micro SD card or Micro SD card for &ldquo;video surveillance&rdquo;. A good &ldquo;Class 10&rdquo; card can cost at least 1k. On top of that, you&rsquo;d need 24x7 electricity and 24x7 internet connectivity with a good upload bandwidth (to upload the 10-second clip to the cloud storage). Even if you have a giga-bit internet at home, this camera can only be connected via wi-fi in 2.4 Ghz band. So, if your router is far from the camera, you get less bandwidth to upload. If you add NAS storage to the mix, you&rsquo;d need even more upload bandwidth between the camera and the router. The cost of the overall setup also increases with NAS. It is better to use your home PC with a dedicated drive for NAS storage instead of buying a dedicated NAS server. Each comes with a cost. If you don&rsquo;t mind the cost, you shouldn&rsquo;t pick up this device already. Go for Amcrest if you need a proper security camera that has ethernet connectivity, immediate email alert, etc.</p>
<p><strong>Software Support (Mi Home app)</strong>: The software (Mi Home app) requires almost all the permissions from your phone. I was able to remove all except location, storage and phone, manually. What&rsquo;s more. You&rsquo;d get ads on the home screen of the app since version 5.4.43 (released on Dec 26, 2018). I wish Xiaomi released a dedicated app for all cameras, like other companies have done. Even if you are a fan of Xiaomi, you&rsquo;d find annoying bugs. For example, the Micro SD storage doesn&rsquo;t delete its content on its own when it becomes full. What&rsquo;s more&hellip; you wouldn&rsquo;t even get any notification about being full. The camera would simply stop recording any more videos. This a show-stopper for me as a security camera. Why would you want to keep an eye on storage space, when you have a lot of other priorities?! Anyway, this issue is likely a software bug and can possibly fixed with an update. The camera also hangs when there is a conflicting settings or when there is not enough bandwidth between the camera and the router. You can restart the camera (remotely), to bring it back online to see the live feed. If you choose the default settings, you are safe to go.</p>
<p><strong>Sharing</strong>: If you&rsquo;d like to share a video, you can share via Facebook. No other ways to share the videos, unless you have a NAS server. With NAS server, you are in full control of a video. It is possible to share the entire camera with someone else in the family, though. The other person needs to download Mi Home app, register in it and then you can share the entire camera using the registered email address. You&rsquo;d be giving almost all the controls of the camera, including the ability to disconnect the camera from the Mi Home app.</p>
<p><strong>Live Feed</strong>: You can see the live feed via mobile. But, can not see the feed via desktop or via laptop. So, if you use multiple cameras and if you have a security to monitor all the camera, it can be done only via mobile that is not as convenient as a desktop with a large screen.</p>
<p>Overall, I recommend it as a monitoring device. However, as a security device, I wouldn&rsquo;t recommend it. If you are looking for a security camera, go with Amcrest or something else.</p>
<p>Be safe!</p>
]]></content>
		</item>
		
		<item>
			<title>Fighting malware on BSNL broadband network</title>
			<link>https://www.tinywp.com/posts/fighting-bsnl-malware/</link>
			<pubDate>Wed, 01 Aug 2018 21:42:00 +0530</pubDate><author>Pothi Kalimuthu</author><guid>https://www.tinywp.com/posts/fighting-bsnl-malware/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<p>BSNL broadband users have been seeing a malicious pop-up upon clicking anywhere on a page that is unsecured. A popular example of unsecured site / page is <a href="https://www.bsnl.co.in">www.bsnl.co.in</a> itself. Secured sites have the URL in the form of <code>https://</code>. Unsecured sites have the URL in the form of <code>http://</code>. Can you see the missing <code>s</code>?! Anyway, the pop-up redirects the browser to malicious sites that in turn may be doing some unwanted things on your browser and computer. I&rsquo;ve come across this issue in the last week of June 2018 and immediately started to dig further into it.</p>
<h2 id="cleaning-up-the-computer">Cleaning up the computer<a href="#cleaning-up-the-computer" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>I always use original software. Never used pirated software or OS. I&rsquo;ve bought Windows XP, Windows 8.1 (that had a free upgrade to Windows 10) and Office 97. Currently, I use a mac, though. Everything is updated to the latest version including OS and browsers.</p>
<p>My first assumption was that my mac may have been affected by a virus. I don&rsquo;t visit unwanted sites (intentionally). I don&rsquo;t watch porn sites, either. Anyhow, I tried to use <a href="https://etrecheck.com/">EtreCheck</a> (free version is limited in functionality) to find the culprit. But, it didn&rsquo;t find anything concrete. So, I went on and tried to use another popular free scanner from Apple Store, named <a href="https://www.bitdefender.com/solutions/antivirus-for-mac.html">Bitdefender</a>. After a few hours, it didn&rsquo;t find anything, either.</p>
<h2 id="spending-money-to-fight-a-virus">Spending money to fight a virus!<a href="#spending-money-to-fight-a-virus" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>I had an old Belkin router bought approximately 8 years ago. I thought it could&rsquo;ve been affected as it hasn&rsquo;t had an update since its launch. So, I bought a new router-cum-modem from Netgear that seems to offer frequent firewall updates than some popular Chinese brands. The router reached home in a couple of days (thanks to Amazon Prime membership). I switched the routers. The malware hasn&rsquo;t gone yet!!!</p>
<h2 id="getting-mad-at-dns">Getting mad at DNS<a href="#getting-mad-at-dns" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>I searched the internet for possible solutions. Most of them recommended switching the DNS. I run my own DNS server using <a href="https://pi-hole.net/">pi-hole.net</a>. It blocks most advertisers including Google ads. I tried switching to it. I didn&rsquo;t help. I tried <a href="https://www.quad9.net/">Quad9</a>, <a href="https://blog.cloudflare.com/announcing-1111/">Cloudflare</a> and of course the most popular <a href="https://developers.google.com/speed/public-dns/">Google public DNS</a>. None of them helped.</p>
<h2 id="going-public">Going Public<a href="#going-public" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>I felt ashamed that I deal with multiple critical servers around the world, yet, I could not find any particular pattern on this malware. But, finally, I decided to forgo my ego and started asking for help. Initially, I asked my friend who confirmed that I am not alone, but his issue was resolved after resetting the modem!!! Then, I created <a href="https://broadbandforum.co/threads/169151/">a thread in broadbandforum.co</a> where I put forth aforementioned thoughts. Help started to pour in and I was able to get an idea about where the issue is.</p>
<h2 id="understanding-the-problem">Understanding the problem<a href="#understanding-the-problem" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>The problem is somewhere in the BSNL broadband hub. It affects all users, at random, at different time of the day. It doesn&rsquo;t get activated on all unsecured pages. The malware is still inserted into every unsecured page via javascript, though. There are plenty of people who went further on this and put forth their disappointment in the social media. Some even cancelled their connection just because of this malware.</p>
<h2 id="pi-holenet-to-the-rescue">Pi-hole.net to the rescue<a href="#pi-holenet-to-the-rescue" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>There is a saying in the security world&hellip; if we know the username, half of the work is done towards getting the password (of an application, etc). So, understanding the issue helps us to circumvent the issue. Since, the malware is getting injected through a BSNL hub where we don&rsquo;t have any control, we have a find a way to fight it out using the tools we have.</p>
<p>For me, it was <a href="https://pi-hole.net">pi-hole.net</a> that helped me to blacklist those malicious domains into a block-hole! So, when my wife visits an unsecured site, and if she clicks, the pop-up does happen. But, it never completes. It&rsquo;d simply say &ldquo;domain is not hosted here&rdquo; message. The message could be easily customised to something else, though!</p>
<h2 id="psa-public-service-announcement">PSA (Public Service Announcement)<a href="#psa-public-service-announcement" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>Since, I always like to give back to the community (that helped me to understand the issue), my pi-hole.net DNS is open to anyone on the BSNL broadband network. Unfortunately, it isn&rsquo;t available for other users, yet. It takes a lot of effort, time and money to maintain a DNS server of our own. So, sorry to others.</p>
<p>So, here we go. My DNS server IP is&hellip; <code>45.76.184.155</code>.</p>
<p>Put it as your DNS resolver and let me know, if it really helped you to have a safe browsing. Apart from blocking those malicious domains, it can also block a number of advertisers (including Google ads). So, you can stop using your favourite ad-blocker, if you use pi-hole.net DNS.</p>
<p>Only last month, I wrote a detailed post on <a href="https://www.tinywp.com/pi-hole/">how my pi-hole.net works</a>. If you&rsquo;d like to know the technical details behind it, I highly recommend to give it a read.</p>
<p>If you have any questions, please do not hesitate to write in the comments below!</p>
]]></content>
		</item>
		
		<item>
			<title>My pi-hole.net setup</title>
			<link>https://www.tinywp.com/posts/pi-hole/</link>
			<pubDate>Wed, 11 Jul 2018 17:23:00 +0530</pubDate><author>Pothi Kalimuthu</author><guid>https://www.tinywp.com/posts/pi-hole/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<p><a href="https://pi-hole.net">Pi-hole.net</a> is a self-hosted DNS service that you can install on your own machine (such as in a USD5 per month VPS) and let us create a black hole for internet advertisers. While there are other free DNS services available on the internet, such as Google DNS, Cloudflare, Quad9, none of them offer us a way to block particular domains (such as google-analytics.com). Pi-hole.net (shortly pi-hole) itself depends on Google DNS, Cloudflare or Quad9 to upstream its DNS requests. I am not going to write about the benefits of using pi-hole, since that information is already available and is covered by a lot more people who have adapted pi-hole much earlier than me.</p>
<p>I am going to write a bit about how I run pi-hole on my VPS that hosts other sites too. While, it takes only a single-line of code to isntall it (<code>curl -sSL https://install.pi-hole.net | bash</code>), I have set it up in a particular way, such as running it behind Nginx (along with other sites), administrating it using a non-existing domain name(!), SSL for that domain(!!) and a few more. Let&rsquo;s dive into my setup.</p>
<h1 id="nginx">Nginx<a href="#nginx" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h1>
<p>Pi-hole is meant to be run on its own tiny server, probably in a raspberry pi server. But, it doesn&rsquo;t prevent you to run along with other sites in a VPS. I put it alongside other sites in my Vultr VPS.</p>
<p>Pi-hole is a complete package. It installs a DNS server, HTTP web server (lighttpd), firewall, setup upstream DNS server, etc. Except for the HTTP server (that is <a href="https://www.lighttpd.net/">lighttpd</a>), other services wouldn&rsquo;t create conflict. The web server is used to administer pi-hole via server IP. The HTTP web server (tries to) take over port 80. Since, my VPS already has a web server (Nginx) running on port 80, lighttpd server would never take over port 80. So, we can&rsquo;t use a URL to manage pi-hole?! No, we can. The solution is to keep lighttpd running on an alternate port (such as 88) and let Nginx proxy all requests to pi-hole to that port.</p>
<p>Here&rsquo;s the complete config for clarity&hellip;</p>
<pre tabindex="0"><code>server {
    listen 80;
    listen [::]:80;
    server_name pi.hole;
    return https://$host$request_uri;
}
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name pi.hole;

    ssl_certificate &#39;ssl/pi.hole.crt&#39;;
    ssl_certificate_key &#39;ssl/pi.hole.key&#39;;

    location / {
        proxy_pass http://localhost:8888;
        include proxy.conf;
    }

    # let&#39;s go directly to the login page
    location = / {
        return $scheme://$host/admin/index.php?login;
    }
}
</code></pre><p>The <code>proxy.conf</code> file contains the following lines&hellip;</p>
<pre tabindex="0"><code>proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
</code></pre><p>So, we solved one issue now. We installed pi-hole in a VPS that hosts other sites using a different web server (Nginx). This could be easily migrated to Apache or another web server.</p>
<h1 id="non-existing-domain">Non-existing Domain!<a href="#non-existing-domain" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h1>
<p>When using the defaults, pi-hole installs lighttpd and the admin dashboard for pi-hole can be accessed using the IP of the server, such as <code>http://192.168.0.1/admin/</code> (this is a local IP, though). Since, internet is full of bad bots, anyone can get to this link easily. In order to access it via a domain, we only need to point the domain such as <code>pi.example.com</code> to the IP of the server. The rest of the things are taken care by the web server. We still do not want anyone to have the data of the site, if they came across the URL <code>pi.example.com</code> somehow. Pi-hole displays some data for non-logged-in users too. Just minimal data&hellip; total queries, queries blocked, etc. When logged-in, we can see much more useful information and we would get the ability to fine-tune the whole pi-hole setup.</p>
<p>As you may have noticed from the Nginx config line has <code>pi.hole</code> as the <code>server_name</code>. Pi-hole, when being installed, points <code>pi.hole</code> to the server itself. But, if we need to access pi-hole (or <code>https://pi.hole</code> site) even if we do not use pi-hole for DNS, we could edit our own machine&rsquo;s hosts file to have this domain pointed to the server where pi-hole is installed. Accessing pi-hole using this non-existing domain could be considered as an improvement to the security too. Remember that we can use any non-existing domain in this way. Not just <code>https://pi.hole</code>.</p>
<h1 id="ssl">SSL!!!<a href="#ssl" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h1>
<p>SSL part is actually very easy (for me). I already run on my own SSL CA for developing sites under the extension <code>.dev</code> (for example, <code>example.dev</code>). I also have a script that generates SSL for these local domains (or for any domain to be precise). How to run your own SSL CA and how to automate the generation of SSL is for another post, though. The point is that you can secure the connection between your browser and pi-hole admin backend, if you run your own SSL CA.</p>
<h2 id="other-tweaks">Other Tweaks:<a href="#other-tweaks" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>There are other small tweaks are done in my pi-hole configuration. As you may have noticed from the Nginx configuration above, whenever I visit <code>https://pi.hole</code>, it redirects to <code>https://pi.hole/admin/index.php?login</code> which is the login page for pi-hole admin dashboard. So, I save a click using a simple redirect in Nginx.</p>
<p>Do you have any tips and tricks for your pi-hole setup? Please share it in the comments!</p>
]]></content>
		</item>
		
		<item>
			<title>Jekyll on macOS using MacPorts</title>
			<link>https://www.tinywp.com/posts/jekyll-on-mac-using-mac-ports/</link>
			<pubDate>Tue, 24 Oct 2017 12:53:00 +0530</pubDate><author>Pothi Kalimuthu</author><guid>https://www.tinywp.com/posts/jekyll-on-mac-using-mac-ports/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<p>Jekyll grows fast. Keeping it updated to the latest version is easy, if we keep every dependency to the latest version too, starting with ruby! The previous article on installing Jekyll on mac Sierra is too old to be used now. Also, it used the ruby version comes by default in macOS. That&rsquo;s usually an older version. In order to get the latest version of ruby (or anything), there are paths available. I personally like <a href="https://www.macports.org/">macports</a>. So, let&rsquo;s get started.</p>
<h2 id="macports">macports<a href="#macports" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>Make sure you have macports already installed. If you don&rsquo;t have it yet, see the <a href="https://www.macports.org/install.php">quick start guide on macports</a>. Basically, you&rsquo;d need xcode commandline tools (<code>xcode-select --install</code>) and then select the appropriate macports package to install depending on your macOS version. Once installed, verify it using the command&hellip; <code>port version</code>.</p>
<h2 id="ruby">ruby<a href="#ruby" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>The current version of Ruby (as of this writing) is 2.4.x. It can be installed using the command&hellip; <code>sudo port install ruby24</code>. This will install ruby2.4 and gem2.4 binaries at /opt/local/bin. Let&rsquo;s create symlinks to override the default ruby and gem (comes bundled with macOS).</p>
<pre tabindex="0"><code>sudo ln -s /opt/local/bin/ruby2.4 /opt/local/bin/ruby
sudo ln -s /opt/local/bin/gem2.4 /opt/local/bin/gem
</code></pre><h2 id="bundler">bundler<a href="#bundler" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p><a href="http://bundler.io/">Bundler</a> is an easy way to pack gems for a Ruby project. You may install bundler using the command <code>gem install bundler</code>. You are likely to receive the error related to the permissions. Because, by default, gem tries to install globally. You may force gem to install its gems only to the local user by setting up the environment variable <code>GEM_HOME</code> to a local directory such as <code>~/.gem</code> or <code>~/gem</code>. I prefer the former.</p>
<h2 id="jekyll">jekyll<a href="#jekyll" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>Finally, it&rsquo;s time to install Jekyll.</p>
<pre tabindex="0"><code>gem install jekyll
cd ~/tmp
jekyll new my-awesome-site
jekyll serve
</code></pre><h2 id="video">video<a href="#video" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>(coming soon) If you are a fan of learning through videos, here&rsquo;s the video that covers most steps.</p>
]]></content>
		</item>
		
		<item>
			<title>One-way Backups</title>
			<link>https://www.tinywp.com/posts/write-only-backups-in-s3/</link>
			<pubDate>Mon, 18 Sep 2017 13:21:23 +0530</pubDate><author>Pothi Kalimuthu</author><guid>https://www.tinywp.com/posts/write-only-backups-in-s3/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<p>Taking backup is important. How we take backups is even more important. I use AWS S3 for most of my backups, not just because of its cost, but because of its ability to fine-tune your backup strategies. For example, for my other site <a href="https://www.tinywp.in/">tinywp.in</a> that is running on Google Compute Platform, I take regular backups using my own <a href="https://github.com/pothi/backup-wordpress">backup scripts</a>. There <em>was</em> one potential issue in it. If the bad guy (or girl) breaks into my servers, all my data would be gone. He / she can even delete all my data in offsite location (S3). Right? No, not with AWS IAM and some fine-tuned strategy. Let&rsquo;s dive a little deeper.</p>
<h2 id="how-does-amazon-web-services-work">How Does Amazon Web Services Work<a href="#how-does-amazon-web-services-work" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>You usually log into Amazon using your own credentials&hellip; email address (or phone number) and a password. Possibly with a two-factor authentication. This would work, if we need to put files manually in an S3 bucket. However, we&rsquo;d want to automate the process of taking backups of our site and then <strong>put</strong> it in Amazon S3. To do this, AWS (Amazon Web Services) has a nice utility called AWS IAM (Identity and Access Management). Here, you can create users (or groups of users) who can programmatically access S3 buckets. In general, most people would create a user named &lsquo;backup&rsquo; and allow this user act as <a href="https://console.aws.amazon.com/iam/home?region=us-east-1#/policies/arn:aws:iam::aws:policy/AmazonS3FullAccess$serviceLevelSummary">AmazonS3FullAccess</a> that provides full access to <em>all</em> buckets associated with your account. It simply means&hellip; anyone who has got access to the access keys for this &lsquo;backup&rsquo; user would be able to wipe out all the data. Not an ideal situation that you&rsquo;d want to deal with! Consider taking backups of your clients&rsquo; data!</p>
<h2 id="whats-the-solution">What&rsquo;s the solution?<a href="#whats-the-solution" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>Use the principle of least privilege when granting access.</p>
<p>AWS IAM is so flexible that it allows the user to be attached to a particular policy. For example, what if someone can only <strong>put</strong> some data into our buckets, but can never actually read it!!! Yes, it is possible to allow write access to a particular S3 bucket and disallow any read access to the same bucket.</p>
<h2 id="what-if-i-want-to-delete-older-backups-automatically">What if I want to delete older backups automatically?<a href="#what-if-i-want-to-delete-older-backups-automatically" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>Use a <a href="http://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-lifecycle.html">lifecycle policy</a>.</p>
<h2 id="i-dont-use-amazon-s3-i-use-xyz-how-do-i-do-this">I don&rsquo;t use Amazon S3. I use xyz. How do I do this?<a href="#i-dont-use-amazon-s3-i-use-xyz-how-do-i-do-this" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>Check the manual. For example, Google Cloud Storage supports a role named <a href="https://cloud.google.com/storage/docs/access-control/iam-roles">roles/storage.objectCreator</a> that can create new objects, but is forbidden to view, delete or overwrite objects!</p>
<p>Got any questions. Feel free to ask in the comment section below!</p>
]]></content>
		</item>
		
		<item>
			<title>Solutions for BSNL Broadband without port 22</title>
			<link>https://www.tinywp.com/posts/bsnl-broadband-port-22-blocked/</link>
			<pubDate>Wed, 02 Aug 2017 16:21:23 +0530</pubDate><author>Pothi Kalimuthu</author><guid>https://www.tinywp.com/posts/bsnl-broadband-port-22-blocked/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<p>If you are a BSNL broadband user and you work as a web developer or system admin, you may want to connect to your client sites and servers using port 22. Since, August 1, 2017, BSNL has blocked / banned port 22 on its network. It&rsquo;s not clear if it is temporary or permanent. Recently, <a href="http://www.thehindu.com/news/national/karnataka/malware-affects-thousands-of-bsnl-broadband-modems/article19381410.ece">thousands of BSNL broadband modems were affected by malware</a>. Those affected modems may be spreading the malware on their own using port 22. If this is so, it is recommended to block port 22 temporarily. That&rsquo;s why BSNL has only banned port 22 only on their broadband network. BSNL mobile network isn&rsquo;t affected. None of the other ISPs blocked port 22, either. What&rsquo;s worse is BSNL broadband hasn&rsquo;t informed its users of this policy change.</p>
<p>Anyway, let&rsquo;s talk about the alternatives or solutions to continue to use BSNL broadband irrespective of its ban over port 22.</p>
<h2 id="github-users">Github Users<a href="#github-users" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>It&rsquo;s easy to solve it by <a href="https://help.github.com/articles/using-ssh-over-the-https-port/">running SSH over HTTPS</a> that is allowed by Github.</p>
<h2 id="web-developers">Web developers<a href="#web-developers" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>Web developers usually do not have access to the server. One solution is to ask your server administrator to open an additional port. There are plenty of <a href="https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers">unused ports</a> available. My favorites are 420 and 24. :)</p>
<h2 id="system-administrators">System Administrators<a href="#system-administrators" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<p>There are plenty of workarounds available for system admins. As mentioned above, opening additional port is easiest to achieve, considering it helps the web developers your client may have.</p>
<h2 id="paid-solutions">Paid Solutions<a href="#paid-solutions" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<h3 id="static-ip">Static IP<a href="#static-ip" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>Thanks to <a href="http://www.elawrence.in/">Lawrence</a> who provided this information via comments.</p>
<p>BSNL unblocks port 22 if the BB user opt for static IP that costs Rs.2000 (or Rs.1800 on certain high-end plans). Static IP is available only on plans that are above 1k. As of this writing, the least feasible plan to get static IP is BBG Combo ULD 1199.</p>
<h3 id="paid-vpn">Paid VPN<a href="#paid-vpn" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>If you don&rsquo;t mind spending additional money, buy a VPN service. It is the easiest way to get around the present situation with BSNL. Btw, are you aware that <a href="http://www.zdnet.com/article/apple-pulls-vpns-from-china-app-store/">Apple pulled down VPN apps from its China Apps Store</a>. And then, <a href="http://www.zdnet.com/article/nsa-whistleblower-snowden-vpn-ban-makes-russia-less-safe-and-less-free/">Russia banned VPN</a>. So, if port 22 can be banned by an ISP now, anything can happen in India in the future!</p>
<p>I haven&rsquo;t covered all use-cases. For example, most (managed) hosts do not open additional port for SSH / SFTP. There are workaround available for such users too. However, it isn&rsquo;t easy, especially who have never used SSH. In general, if you know how to use SSH, then buy a small server (VPS servers are available as low as USD2.5 per month) and then <a href="https://www.cyberciti.biz/faq/linux-unix-ssh-proxycommand-passing-through-one-host-gateway-server/">use that server as an intermediate server</a> to connect to all others sites / servers. If nothing works, use a <a href="https://hide.me/">free VPN</a>. Good luck!</p>
]]></content>
		</item>
		
		<item>
			<title>Installing PhpMyAdmin with Nginx</title>
			<link>https://www.tinywp.com/posts/using-default-phpmyadmin-package-deb/</link>
			<pubDate>Sat, 18 Mar 2017 18:31:23 +0530</pubDate><author>Pothi Kalimuthu</author><guid>https://www.tinywp.com/posts/using-default-phpmyadmin-package-deb/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<h1 id="installing-phpmyadmin-with-nginx">Installing PhpMyAdmin with Nginx<a href="#installing-phpmyadmin-with-nginx" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h1>
<p>While installing the default PhpMyAdmin package with Debian (or with any of its derivatives including Ubuntu), you&rsquo;ll be asked to choose the web server (between Apache and Lighttd). If you are going to use only Nginx, then you may just skip that step. The actual process of setting up a perfect PhpMyAdmin install on Nginx is bit tricky, but achieveable. You are already on your way (didn&rsquo;t you skip the prompt to choose the web server?).</p>
<p>Now, it is time to setup the actual vhost entry for PhpMyAdmin. The example vhost entries for Apache and Lighttd are provided at <code>/etc/phpmyadmin</code> . If you look at those example configuration, the basic idea is simple&hellip;</p>
<ul>
<li>the root of the PhpMyAdmin is at <code>/usr/share/phpmyadmin</code></li>
<li>we need to restrict access to <code>setup</code> sub-directory</li>
</ul>
<p>With this in mind, let&rsquo;s start creating our vhost entry&hellip;</p>
<pre tabindex="0"><code>server {
    server_name phpmyadmin.example.com;
    root /usr/share/phpmyadmin;

    # config to process PHP

    location /setup { return 403; }
    locaton / {
        try_files $uri $uri/ index.php$is_args$args;
    }
}
</code></pre><p>It can&rsquo;t get simpler than this. Can it?</p>
<p>Now, if you visit <code>phpmyadmin.example.com</code>, you&rsquo;ll able to login. But, will be presented with two errors. Let&rsquo;s fix one by one.</p>
<blockquote>
<p>The phpMyAdmin configuration storage is not completely configured, some extended features have been deactivated. To find out why click here.</p></blockquote>
<p>This happens because the php process doesn&rsquo;t have read access to <code>/etc/phpmyadmin/config-db.php</code>. Here comes ACL to the rescue&hellip;</p>
<pre tabindex="0"><code>root# ls -ld /etc/phpmyadmin/config-db.php
-rw-r----- 1 root www-data 549 Mar 18 11:47 config-db.php

root# setfacl -m &#39;phpuser:r--&#39; /etc/phpmyadmin/config-db.php
root# ls -ld /etc/phpmyadmin/config-db.php
-rw-r-----+ 1 root www-data 549 Mar 18 11:47 /etc/phpmyadmin/config-db.php
root# getfacl /etc/phpmyadmin/config-db.php
getfacl: Removing leading &#39;/&#39; from absolute path names
# file: etc/phpmyadmin/config-db.php
# owner: root
# group: www-data
user::rw-
user:phpuser:r--
group::r--
mask::r--
other::---
</code></pre><p>In the above example, <code>phpuser</code> is the username underwhich PHP runs. If you care about the security, it shouldn&rsquo;t run as www-data!</p>
<p>Now, we still have one more issue to solve&hellip;</p>
<blockquote>
<p>The configuration file now needs a secret passphrase (blowfish_secret).</p></blockquote>
<p>This happens because the php process doesn&rsquo;t have read access to <code>/var/lib/phpmyadmin/blowfish_secret.inc.php</code>. Let&rsquo;s use ACL again to fix it&hellip;</p>
<pre tabindex="0"><code>root# ls -ld /var/lib/phpmyadmin/blowfish_secret.inc.php
-rw-r----- 1 root www-data 60 Mar 18 11:47 /var/lib/phpmyadmin/blowfish_secret.inc.php

root# setfacl -m &#39;phpuser:r--&#39; /var/lib/phpmyadmin/blowfish_secret.inc.php
root# ls -ld /var/lib/phpmyadmin/blowfish_secret.inc.php
root# getfacl /var/lib/phpmyadmin/blowfish_secret.inc.php
getfacl: Removing leading &#39;/&#39; from absolute path names
# file: var/lib/phpmyadmin/blowfish_secret.inc.php
# owner: root
# group: www-data
user::rw-
user:phpuser:r--
group::r--
mask::r--
other::---
</code></pre><p>Now, reload PhpMyAdmin to see the changes. You wouldn&rsquo;t see any more errors upon logging into PhpMyAdmin. Happy coding!</p>
]]></content>
		</item>
		
		<item>
			<title>Web Performance Checklist</title>
			<link>https://www.tinywp.com/posts/web-per-checklist/</link>
			<pubDate>Fri, 17 Feb 2017 16:00:00 +0530</pubDate><author>Pothi Kalimuthu</author><guid>https://www.tinywp.com/posts/web-per-checklist/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<p>I use some perf checklists whenever I review a site. Here&rsquo;s the incomplete list.</p>
<p>Inspired by / forked from <a href="https://github.com/dhilipsiva/webapp-checklist#performance">Dilip Siva&rsquo;s perf checklist</a> and <a href="https://www.ampproject.org">AMP project</a>!.</p>
<h1 id="web-performance-checklist">Web Performance Checklist<a href="#web-performance-checklist" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h1>
<ul>
<li>Prefer Brotli over gzip / deflate.</li>
<li>Check caching-headers for all static content (css, js, images, fonts, icons, etc).</li>
<li>Avoid free DNS from your DNS registrar (there are exceptions, of course).</li>
<li>Try hosting your whole site in a CDN.</li>
<li>Reduce the number of DOM elements.</li>
</ul>
<h2 id="javascript">JavaScript<a href="#javascript" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<ul>
<li>Use a single resource for loading external JavaScript.</li>
</ul>
<h2 id="css">CSS<a href="#css" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<ul>
<li>Inline critical CSS.</li>
<li>Use a single resource for (non-critical) CSS loading.</li>
<li>Only use <a href="https://www.ampproject.org/docs/guides/responsive/style_pages#restricted-styles">GPU-accelerated properties</a>.</li>
</ul>
<h2 id="images-checklist">Images checklist<a href="#images-checklist" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<ul>
<li>Prefer WebP for images over PNG / Jpeg.</li>
<li>Use a CDN for image-heavy sites.</li>
<li>Serve small images for mobile users.</li>
</ul>
<h2 id="fonts-checklist">Fonts checklist<a href="#fonts-checklist" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h2>
<ul>
<li>Do not use more than 2 external fonts (unless really really necessary on special circumstances).</li>
<li>Load fonts asynchronously.</li>
<li>Have plan B if the internet speed is too low!</li>
</ul>
]]></content>
		</item>
		
		<item>
			<title>Jekyll on Mac OS Sierra</title>
			<link>https://www.tinywp.com/posts/jekyll-on-mac-sierra/</link>
			<pubDate>Thu, 09 Feb 2017 23:31:23 +0530</pubDate><author>Pothi Kalimuthu</author><guid>https://www.tinywp.com/posts/jekyll-on-mac-sierra/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<p><strong>Update (Oct 24, 2017)</strong>: A new <a href="/jekyll-on-mac-using-mac-ports">simpler way to install Jekyll using MacPorts is available</a>. So, the following article (written in Feb 2017) is outdated and may not work now!</p>
<p><a href="http://jekyllrb.com" target="_blank">Jekyll</a> is one of the oldest static site generators and is <em>the</em> most famous SSG (short for Static Site Generator) of all. It considers itself as &ldquo;blog-aware&rdquo;. Every other SSG software now includes a way to bring blog functionality in its core, though. It is based on Ruby. MacOS Sierra already has it at version 2.0.0p648. So, installing Jekyll should be straight-forward. But, it isn&rsquo;t. The tutorials around the internet may usually contain how to install it using brew. There&rsquo;s nothing wrong with it. But, when there is a way to install it without brew or any other third-party tool, we will have a clean system. So, let&rsquo;s dive in.</p>
<h3 id="local-install">Local install<a href="#local-install" class="anchor" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
      stroke-linecap="round" stroke-linejoin="round" class="feather">
      <path d="M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3"></path>
      <line x1="8" y1="12" x2="16" y2="12"></line>
   </svg></a></h3>
<p>There are two ways to install most common packages that are requirements for Jekyll. Installing them locally or installing them globally for all users. Since, I use MacOS alone (how many of you share your laptop with others?), I don&rsquo;t want to install anything globally. Also, installing locally, I can distinguish between the gems installed by MacOS and gems installed by me.</p>
<p>Let&rsquo;s have a ~/gem directory to hold everything related to RubyGems. Also, let&rsquo;s have all the executables in ~/gem/bin and update the $PATH environment value. So, if you prefer another path such as ~/.gem, feel free to change it accordingly&hellip;</p>
<p><strong>For the default bash shell:</strong></p>
<pre><code>$ mkdir -p ~/gem/bin
$ echo 'export GEM_HOME=~/gem' &gt;&gt; ~/.bash_profile
$ source ~/.bash_profile
$ echo 'gem: --user-install -n~/gem/bin --no-document' &gt;&gt; ~/.gemrc
</code></pre>
<p><strong>For fish shell:</strong></p>
<pre><code>$ mkdir -p ~/gem/bin
$ echo 'set GEM_HOME ~/gem' &gt;&gt; ~/.config/fish/config.fish
$ source ~/.config/fish/config.fish
$ echo 'gem: --user-install -n~/gem/bin --no-document' &gt;&gt; ~/.gemrc
</code></pre>
<p>A little explanation:</p>
<p><code><sub>/.bash_profile</code>(<code></sub>/.config/fish/config.fish</code> in case of <a href="http://fishshell.com" target="_blank">Fish shell</a>) is the file that is used by the default bash shell in macOS to store and load the configuration settings for the terminal/s.</p>
<p><code>~/.gemrc</code> is the file parsed by gem for custom configurations. This is where we can instruct gem to use ~/gem/bin to keep the executables.</p>
<p>Now let&rsquo;s try to install bundle that is a dependancy for Jekyll.</p>
<pre><code>$ gem install bundle</code></pre>
<p>If things go smoothly without an error, we can proceed to install Jekyll&hellip;</p>
<pre><code>$ gem install jekyll</code></pre>
<p>Usually, this will go through too. If it didn&rsquo;t, please let me know the actual error in the comments, I will try to help you. Now, time to install a new site locally&hellip;</p>
<pre><code>
$ jekyll new my-awesome-site
Running bundle install in /Users/yourname/gem/my-awesome-site...


Your user account isn't allowed to install to the system RubyGems.
  You can cancel this installation and run:

      bundle install --path vendor/bundle

  to install the gems into ./vendor/bundle/, or you can enter your password
  and install the bundled gems to RubyGems using sudo.

  Password:
</code></pre>
<p>Possibly, the first road-block in our installation. But, easy to fix as mentioned in the output. Let&rsquo;s cancel the installation by pressing ctrl+c in the keyboard. This will throw a bunch of errors. Safe to ignore them.</p>
<pre><code>
$ cd my-awesome-site
$ bundle install --path vendor/bundle
</code></pre>
<p>The last command may take sometime to execute depending on the CPU and network speed. Hold on. It&rsquo;s worth the wait!</p>
<p>Let&rsquo;s try to serve the just-installed site&hellip;</p>
<pre><code>$ bundle exec jekyll serve
Configuration file: /Users/yourname/gem/my-awesome-site/_config.yml
Configuration file: /Users/yourname/gem/my-awesome-site/_config.yml
            Source: /Users/yourname/gem/my-awesome-site
       Destination: /Users/yourname/gem/my-awesome-site/_site
 Incremental build: disabled. Enable with --incremental
      Generating...
             ERROR: YOUR SITE COULD NOT BE BUILT:
                    ------------------------------------
                    Invalid date '&lt;%= Time.now.strftime('%Y-%m-%d %H:%M:%S %z') %&gt;': Document 'vendor/bundle/ruby/2.0.0/gems/jekyll-3.4.0/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb' does not have a valid date in the YAML front matter.
</code></pre>
<p>A quick search revealed <a href="https://github.com/jekyll/jekyll/issues/2938#issuecomment-131456094" target="_blank">two</a> <a href="https://github.com/jekyll/jekyll/issues/2938#issuecomment-249033221" target="_blank">reasons</a> and how to fix both&hellip;</p>
<pre><code>$ echo 'exclude:
- vendor/bundle' &gt;&gt; _config.yml
$ bundle exec jekyll serve
Configuration file: /Users/yourname/gem/my-awesome-site/_config.yml
Configuration file: /Users/yourname/gem/my-awesome-site/_config.yml
            Source: /Users/yourname/gem/my-awesome-site
       Destination: /Users/yourname/gem/my-awesome-site/_site
 Incremental build: disabled. Enable with --incremental
      Generating...
                    done in 0.611 seconds.
 Auto-regeneration: enabled for '/Users/yourname/gem/my-awesome-site'
Configuration file: /Users/yourname/gem/my-awesome-site/_config.yml
    Server address: http://127.0.0.1:4000/
  Server running... press ctrl-c to stop.
</code></pre>
<p>Visit http://127.0.0.1:4000/ and viola! You&rsquo;ll see the new Jekyll site in the browser.</p>
<img class="aligncenter size-full wp-image-1908" src="https://cdn.tinywp.com/wp-content/uploads/2017/02/Screen-Shot-2017-02-08-at-9.40.17-PM.jpg" alt="" width="781" height="542" srcset="https://cdn.tinywp.com/wp-content/uploads/2017/02/Screen-Shot-2017-02-08-at-9.40.17-PM.jpg 781w, https://cdn.tinywp.com/wp-content/uploads/2017/02/Screen-Shot-2017-02-08-at-9.40.17-PM-150x104.jpg 150w, https://cdn.tinywp.com/wp-content/uploads/2017/02/Screen-Shot-2017-02-08-at-9.40.17-PM-300x208.jpg 300w, https://cdn.tinywp.com/wp-content/uploads/2017/02/Screen-Shot-2017-02-08-at-9.40.17-PM-768x533.jpg 768w" sizes="(max-width: 706px) 89vw, (max-width: 767px) 82vw, 740px" />
<p>Update (2017-10-07): Included a way to configure the default bash shell for the local installation!</p>
]]></content>
		</item>
		
		<item>
			<title>About me</title>
			<link>https://www.tinywp.com/about/</link>
			<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>Pothi Kalimuthu</author><guid>https://www.tinywp.com/about/</guid>
			<description><![CDATA[&lt;no value&gt;]]></description><content type="text/html" mode="escaped"><![CDATA[<p>Name: Pothi Kalimuthu</p>
<p>Native of: Srivilliputhur, Tamil Nadu, India.</p>
<p>Lives in: Chatrapatti, Tamil Nadu, India</p>
<p>Hobby: Chess</p>
<p>Work: Wrangling servers and solving real-world problems!</p>
<p>You may know more <a href="https://www.tinywp.in/about/">about me at tinywp.in</a>.</p>
<p>Contact Email: <a href="mailto:pothi@protonmail.com">pothi@protonmail.com</a> (<em>no advertisement</em> inquiries please).</p>
]]></content>
		</item>
		
	</channel>
</rss>
