<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Failed Machine]]></title><description><![CDATA[Still downloading more RAM]]></description><link>https://failedmachine.com/</link><image><url>https://failedmachine.com/favicon.png</url><title>Failed Machine</title><link>https://failedmachine.com/</link></image><generator>Ghost 3.2</generator><lastBuildDate>Sat, 28 Mar 2026 17:18:44 GMT</lastBuildDate><atom:link href="https://failedmachine.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Being Lazy is Awesome]]></title><description><![CDATA[Recently, I started a new job working remotely and I'm realizing more than ever that constant communication is really annoying. If you like getting work done, like I do, you learn to appreciate inspired laziness as the positive character trait it can be.]]></description><link>https://failedmachine.com/being-lazy-is-awesome/</link><guid isPermaLink="false">5f0b161d6b0afe6e232dba73</guid><dc:creator><![CDATA[Amudhan Manivasagam]]></dc:creator><pubDate>Sun, 19 Jul 2020 20:52:22 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1511203466129-824e631920d7?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=2000&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1511203466129-824e631920d7?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=2000&fit=max&ixid=eyJhcHBfaWQiOjExNzczfQ" alt="Being Lazy is Awesome"><p>I have several email accounts and send/receive so much email that <a href="https://www.thunderbird.net/en-US/">Thunderbird</a> and Outlook are pretty much the only clients that don't crash on a regular basis.</p><p>Recently, I started a new job working remotely and I'm realizing more than ever that emails and IM's are starting to get <em>really annoying</em>.</p><blockquote>An email every few minutes and desktop alert + sound to go with it makes it to easy to lose focus on my task at hand and look at my inbox. While I loved this feature, it's become the Achilles heel of my productivity.</blockquote><p>Email is inherently designed to queue messages so you can get to it at a time of <em>your convenience</em>. But in practice, this never seems to be the case.</p><p>If you like getting work done, like I do, you learn to appreciate <strong>inspired laziness </strong>as the positive character trait it can be. And I take this one step further: <em>I turn off notifications entirely, checking them only during breaks.</em></p><p>There are a few ways that you can use this to your advantage and harness it for maximum productivity.</p><h3 id="choosing-what-not-to-do">Choosing what not to do</h3><p>Today's world is a combinatorial explosion of possibilites. The signal-to-noise ratio keeps increasing, and unlike computers; we can't simply upgrade our minds.</p><p>Choosing what not to work on is just as important, and arguably more important than choosing what to work on. This is laziness being used to increase efficiency.</p><p>Why spend days doing in-depth research on ten different approaches to solving a problem when you could've easily discarded eight of them based on some key criteria?</p><blockquote>Cut to the key goals. Cultivate the skill of discarding approaches as quickly as you can. It's a lot faster to download code than it is to write it.</blockquote><h3 id="balance-communication-with-isolation">Balance communication with isolation</h3><p>Every day, constant communication is the norm - via phones, email, video calls, you name it. The price of this constant communication is a serious uptick in interruptions.</p><p>For some fields, like management, interruption is how things get done. But for computer science, specifically software development, <em>it's poison</em>. If we can't get into <a href="https://en.wikipedia.org/wiki/Flow_(psychology)#:~:text=In%20positive%20psychology%2C%20a%20flow,the%20process%20of%20the%20activity.">a flow state</a>, it's difficult to be productive; so communication has to be carefully managed and often, deferred.</p><p>This is something I believe holds true for most kinds of work, especially those that involve a lot of "brainwork" - like writing, for example.</p><h3 id="people-don-t-scale">People don't scale</h3><p>Truly lazy developers let their machines do the work for them. This is partially motivated out of self-interest; but smart developers know that people don't scale; machines do. If you want something done the same way every time, and with any semblance of reliability, you want the human factor removed as much as is reasonably possible.</p><p>On an <a href="https://medium.com/n8n-io/tephlon-talks-about-n8n-on-raspberry-pi-23dc6d44642">interview with n8n</a>, community member Tephlon said something that I think captures the essence of this:</p><blockquote>Do things exactly three times; once to learn it, the second time to perfect it, and the third time to automate it.</blockquote><p>For every problem I encounter, I ask myself – how can I make sure that <em>I </em>never have to deal with this ever again? If I can fix it so that nobody else has to, then that's a wonderful side-effect too.</p><p>Like I've stated in the past:<br><em><em><a href="https://failedmachine.com/coding-for-the-sake-of-it/">Don't celebrate the creation of code, celebrate the creation of solutions.</a></em></em></p><h3 id="don-t-delude-yourself">Don't delude yourself</h3><p>Now, there's a fairly clear distinction between <em><strong>inspired laziness</strong></em>, as described above – it makes everyone's lives easier, and just plain not getting off your butt.<br><strong>And only you know what you are.</strong></p>]]></content:encoded></item><item><title><![CDATA[Carve me from stone]]></title><description><![CDATA[If you're (South) Indian, then you know how brave I'm being right now.]]></description><link>https://failedmachine.com/carve-me-from-stone/</link><guid isPermaLink="false">5ea61ceaabfc9a76a383adc0</guid><dc:creator><![CDATA[Amudhan Manivasagam]]></dc:creator><pubDate>Mon, 27 Apr 2020 00:03:26 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1494247872528-c25b4623cf0d?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=2000&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1494247872528-c25b4623cf0d?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=2000&fit=max&ixid=eyJhcHBfaWQiOjExNzczfQ" alt="Carve me from stone"><p>I don't usually talk about my personal life here, but I have to make an exception in this case. I wrote this days ago in preparation for today and fervently debated in my head whether to put it up (#desifamily) or to leave it sitting in <a href="https://souljournal.in">my Soul Journal</a>.</p><p>If you're (South) Indian, then you know how brave I'm being right now.<br>You can thank <a href="https://youtu.be/Uk1d9bUTJxA">these guys</a> for that.</p><p>Today is the birthday of someone very special to me and it's caused me to think about all the "love" that I have experienced in my life so far. During the last decade (basically my entire teen/adult life), I have been in three serious relationships, with completely different, but similarly amazing, people.  I wanted to take a moment to fully acknowledge and appreciate my past.</p><p>While most people do nothing but complain about their ex’s, have a negative memory of their relationships, and often times, don’t talk to them anymore — I feel fortunate to not have had that experience with any of these three women. In matter of fact, I don’t even feel comfortable calling any of them an “ex”, as that has a negative connotation when they were really the loves of my life. They met me exactly where I was ready to be met at that point in my life. Perhaps “former partner” is more accurate.</p><p>To me, the success of a relationship isn’t based on how long it lasted, but rather how deeply you loved when you were in it, and how much love and growth you still experienced after it.</p><p>It is not based on the chemicals that you thought meant love when you first got into the relationship, but rather the actual love that was still there when you got out of it.<br>Did you forgive them and did you forgive yourself? Did you still find a way to love them as a person even after all the pain? How are you a different person after being with this person? Do you wish nothing but the best for your former partners or do you still have bitterness that it didn’t work?</p><p>Unconditional love is you wanting them to be happy, even if it’s not with you.<br>The truth is, I never had a failed relationship. They were all unbelievably successful. And the testament to that is this simple fact:  Not only do I still talk to (nearly all) my ex-girlfriends, but I am still in absolute love with each and every one of them, even though we don’t talk as much anymore.</p><p>What kind of person would want to hear their current partner say they’re still in love with their ex’s? One who understands what Love actually means. Often times, we confuse Love with life compatibility, intimacy, and relationship status. They are not mutually exclusive. Just because a relationship dynamic has shifted doesn’t mean that the love is not there. And just because we’re not sharing this life together in a romantic way and don’t talk everyday, doesn’t mean that they are no longer a part of who I am. The only reason that I’m able to love as deeply as I do now is because of my shortcomings in the past…because of the heart ache I experienced. Each person that we fall in love with is directly part of the butterfly effect of each person we fell in love with in the past, and how that relationship ended…all guiding us to our next teacher.</p><p>I’ve been able to experience such freedom in the love that I now have for my former partners. When I explore a new love interest, I'd like to think that my former partners would not react with jealousy or anger, but rather with support and appreciation. All three of them would get genuinely excited, and even want to meet the person who’s making me happy. It makes me feel so humbled that I’ve been with such powerful women in my life that truly want to see me fully loved and appreciated. I sometimes don’t even know what I did to deserve this, and why I’ve been so lucky in love, but I am deeply grateful for it.</p><p>When things ended, I can't recall a time when I had the “You’ll never find someone better than me” attitude. Instead, I told them that I HOPE they find something even more expansive than what we had. As we are all constantly shifting, I acknowledge the fact that who they were when we dated, is not who they are today. It doesn’t take away from what we had — it actually gives more value to it.<br>Because we loved each other the best way we knew how to at that time, we were able to grow as individuals. One partner isn’t “better” than the other. They are all connected to each other. They are all a part of each other. The ceiling of each relationship is the basement of the next one.</p><p>They all taught me what I want and didn’t want. What I value and what I can let go of. I am now only able to love as deeply as I do, because my former partners loved me as deeply as they did. Our lives are inter-connected.  With all three of my former partners, I'd like to think that we didn’t “break up” because we hated each other, but rather because we loved each other enough that we knew it was time to set each other free. We knew that we already served our purpose in each other’s lives, and it was time to expand individually. This is why we are still in each other’s lives. It is because we loved each other unconditionally, and still do.</p><!--kg-card-begin: markdown--><blockquote>
<p>Remember, love is an infinite source and no one person has a monopoly on it in your life. You have found it in the past and you will find it again.</p>
</blockquote>
<!--kg-card-end: markdown--><p>I will never forget how my relationships helped me grow. Not from a place of attachment to the past, but from a place of honoring the beautiful times we had together. I carry all the past experiences I’ve had deep within my heart, as one accumulated energy of pure love. Each experience has expanded my heart and it is only because of the growing (and constant) pains of that expansion, that I am now able to love fearlessly and deeply. It is because of them that I am the man who I am today. If you're reading this, I love you and thank you. Thank you for your forgiveness, and your apologies. Thank you for loving me through my darkest times. Thank you for honoring what you felt at that time, for being in my path and for trusting your own path. You have been my soul mates and my angels of spiritual evolution. For the rest of this life, I will always care about you, love you, and wish you all the happiness and love that this life has to offer.</p><p>These days, however - I am my own person. Living the single life in the recent past has given me the chance to focus on myself and explore other interests - it's been a truly exhilarating experience so far and I look forward to everything that the world has to offer. Maybe I'll write about that someday too!</p>]]></content:encoded></item><item><title><![CDATA[Digital Pollution]]></title><description><![CDATA[You couldn’t just roll down the street leaving huge piles of garbage everywhere you go, making life slower for everyone as they climb over your mountains of junk, just to get on with their life. That’s how I feel about the digital things we put out into the world: websites, apps, and files.]]></description><link>https://failedmachine.com/digital-pollution/</link><guid isPermaLink="false">5dea495fffeb8604f3bf4187</guid><dc:creator><![CDATA[Amudhan Manivasagam]]></dc:creator><pubDate>Fri, 06 Dec 2019 12:32:46 GMT</pubDate><media:content url="https://failedmachine.com/content/images/2019/12/Sonar---Struts-Core.png" medium="image"/><content:encoded><![CDATA[<img src="https://failedmachine.com/content/images/2019/12/Sonar---Struts-Core.png" alt="Digital Pollution"><p>You couldn’t just roll down the street leaving huge piles of garbage everywhere you go, making life slower for everyone as they climb over your mountains of junk, just to get on with their life. You’d feel bad about it, right?</p><p>That’s how I feel about the digital things we put out into the world: websites, apps, and files.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://failedmachine.com/content/images/2019/12/useless-code-1.png" class="kg-image" alt="Digital Pollution"><figcaption>Credits: <a href="https://turnoff.us/">Daniel Stori</a></figcaption></figure><p>I prefer coding everything by hand, wherever I can; because I don’t like the huge piles of garbage that the automated generators create. These programs that generate a website, app, or file for you spit out thousands of lines of unnecessary junk when really only 10 lines are needed. Then people wonder why their site is so slow, and they think it’s their phone or connection’s fault.</p><p>Yesterday, I needed to make a little vector logo. Two lines and two triangles. I tried to use a couple different vector drawing programs but they saved it as hundreds of lines. I knew it could be simpler, so I read up on SVG and made exactly what I wanted:</p><!--kg-card-begin: markdown--><pre><code class="language-html">&lt;svg height=&quot;54&quot; width=&quot;54&quot;&gt;
&lt;defs&gt;&lt;style type=&quot;text/css&quot;&gt;&lt;![CDATA[line,polygon{stroke:black;stroke-width:4} polygon{fill:black}]]&gt;&lt;/style&gt;&lt;/defs&gt;
&lt;line x1=&quot;2&quot; y1=&quot;2&quot; x2=&quot;2&quot; y2=&quot;52&quot; /&gt;
&lt;line x1=&quot;52&quot; y1=&quot;2&quot; x2=&quot;52&quot; y2=&quot;52&quot; /&gt;
&lt;polygon points=&quot;2,2 27,27 2,27&quot; /&gt;
&lt;polygon points=&quot;52,2 27,27 52,27&quot; /&gt;
&lt;/svg&gt;
</code></pre>
<svg height="54" width="54">
<defs><style type="text/css"><![CDATA[line,polygon{stroke:black;stroke-width:4} polygon{fill:black}]]]]><![CDATA[></style></defs>
<line x1="2" y1="2" x2="2" y2="52"/>
<line x1="52" y1="2" x2="52" y2="52"/>
<polygon points="2,2 27,27 2,27"/>
<polygon points="52,2 27,27 52,27"/>
</svg>
<p align="center">The logo I needed, rendered using the code above<br>And yes, this was rendered on your device, moments ago.</p><!--kg-card-end: markdown--><p>Much better! <em>95% smaller file size</em>, and the joy of making something by hand instead of having it done for me. But I think my biggest joy is <strong>eliminating the digital pollution </strong>that the auto-generated one created.</p><p>It makes everything <em>faster, easier, and cleaner</em> for anyone involved. 95% less junk over the wires. Not to mention, I love the manual control and again - 90% smaller file size.</p><p>This makes me unreasonably happy. It feels like cleaning up the neighborhood. Or at least my room.</p><p>(And I love it when people notice how fast this site loads)</p>]]></content:encoded></item><item><title><![CDATA[Plex in the cloud. An experiment.]]></title><description><![CDATA[Netflix is, in my eyes, a world-leader in video delivery, so I figured if they can use AWS to serve their content, why can't I?]]></description><link>https://failedmachine.com/plex-on-aws/</link><guid isPermaLink="false">5de01bd6ffeb8604f3bf4103</guid><dc:creator><![CDATA[Amudhan Manivasagam]]></dc:creator><pubDate>Thu, 28 Nov 2019 19:43:48 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1543536448-1e76fc2795bf?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=1080&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" medium="image"/><content:encoded><![CDATA[<h3 id="because-why-the-hell-not">Because, why the hell not?</h3><figure class="kg-card kg-image-card"><img src="https://failedmachine.com/content/images/2019/11/images--2--1.jpeg" class="kg-image" alt="Plex in the cloud. An experiment."></figure><img src="https://images.unsplash.com/photo-1543536448-1e76fc2795bf?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjExNzczfQ" alt="Plex in the cloud. An experiment."><p>Netflix is, in my eyes, a world-leader in video delivery, so I figured if they can use AWS to serve their content, why can't I? I mean, sure, they're an international multi-billion dollar powerhouse, and I am but one man. Still, I thought to myself if anything else, it'd make an interesting case-study to deploy an EC2 instance and fire up Plex. So, here's what I did.</p><ul><li>The components</li><li>EC2 - The Server</li><li>EBS - The Storage</li><li>Getting everything in order</li><li>And breathe...</li><li>Time to build</li><li>The CLI</li><li>The script</li><li>Deploying!</li><li>Configuring Plex Remotely</li><li>Uploading Content</li><li>Performance</li><li>Cost</li><li>TL;DR - Is it worth it?</li></ul><h2 id="the-components"><strong>The components</strong></h2><p>Firstly, I had to understand what it was I needed in order to get my solution up and running. It was clear I would require two things:</p><ul><li>A running virtual host, preferably Linux</li><li>Some form of storage for the media content</li></ul><p>It really only boils down to those two components when it comes to Plex. Once I'd worked out that obvious list of requirements, I fired up my old, disused AWS account and checked out what the free tier would provide for me. <strong><strong>I tried my best to see what was possible while staying within the confines of the </strong>always-<strong>free tier for AWS accounts.</strong></strong></p><p>AWS is a veritable supermarket of tools, from databases to AI, but in my case all I needed was an EC2 instance and an EBS volume.</p><h4 id="ec2-the-server"><strong>EC2 - The Server</strong></h4><p>EC2 (Elastic Compute Cloud) is where the server will be deployed - it's in my eyes, the heart of AWS. There are quite a lot of options made available by Amazon, but I decided on the following:</p><ul><li>Image: <code>Amazon Linux AMI 2017.03.1 (HVM), SSD Volume Type</code></li><li>Instance Type: <code>t2.micro</code></li><li>1 vCPU at 2.5 GHz, Intel Xeon Family</li><li>1 GiB memory</li><li>Only allows EBS storage</li><li>Region: <code>eu-west-1</code></li><li>Availability Zone: <code>eu-west-1b</code></li></ul><p>I figured "when in Rome" (EU region, get it?) and opted for the Amazon-flavoured version of Linux for no reason other than these were the first options on the list. It also helps that installing Docker is a bit easier as the AWS repositories haven't caught up with Docker's change to Docker CE.</p><p>The only instance type I was allowed to use under the free tier was <code>t2.micro</code> so my hands were a bit tied. I could have used something more powerful but I figured this would be a good starting point.</p><h4 id="ebs-the-storage"><strong>EBS - The Storage</strong></h4><p>A running server isn't really any good if there's no storage assigned to it for my media, so I decided on EBS (Elastic Block Storage) as my solution. By default, creating an EC2 instance will automatically create an 8GB EBS volume and assign it as the root partition - quite handy. While that's nice, much like my home solution, I didn't want to mix up my application data with my static media data, so I decided I'd create my own:</p><ul><li>Volume Type: <code>gp2</code> (a.k.a General Purpose SSD)</li><li>Partition Size: <code>20GB</code></li></ul><p>Remember, I'm trying to stay within the limits of the free tier, so I'm not allowed any more than 30GB of EBS storage at any given time. Considering just having an EC2 instance creates a default 8GB volume, I've only got 22GB left to play around with - 20 is a nice round number.</p><h2 id="getting-everything-in-order"><strong>Getting everything in order</strong></h2><p>I'd decided on what I needed at a basic level, so it was time to start thinking about actually building them and deploying them in AWS. Unfortunately it's not quite as simple as clicking "GO" and sitting back, waiting for it all to magically show up on the Internet. While there is certainly an aspect to that, I did need to consider some aspects of the deployment that are both specific to AWS and should be considered generally speaking when it comes to networking.</p><p>I spent some time reading up on how AWS handled things like VPCs, subnets, Availability Zones, and Security Groups, as this would impact the way I approached deployment of my solution.</p><h2 id="and-breathe-"><strong>And breathe...</strong></h2><p>By this point you're probably wondering if this is really worth my time and whether or not I have anything better to do. The answer to <em><em>both</em></em> questions is definitely "no". This exercise was nothing more than a way of helping me understand how AWS works (I've been a Google Cloud user for as long as I can remember), and whether or not a basic running instance has what it takes to run Plex. I'd not even considered the long-term cost issues (which I'll cover later on).</p><h2 id="time-to-build"><strong>Time to build</strong></h2><p>I'm a technophile at heart, so I would be remiss if I didn't at least attempt to automate this! It's quite easy to use AWS's web console to create everything, but there's no fun in that, so instead I looked at CloudFormation - AWS's stack deployment framework. It's great because it meant I was able to test out small incremental bits and pieces of my deployment without having to manually go through all of the steps each time - I just typed in a command and let it do the work for me.</p><h4 id="the-cli"><strong>The CLI</strong></h4><p>Before I could think about automation, I needed to install the AWS CLI tool so I could push up my scripts to CloudFormation. It is of course possible, again, to do this via the web console, but that would be too boring.</p><p>After installing, I configured it to use the Access Key and Secret Access key of an IAM user I created that had permissions for CloudFormation and EC2. Amazon likes to hint at you to do everything via users with the least amount of privilege, which I think is a very good idea. Best keep my root credentials safe.</p><pre><code class="language-bash">$ aws configure
AWS Access Key ID [None]: &lt;AWS_KEY&gt;
AWS Secret Access Key [None]: &lt;SECRET_KEY&gt;
Default region name [None]: eu-west-1
Default output format [None]: json
</code></pre><h4 id="the-script"><strong>The script</strong></h4><p>CloudFormation is a wonderful tool. Much like the way Ansible automates the creation of a machine, CloudFormation automates the creation of an entire ecosystem within AWS. In my case, I used it to create three things: an EC2 Instance, an EBS Volume, and a Security Group. Complete overkill for my end goal - I could have done all of this manually - but very fun and worth learning.</p><p>So, let's get sucked in.</p><p>First, I needed to define a volume:</p><pre><code class="language-json">"PlexServerStorageVolume": {
    "Type": "AWS::EC2::Volume",
    "Properties": {
        "Size": "20",
        "VolumeType": "gp2",
        "AvailabilityZone": {
            "Ref": "AvailabilityZone"
        }
    }
}
</code></pre><p>Nice and easy: I wanted a 20GB size volume, that's a General Purpose SSD (the kind allowed by the free tier), and it should be in my given Availability Zone. <em><em>Note</em></em>: I'm using <code>{ "Ref": "AvailabilityZone" }</code> rather than hard-coding the value because it means I can change it on a whim if I ever decide to redeploy this somewhere else. The reference is to a parameter defined at the top of the script. An Availability Zone is a distinct location within a Region and reflects the physical placement of my volume.</p><p>Next came my Security Group, which would define the inbound/outbound firewall rules for my instance:</p><pre><code class="language-json">"PlexServerFirewallRules": {
    "Type": "AWS::EC2::SecurityGroup",
    "Properties": {
        "GroupName": "PlexServerFirewallRules",
        "GroupDescription": "Restrict inbound access only to the Plex and SSH ports",
        "VpcId": {
            "Ref": "AccountVPCId"
        },
        "SecurityGroupEgress": [
            {
                "CidrIp": "0.0.0.0/0",
                "IpProtocol": "-1"
            }
        ],
        "SecurityGroupIngress": [
            {
                "CidrIp": "0.0.0.0/0",
                "IpProtocol": "tcp",
                "FromPort": "22",
                "ToPort": "22"
            },
            {
                "CidrIp": "0.0.0.0/0",
                "IpProtocol": "tcp",
                "FromPort": "32400",
                "ToPort": "32400"
            }
        ]
    }
}
</code></pre><p>I defined the firewall rules (to only allow ports 32400 and 22 inbound), and linked it to a VPC (my default). The EC2 instance is linked to the VPC via its allocated subnets, so this group must also link to the same VPC, although in this case, it does it directly.</p><p>Lastly, the really fun bit, the EC2 Instance:</p><pre><code class="language-json">"PlexServerInstance": {
    "Type": "AWS::EC2::Instance",
    "DependsOn": [ "PlexServerFirewallRules", "PlexServerStorageVolume" ],
    "Properties": {
        "ImageId": { "Ref": "PlexInstanceImageId" },
        "InstanceType": { "Ref": "PlexInstanceType" },
        "KeyName": "PlexServer",
        "AvailabilityZone": {
            "Ref": "AvailabilityZone"
        },
        "NetworkInterfaces": [
            {
                "AssociatePublicIpAddress": true,
                "DeviceIndex": 0,
                "SubnetId": { "Ref": "AccountSubnet" },
                "GroupSet": [
                    {
                        "Ref": "PlexServerFirewallRules"
                    }
                ]
            }
        ],
        "Volumes": [
            {
                "Device": "/dev/sdk",
                "VolumeId": {
                    "Ref": "PlexServerStorageVolume"
                }
            }
        ],
        "UserData": {
            "Fn::Base64": {
                "Fn::Join": [
                    "\n",
                    [
                        "#!/bin/bash -v",
                        "fstype=`file -s /dev/xvdk`",
                        "if [ \"$fstype\" == \"/dev/xvdk: data\" ]",
                        "then",
                        "    mkfs -t ext4 /dev/sdk",
                        "fi",
                        "mkdir -p /data/plex",
                        "mkdir -p /data/media",
                        "chmod 750 /data/plex",
                        "chmod 750 /data/media",
                        "mount /dev/sdk /data/media",
                        "mkdir -p /data/media/movies",
                        "mkdir -p /data/media/tv",
                        "chmod -R 750 /data/media",
                        "chown -R ec2-user:ec2-user /data/media",
                        "chown -R ec2-user:ec2-user /data/plex",
                        "echo \"/dev/sdk /data/media ext4 defaults,nofail 0 2\" &gt;&gt; /etc/fstab",
                        "yum update -y",
                        "yum install -y docker",
                        "service docker start",
                        "usermod -a -G docker ec2-user",
                        "docker create --name=plex --net=host -e VERSION=latest -e PUID=$(id -u ec2-user) -e PGID=$(id -g ec2-user) -v /data/plex:/config -v /data/media/tv:/data/tvshows -v /data/media/movies:/data/movies --restart=always linuxserver/plex",
                        "docker start plex"
                    ]
                ]
            }
        }
    }
}
</code></pre><p>There's quite a bit to take in with this configuration but it's all relatively trivial. I needed my instance to be based off an image, which I provided via <code>"ImageId": { "Ref": "PlexInstanceImageId" }</code> - again, another parameter reference. The instance type is much the same, as is the availability zone. The parameterisation of <code>AvailabilityZone</code> is useful here because my EC2 Instance and EBS Volume need to be in the same place.</p><p>Naturally I wanted my instance to be publicly accessible on the Internet, so I added a Network Interface and set it to use one of the three default subnets that AWS gave me. It made sense to choose the subnet that belonged to the same availability zone as the instance and volume (I'm not sure if using another one would have even worked). I also referenced my Security Group and Volume.</p><p>For security purposes, I also defined the <code>KeyName</code>, which references an EC2 Key Pair. I generated this in the AWS Management Console manually (I could have used the CLI but I figured this was just as good) and downloaded the generated <code>.pem</code> file. This would later be used to allow me to SSH in to my instance.</p><p>I could have stopped there and that would have been enough to have a fully functional EC2 Instance, but it would have been an empty shell, with nothing running in it. That's where the <code>UserData</code> section came in.</p><p>The <code>UserData</code> script runs when the instance initialises for the first time. It can include pretty much anything you want/need to finalise the deployment of the instance. In my case, I needed firstly to check the integrity of the attached volume by seeing if it was formatted. If not, then I made it an <code>ext4</code> filesystem. Then I could create my data folders and mount the volume to the corresponding mount location (<code>/data/media</code>). After ensuring the directories have the right permissions, I added a mount line to <code>fstab</code> and proceeded to install Docker.</p><p>The final thing to do before attempting to deploy this bad boy was to grab our Plex image and start it up in Docker. The command is no different to how we'd ask anyone to run our containers, with the slight exception of how I obtained the <code>PUID</code> and <code>PGID</code> of the instance's user (which is defaulted to <code>ec2-user</code>).</p><pre><code>-e PUID=$(id -u ec2-user) -e PGID=$(id -g ec2-user)
</code></pre><p>I did all of this manually but AWS also provides a template builder to help you visualise the stack you're creating. Here's what my very simple stack looks like:</p><figure class="kg-card kg-image-card"><img src="https://blog.linuxserver.io/content/images/2017/07/chrome_2017-07-16_10-11-11.png" class="kg-image" alt="Plex in the cloud. An experiment."></figure><p>If you'd like to see the script in full, I have uploaded it <a href="https://gist.github.com/smamudhan/7ae2464f955808ea8eaaf572aca1da71">here</a>.</p><h2 id="deploying-"><strong>Deploying!</strong></h2><p>Now I can finally put this on AWS! It only took me about 13 hours of research and scripting (mostly because I kept getting things wrong; yay for trial-and-error). It would have probably taken me about half an hour to do it all manually but I'm an idiot and like to over-complicate things in the name of science (and boredom).</p><p>I went back to the CLI and used the following command to deploy my stack:</p><pre><code class="language-bash">aws cloudformation create-stack \
    --stack-name PlexMediaServer \
    --template-body file://C://Users/Amudhan/Desktop/awsplex.json \
    --parameters ParameterKey=PlexInstanceType,ParameterValue=t2.micro ParameterKey=PlexInstanceImageId,ParameterValue=ami-d7b9a2b1 ParameterKey=AccountVPCId,ParameterValue=&lt;MY_VPC_ID&gt; ParameterKey=AccountSubnet,ParameterValue=&lt;SUBNET_2_ID&gt; ParameterKey=AvailabilityZone,ParameterValue=eu-west-1b
</code></pre><p>After which I then went to the CloudFormation console in AWS and watched my server get created. Once it had finished deploying, I went over to EC2 and checked the status of my instance:</p><figure class="kg-card kg-image-card"><img src="https://blog.linuxserver.io/content/images/2017/07/chrome_2017-07-16_10-15-50.png" class="kg-image" alt="Plex in the cloud. An experiment."></figure><p>I could see that it was in a state of "Initializing", which told me that my <code>UserData</code> script was running. It took a few minutes for that to change to "2/2 checks passed".</p><figure class="kg-card kg-image-card"><img src="https://blog.linuxserver.io/content/images/2017/07/chrome_2017-07-16_10-18-33.png" class="kg-image" alt="Plex in the cloud. An experiment."></figure><p>That was it. My instance was running, the volume had been mounted, and most importantly, it had been assigned a public IP address for me to use! So, that's what I did:</p><figure class="kg-card kg-image-card"><img src="https://failedmachine.com/content/images/2019/11/chrome_2017-07-16_10-19-35.png" class="kg-image" alt="Plex in the cloud. An experiment."></figure><p>IT'S ALIVE!</p><h2 id="configuring-plex-remotely"><strong>Configuring Plex Remotely</strong></h2><p><strong>Now this is something that I didn't see coming.</strong></p><p>One of the security features of Plex is that you can't just log in to the application and set up the server configuration if you're not on the same network as the application. This meant that I needed to create an SSH tunnel to my new instance and map the port locally. This was relatively easy to do.</p><p>Using the <code>.pem</code> file I generated previously, I imported it in to PuTTY and created a tunnelling rule:</p><figure class="kg-card kg-image-card"><img src="https://blog.linuxserver.io/content/images/2017/07/putty_2017-07-16_10-24-10.png" class="kg-image" alt="Plex in the cloud. An experiment."></figure><p>When I then navigated to <code>http://localhost:8888/web</code>, I was directed to my running instance, which saw me as coming from its own local network, allowing me to start the set up process once I'd logged in:</p><figure class="kg-card kg-image-card"><img src="https://failedmachine.com/content/images/2019/11/chrome_2017-07-16_10-29-04-3.png" class="kg-image" alt="Plex in the cloud. An experiment."></figure><p>I gave it a simple name called "aws" for the time being just to get through the setup process. I did notice that my first attempt at creating a name failed, although a second attempt passed.</p><p>Using the directory I had created in the CloudFormation script, I added a "Films" library and finished the setup process.</p><p>The final piece of configuration was to ensure that the library was being shared over the correct port, so I went to <strong><strong>Settings</strong></strong> -&gt; <strong><strong>Server</strong></strong> -&gt; <strong><strong>Remote Access</strong></strong> and checked "Manually specify public port", setting the port value to <code>32400</code>.</p><figure class="kg-card kg-image-card"><img src="https://failedmachine.com/content/images/2019/11/chrome_2017-07-16_10-37-00.png" class="kg-image" alt="Plex in the cloud. An experiment."></figure><p>For some strange reason, the first attempt at this failed, but another attempt (without changing anything) worked fine.</p><h2 id="uploading-content"><strong>Uploading Content</strong></h2><p>Well, I had a running Plex server, which was nice, but it was no good without something to stream from it. My next quest was to find a way of getting some content to it. In the end I settled on using SFTP (with my <code>.pem</code> file as authentication) and transferring data directly to my mounted volume. Using FileZilla, I uploaded a couple of films to test and then scanned my library.</p><h2 id="performance"><strong>Performance</strong></h2><p>The real question I'm sure you'll have now is whether or not this solution is performant enough to deal with the heavy task of video transcoding and network streaming.</p><h4 id="video"><strong>Video</strong></h4><p>While watching a movie, I could clearly see in the usage logs that transcoding a 1080p movie at <code>8 Mbps 1080p</code> caused the CPU usage to jump to 100%. This can be problematic if it remains at this level for an extended period of time because 100% utilisation consumes CPU credits, which will eventually run out if usage is left high for too long. While this doesn't cost anything, it'll choke-hold your instance so that the credits can replenish.</p><figure class="kg-card kg-image-card"><img src="https://blog.linuxserver.io/content/images/2017/07/chrome_2017-07-16_11-21-51.png" class="kg-image" alt="Plex in the cloud. An experiment."></figure><p>The above graph shows how the CPU was happily idling until I started watching a film that required transcoding. The usage quickly shot up and remained between 90%-100% until I switched the quality level to <code>Original</code>, which promptly released the strain from the CPU. Usage dropped because a quality level of <code>Original</code> bypasses the server's need to transcode the video on-the-fly, instead opting to stream the video as-is to the client, which takes on the responsibility of transcoding instead. Below is the rate of consumption of CPU credits based on my usage:</p><figure class="kg-card kg-image-card"><img src="https://blog.linuxserver.io/content/images/2017/07/chrome_2017-07-16_11-35-22.png" class="kg-image" alt="Plex in the cloud. An experiment."></figure><h4 id="network"><strong>Network</strong></h4><p>It seems that even the modest network speed of a <code>t2.micro</code> instance is enough to deal with streaming at least a single video to a client. For anyone sharing libraries with multiple people, it is likely it'll choke under the demand.</p><figure class="kg-card kg-image-card"><img src="https://blog.linuxserver.io/content/images/2017/07/chrome_2017-07-16_11-28-24.png" class="kg-image" alt="Plex in the cloud. An experiment."></figure><p>The network usage is interesting to observe as in this case I can see that throughout my viewing, EC2 sent out just under 750MB of data to my PC. The movie I watched is a 1GB 1080p MKV, so it's clear that Plex is quite efficient at dropping the overall file size to suit different connection speeds. This particular transfer size reflects the whole film's duration.</p><h2 id="cost"><strong>Cost</strong></h2><p>The last question you may now have is "how much is this going to cost me?". The answer, anticlimactically, is probably "it depends". AWS's pricing model is relatively competitive but the costs can very quickly add up, especially once you're out of the grasp of the Free Tier (which expires after 12 months).</p><p>My EC2 instance is on "On-Demand" pricing, which means that it's an hourly fixed rate, regardless of the CPU usage (credits notwithstanding). It's a pretty inefficient pricing model for something designed to always be on. Let's break it down:</p><ol><li>A <code>t2.micro</code> instance costs $0.013 per hour*, or $0.312 per day. That's <strong><strong>$113.88 per year</strong></strong>. Already that's a high price to pay for something you're likely going to use maybe a few hours a day.</li><li>However, the caveat to this is you can just turn it off when you're not using it. So, assuming you only have it running when you want to use it - say, four hours a day - your costs drop down to <strong><strong>$18.98 per year</strong></strong>. That's a bit more like it.</li><li>If you set up a task rule in AWS to automatically shut down your instance overnight, or while you're at work, you can have it running at times you know you're going to want it, while still reducing overall compute costs.</li></ol><p>* Pricing is in USD because that's how old my AWS account is :/</p><p>But that's not all! The instance has been costed, but we've still got the storage to think about. I used a small 20GB SSD for the sake of my test, but some people may want more. EBS does provide much larger volumes but at a cost.</p><p>AWS charges you for how much storage space you <em><em>provision</em></em>, not how much you use. For streaming, I believe "Throughput Optimized HDD (st1) Volumes" to be the best option as they provide a good balance of storage space and read speeds. The pricing model for EBS is a bit more confusing than EC2 because the costs are prorated on an hourly basis, but the general idea is the same:</p><ol><li>EBS storage (<code>st1</code>) costs $0.05 per GB-month, so if we provision 1TB (1000GB) and have it attached to an instance (regardless of whether or not it's running), the monthly cost for that storage is <strong><strong>$50.00</strong></strong>! Utterly mental and in no way cost effective!</li><li>However, this is for <em><em>provisioned</em></em> storage, so costs can be reduced by creating a snapshot of the volume, then deleting the provisioned storage when the instance isn't running. AWS's pricing for snapshots is different as it charges for <em><em>used</em></em> storage, rather than provisioned. If you have only used 300GB of your volume, your monthly cost drops to <strong><strong>$15</strong></strong> for the snapshot. Still a bitter pill to swallow.</li></ol><p>So, we've established that it's the storage that's a real kicker regarding costs. The problem is, we've not even thought about <em><em>transfer</em></em> costs. That's right, AWS also charges for network activity!</p><p>Thankfully, AWS doesn't charge for inbound <code>Internet -&gt; EC2</code> traffic, so getting the data into the instance isn't a problem. The costs start accruing when data <em><em>leaves</em></em> EC2 back into the wilds of the 'net. Thankfully, the rates are easy enough to figure out:</p><ol><li>The first GB of outbound traffic is free.</li><li>For the next 9999GB of data, the rate is $0.09 per GB.</li><li>The next 30TB are a tiny bit cheaper at $0.085 per GB.</li></ol><p>So, let's say I watch a few episodes of my favourite shows on a daily basis. Each episode is roughly 1.5GB in size, and I stream at <code>Original</code> quality, so no change to the file size during streaming. Per day, my outbound traffic is 4.5GB, so that'll cost me <strong><strong>$0.32 per day</strong></strong>. That's <strong><strong>$9.45 per month</strong></strong> just for the luxury of streaming! Yeesh. That doesn't even account for the occasional movie.</p><p>The total monthly cost for an instance running for four hours a day, plus 500GB of provisioned storage (without snapshot), streaming around 4.5GB per day comes in at:</p><p><strong><strong>$1.56</strong></strong> + <strong><strong>$25.00</strong></strong> + <strong><strong>$9.45</strong></strong> = <strong><strong>$36.01</strong></strong> per month</p><h2 id="tl-dr-is-it-worth-it"><strong>TL;DR - Is it worth it?</strong></h2><p>No. Just get Netflix.</p>]]></content:encoded></item><item><title><![CDATA[Concepts of Time]]></title><description><![CDATA[My writing here is mostly focused on people and technology in all aspects. Sometimes, an idea just sticks in your head and needs to be written.

Isn't all of time is measured only by relative means? Maybe time really is just wibbly-wobbly, timey-wimey stuff...]]></description><link>https://failedmachine.com/concepts-of-time/</link><guid isPermaLink="false">5dc4d3d2ffeb8604f3bf40b7</guid><dc:creator><![CDATA[Amudhan Manivasagam]]></dc:creator><pubDate>Fri, 08 Nov 2019 02:47:06 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1456574808786-d2ba7a6aa654?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=1080&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1456574808786-d2ba7a6aa654?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjExNzczfQ" alt="Concepts of Time"><p>My writing here is mostly focused on people and technology in all aspects. However, being generally interested in all sorts of subjects and thought, sometimes an idea just sticks in your head and <em>needs</em> to be written.</p><p>I don't know the genesis of the idea forming in my head, probably watching sci-fi shows too late (or maybe it's the exam I have in two hours), but my mind has been musing on the concept of time. Specifically, how we measure it, account for it, and place meaning on it despite a limited view of it.</p><p>The idea in my head when I'm stating <em>limited view of time</em> is focused on the fact that every method we use to measure time is relative. It's relative to the rotation of the earth, relative to our orbit around our sun. All the significance we place on its passage is not measured the same without this relative constant of earth.</p><p>An example to elaborate this can focus on something as core to most of us as our age. Let's say I am nearing my thirty fifth birthday, but that is still an arbitrary number based on when I was born followed by thirty five rotations of the earth around our sun. What if as humanity expands I was born and raised on Mars? Following the same relative basis I would be only half way through my eighteenth year (my current age) of existence! So does my age as a number really mean anything? How old am I, really?</p><p>One could attempt to make the argument that humanity as we know it originates from earth, and as such, any expansion we would logically still keep time based on our home world. But would we? Carry on the Mars thought. What if we're in a situation like <em><a href="https://www.primevideo.com/detail/The-Expanse/0MW6F85MD8486AE43GONNOR5F1">The Expanse</a> </em>(interesting fact: the show is based off of <a href="https://www.amazon.in/dp/0316311294">these books</a>) and Earth and Mars do not really get along, and have fought wars in the past to form very different cultures. Why would anyone born on Mars measure time as it occurs on Earth, a planet that they've never been to and maybe even have conflicts with?</p><p>The concept and thoughts are still developing and expanding even as I write, and I expect will continue to do so.</p><p>The argument holds for all measurements of time that we use. The length of a day is based on the earths rotation, and in near expansion, Mars is similar, other planets a day may be longer or shorter. The division of a day into smaller and smaller units from hours to minutes is an arbitrary and universally agreed to standard simply invented by powerful governments or religions through history.</p><p>In summary, at least for now, all of time is measured only by relative means. I'm certain quantum science or other think tank machines have and continue to dissect these concepts in significant detail. That however does not preclude my own exploration on the subject. Maybe time really is just wibbly-wobbly, timey-wimey stuff...</p>]]></content:encoded></item><item><title><![CDATA[Remember, jobs are supposed to be fun]]></title><description><![CDATA[As I watch (a rather large subset of) my peers headed towards job interviews and starting a career; few realise that it can take a long time to figure out your work life...]]></description><link>https://failedmachine.com/jobs-are-supposed-to-be-fun/</link><guid isPermaLink="false">5d8d01cf8bf38a0d7e0f5159</guid><dc:creator><![CDATA[Amudhan Manivasagam]]></dc:creator><pubDate>Thu, 26 Sep 2019 18:49:06 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1568598035424-7070b67317d2?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=1080&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1568598035424-7070b67317d2?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjExNzczfQ" alt="Remember, jobs are supposed to be fun"><p>As I watch (a rather large subset of) my peers headed towards job interviews and starting a career; I see that a lot of them face existential crises about the relevance of their education with respect to their interests and passion.</p><p>It can take a long time to figure out what you want out of your work life; despite the amount of time invested in what seems to be an outdated "get-a-job" degree that focuses little on the parts of computer science that matter; atleast where I come from. (This is a discussion for another day.)</p><p>I watch the tribulations unfold - the degree (is supposed to have) opened up many opportunities for him, but I don't think he ever found exactly what he was looking for. Instead, he's spent years after college flitting from job to job. Although, he had nothing to complain about. He was making a great living. He was never on the market for particularly long before some new opportunity would come up. But he wasn't choosing a career path. He was letting happenstance determine what was, and what he was becoming.</p><p>At some point in your career, you have to stop floating through life like the symbolic feather.</p><p>Unfortunately, I don't think my friend ever figured out what he loved to do. He never determined the colour of his feather. But I got lucky. A few years ago I realised that what I loved to do, what I really <em>loved to do</em> more than anything else, was build things and fool around with computers. Seems obvious, I know, but you have the advantage of not being me. Self-awareness is a perplexingly difficult thing from here on the inside.</p><p>Life is too short to stay at a job where you're not doing the things you want to do, where you're not enjoying yourself. And yet here I was, a guy hopelessly in love with all things computer and software, working with people that considered to be a byproduct, a cost center, a necessary evil.</p><blockquote>A  friend of mine works for a company that has experienced a mass exodus of developers. The best left first, the mid-range followed. What's left are the people who clock in 9 to 5 for the paycheck and don't take pride in what they're building. The company now has what they asked for: a team of low-level code jockeys. The people with initiative, energy, and passion have left.</blockquote><p>Enterprises that consider developers "commodities and low level craftsmen" are doomed to have (at best) average developers working for them.</p><p>The work was interesting, but it was abundantly clear that software was not the lifeblood of this organization. Nobody was quite as obsessed with the software as I was; nobody saw it's potential to simplify, organize and streamline all the mundane tasks of the everyday routine. My passion for software, and everything around it, was clearly not shared.</p><p>I set out to change that. That's why, when I had the chance to run a small IT team; I chose to work with the people that share the same philosophy. I'm surrounded by incredibly talented people who are all passionate about software and recognize the potential it holds. <em>Dammit, we have fun</em>.</p><p>Joel Spolsky describes the guiding philosophy behind his software company:</p><blockquote>Frankly, <strong>the main reason I had to start this company was to have fun at work</strong>. Working at Fog Creek is intentionally designed to be pleasant. We started the business because we wanted a great place to work, to spend our daylight hours. And we have a disturbing tendency to try to do a lot of things ourselves, especially if it's going to be fun or if we think we can do a better job. It takes us a little longer that way, but I figure the journey is the reward.</blockquote><p>If you love computers as much as I do, you deserve to work at a company where people come to work not to punch a clock, but because they love computers, too. You deserve to work at a company where software engineering is respected. You deserve to work at a company where peers meet to <em>enjoy</em> building software together.</p><p>Choose wisely. And remember, <strong>this stuff is supposed to be fun</strong>.</p>]]></content:encoded></item><item><title><![CDATA[How to cool down a MacBook Air ... fast]]></title><description><![CDATA[Is your Macbook Air overheating? Here’s a technique I’ve been using for the last couple of years, works everytime. Read the rest of this before you decide to throw away good money on yet another snake oil solution.]]></description><link>https://failedmachine.com/hot-macbookair/</link><guid isPermaLink="false">5d37325e8bf38a0d7e0f50cc</guid><dc:creator><![CDATA[Amudhan Manivasagam]]></dc:creator><pubDate>Tue, 23 Jul 2019 16:42:02 GMT</pubDate><media:content url="https://failedmachine.com/content/images/2019/07/macbook-air-overheating-670x335.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://failedmachine.com/content/images/2019/07/macbook-air-overheating-670x335.jpg" alt="How to cool down a MacBook Air ... fast"><p>Is your Macbook Air overheating? Here’s a technique I’ve been using for the last couple of years; works everytime. I suspect it still works on the new models – I *suspect* they have the same basic design flaws as the original, from looking at the case.</p><h4 id="problem-vents-in-wrong-place"><strong>Problem: vents in wrong place</strong></h4><p>Those vents along the rear underside of the case … don’t work. I don’t know how they ended up there, but I suspect it was a triumph of “looks” over “not breaking the expensive laptop” (until Apple patched OS X, just running Flash was enough to cause OS shutdowns on a regular basis).</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://failedmachine.com/content/images/2019/07/ret79rtvl4131.jpg" class="kg-image" alt="How to cool down a MacBook Air ... fast"><figcaption>The only vents on my MacBook Air are at the hinge</figcaption></figure><h3 id="solution-what-to-not-do">Solution: What to not do</h3><!--kg-card-begin: markdown--><p>Don't hurry up and listen to what everyone says. Read the rest of this before you decide to throw away good money on yet another snake oil solution such as:</p>
<ul>
<li>Cooling pads</li>
<li>Ventilated stands</li>
<li>Height increasing suction cups (yep, confused me just as it did you)</li>
<li>Cooling fans</li>
<li>Cleaning services</li>
<li>Fan upgrades</li>
</ul>
<!--kg-card-end: markdown--><h4 id="the-real-solution-assume-launch-position-"><strong>The Real Solution: assume launch position…</strong></h4><p>Grab your MacBook, hold it at the hinge (so the lid doesn’t slam down and switch the laptop off), and tilt it towards you 90 degrees.</p><p>i.e. the keyboard half of the laptop should be vertical, resting on the long, bottom, edge.</p><figure class="kg-card kg-image-card"><img src="https://failedmachine.com/content/images/2019/07/IMG_20190723_220326-3.jpg" class="kg-image" alt="How to cool down a MacBook Air ... fast"></figure><p>The vents now vent air straight up – unimpeded – instead of down-and-out (impeded by the case itself).</p><blockquote>This brilliant technique also works for most other laptops as well!</blockquote><h4 id="result-fast-cooling"><strong>Result: fast cooling</strong></h4><p>I can usually get my Air that’s been running “hot” (fans very loud and noisy) for minutes / hours to cool down in under 60 seconds using this technique.</p><p>Why does this matter?</p><p>Well … once an Air is cool, it tends to stay cool. i.e. it’s crap at bringing it’s own temperature down, but it’s got enough oomph to *keep* it at whatever temp is current. So, manual intervention fixes the problem.</p><h4 id="super-fast-cooling-a-k-a-panic-"><strong>Super-fast cooling (a.k.a. “PANIC!”)</strong></h4><p>What do you do if your Air starts beeping?</p><p>(hint: this is the never-actually-explained-to-you hardware warning that “your CPU is about to melt. Cool it down NOW or buy a new laptop”. I wonder how many people realise what’s happening when they hear that screeching, high-pitched beep and think “WTF?”)</p><p>As above, only shut the lid too.</p><p>This may seem counter-intuitive – after all, this will reduce the air-surface of the Air by about 50%, reducing it’s ability to cool down.</p><p>In practice, although that’s true at low temperature, at high temperature the heat is already concentrated in the top-left corner of the keyboard (where the CPU sits) – and most of the case is too far away to help.</p><p>In practice, closing the lid causes OS X to suspend processes, which normally takes enough load of the CPU that the laptop / hardware is able to cool itself MUCH faster – but only if you’re holding the whole laptop vertically, with the vents pointing upwards.</p><p>I’ve found this normally cools my Air from “max fans” to “silent” in under 15 seconds.</p>]]></content:encoded></item><item><title><![CDATA[Life is an Open Source Project]]></title><description><![CDATA[As I’ve evaluated contradicting opinions in different areas of software engineering and development, I‘ve found an analogy that helps me make decisions. It boils down to one central idea:

Your life is an open source project, and you are its maintainer.]]></description><link>https://failedmachine.com/life-is-an-open-source/</link><guid isPermaLink="false">5d2cb8333d6e7e47ab8676b0</guid><dc:creator><![CDATA[Amudhan Manivasagam]]></dc:creator><pubDate>Mon, 15 Jul 2019 17:51:08 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1506784881475-0e408bbca849?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=1080&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1506784881475-0e408bbca849?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjExNzczfQ" alt="Life is an Open Source Project"><p>As I’ve evaluated contradicting opinions in different areas of software engineering and development like bootcamps vs college degrees, this framework vs that, or a MacBook Pro butterfly keyboard vs an 1850’s typewriter, I‘ve found an analogy that helps me make decisions. It boils down to one central idea:</p><p><strong>Your life is an open source project, and you are its maintainer.</strong></p><p>Hear me out through a few parallels:</p><ul><li>Just like open source software benefits from a roadmap, having life goals with specific dates coerces you into improving</li><li>An open source code of conduct is like your individual values and morals that dictate your behavior</li><li>Being frugal in what is added to a project’s API is sort of like saying no to that bowling league your friend wants you to join</li></ul><p>When it comes to how the roadmap is outlined, how the code of conduct is established, and what changes are made to the API, the buck stops with the maintainer(s). Along the same vein, what decisions you make in how to develop and grow are ultimately up to you, the maintainer.</p><p>You’ll be presented with amazing opportunities and everyone else will chime in with an opinion as to what you should do, but only you have the context necessary to answer them.</p><p>Because great open source maintainers tend to also be great people (which I don’t think is coincidental), I want to outline why I think planning, building, and maintaining a great open source project relates to developing a great life.</p><h3 id="plan">Plan</h3><p>Just like with open source, you need to start with a plan, and you have a community of individuals that have a vested interest in what you do. They’ll sometimes have great advice and they’ll sometimes have this advice:</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/1*KKKvfuWX1IuXZYM558h5CQ.png" class="kg-image" alt="Life is an Open Source Project"></figure><p>What other people suggest you should do might not align with what vision you have for the future at all!</p><h4 id="have-a-roadmap">Have a Roadmap</h4><p>Good open source software will have a roadmap that outlines a timeline of what will be developed next, and by what dates.</p><p>From a code standpoint, right off the bat and no matter what you’re working on, you should prioritize your goals. What is most important to do next? Sometimes what is important may not be what is exciting. Maybe being able to edit your spreadsheets in VR can wait while you refactor that code you wrote years back when you thought <code>float: right !important</code> was a good idea.</p><p>With expectations from life, set goals, give yourself deadlines, and then be accountable. Sometimes the most rewarding feelings come from abstracting away the simple chores like paying bills. You’ll start feeling like your own psychotic fitness coach and you’ll save yourself ₹1200/month for the gym membership.</p><p>Then with unfailing resolve, the evangelists of all things new-and-improved will come knocking at your door expecting to you to bend to their demands.</p><blockquote>“We need support for Rock Band Guitars if this library is going to be used!” they’ll say.<br>“This is a string parsing library.” you’ll respond.<br>“Who’s going to use that without Rock Band Guitars?” they’ll retort.<br>“Sorry AFK” you’ll reply.</blockquote><p>Prioritize attention to items on your roadmap, and be ready to filter out noise from the periphery.</p><h4 id="have-a-code-of-conduct">Have a Code of Conduct</h4><p>Open source projects often adopt a code of conduct that contributors must abide by to work on the codebase. Take a code of conduct from a popular project out of the context of software and you’ll often find it’s still relevant. One open source code of conduct gives these points to follow:</p><ul><li>be friendly and patient</li><li>be welcoming</li><li>be considerate</li><li>be respectful</li></ul><p>If you squint your eyes and slowly move your head away from your monitor you can almost see the bullet points above forming the text of the Sermon on the Mount from the New Testament.</p><p>Consider adding similar characteristics to your personal code of conduct and then commit to live by it.</p><p>Nobody enjoys being around a negative Nelly (except other negative Nelly’s). Welcome diversity, make new friendships, spread optimism, and extend the positive reach of open source. Just like people are drawn to projects that are accepting and welcoming of newcomers, people will be drawn to individuals that are friendly and start opening doors for you if you treat them fairly.</p><p>Adopting guiding principles like these also mitigate your individual contribution to the dumpster fires of unhelpful Reddit and HackerNews threads (a noble cause indeed).</p><h3 id="build">Build</h3><p>To actually make an open source project, you probably need to know how to code [citation needed].</p><p>Learn a thing or two and keep iterating!</p><h4 id="learning-and-development">Learning and Development</h4><p>The services your project offers should be important to you. Will your app offer a broad variety of functions, or do just a few things particularly well? Will you be Samsung and crank out 45 subpar phones every year, or be Apple, do the iPhone and own it?</p><p>Like me, I’m sure you’ll encounter articles with titles like “200 Free Courses you can Start Today” or “Why you should learn X”. There is an overwhelming wave of content, and <em>no one</em> has the time to absorb it all. Technologists and developers are hard-pressed to always be learning and adopting new technologies and trends, but it’s hard to know what to do next. You’re going to have to make decisions about what you ignore and what you choose to specialize in.</p><p>Making the colossal mountain of content more approachable is the concept of the anti-library from Nassim Taleb. In his book <em>The Black Swan</em>, he tells the story of Italian writer Umberto Eco:</p><p>He is the owner of a large personal library (containing thirty thousand books), and separates visitors into two categories: those who react with “Wow! <em>Signore professore dottore</em> Eco, what a library you have! How many of these books have you read?” and the others — a very small minority — who get the point that a private library is not an ego-boosting appendage but a research tool. </p><blockquote><strong>Read books are far less valuable than unread ones.</strong></blockquote><p>This concept is related to the vast expanse of tutorials and blog posts that live online. The greater the unread content, the greater potential for learning.</p><p>If there is something that a tutorial can be written for, you can probably find it. Dora the Explorer could probably even find it, and she has to have 6 year olds point out where the banana tree is to her.</p><p>Decide what you want to learn and go learn it, but don’t feel crippled by not knowing, your anti-library (these days, Google) could be one of your finest assets.</p><h4 id="individual-growth">Individual Growth</h4><p>Ralph Waldo Emerson famously said:<br><em>"The height of the pinnacle is determined by the breadth of the base."</em></p><p>This can be interpreted to mean how high you are capable of growing is first determined by how well grounded and strongly rooted your core values are.</p><p>If you want to become an expert, start by rooting yourself in fundamentals and even developing simple traits like perseverance and diligence. Being really good at something can often be boiled down to simply working hard and managing your time well.</p><p>A big part of marketing for an open source project is the organic growth from maintainers helping users resolve issues while using their libraries. Being helpful and supporting others using their project starts to become a part of who they are, and it feeds into loads of people wanting to use their libraries as a result.</p><p>I believe if you just start becoming a good person — no matter what you do — people will want to work with you.</p><h3 id="maintain">Maintain</h3><p>As a library grows, it’ll (hopefully) see contributions from the community supporting it more, and the question of how the project moves forward becomes more complex.</p><p>Similarly, as you become more and more capable throughout your career, more and more opportunities will surely present themselves and give you even more choices. If you haven’t started establishing a roadmap you’ll find it even harder to turn down that freelance WordPress gig someone on LinkedIn reached out to you about.</p><h4 id="learn-to-say-no">Learn to Say No</h4><p>Because decisions only get more complicated with time, it can be especially important to learn to say no.</p><p>David Heinemeier Hansson <a href="https://signalvnoise.com/posts/1626-the-most-powerful-word-is-no">wrote</a>:</p><p>Use the power of no to get your priorities straight. Take the brief discomfort of confrontation up front and avoid the long regret down the line.</p><p>You won’t have time to meet everyone else’s edge case, so you have to prioritize. A maintainer will have to disappoint someone, and it’s easier to articulate a message that disappoints if you have a roadmap in writing already.</p><p>In the recent movie Christopher Robin, the story follows Christopher who has become over-absorbed in his work such that his family begins to feel distanced from him. Christopher Robin struggles as his work becomes his first priority, but his family is what he values most.</p><figure class="kg-card kg-image-card"><img src="https://cdn-images-1.medium.com/max/800/0*LFisPYAiy_-iKvmb" class="kg-image" alt="Life is an Open Source Project"></figure><p>Christopher gets advice from an uncharacteristically wise plush bear</p><p>During one scene, innocent Roo has the following pointed exchange with Christopher while he’s away from family, referring to his briefcase he always carries with him:</p><p><em>Roo: What’s a Madeline? Is it more important than your case of important things?</em></p><p><em>Christopher: Madeline’s my daughter, so, yes, of course. Absolutely. She means the world to me.</em></p><p><em>Roo: </em><strong><em>Then why isn’t</em> <em>she</em> <em>with you?</em></strong></p><p>If work is what you value first, then taking on more work will likely be valuable to you. However, if you are like 91.6% of respondents to the World Values Survey (hi! 👋), then you very likely put your family first too.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-images-1.medium.com/max/800/1*q-t7mfjbN1VDppJ8nROGQA.png" class="kg-image" alt="Life is an Open Source Project"><figcaption>Source: <a href="http://www.worldvaluessurvey.org/">http://www.worldvaluessurvey.org</a></figcaption></figure><p>Work is likely also “Very important” or “Rather important” to you according to the results of the survey, but these results demonstrate the general prioritization of family as one of the most valued categories.</p><h4 id="refactor-and-simplify">Refactor and Simplify</h4><p>Time to work on open source doesn’t come free. Perhaps you’ll find the silver bullet of time management one day, but until then resist the urge to rewrite everything on a blockchain.</p><p>Dead code is dangerous to keep around, keeping it in repositories means more to maintain and more potential to break things. Similarly, the more responsibilities you are balancing between family, career, religion, and health means more to manage and more that can stress you.</p><p>A popular analogy about work life balance being similar to juggling glass and rubber balls demonstrates the necessity of simplification in personal growth. The balls represent different responsibilities in your life. If you drop a rubber ball you can pick it back up no problem, but glass balls can shatter when dropped. You decide which responsibilities represent glass balls and which represent rubber balls — as well as how many of them you are juggling at any given point. If you need to let something drop, dropping a rubber ball can be more easily recovered from. Decide what your glass balls are and focus on keeping them in the air.</p><p>According to Bruce Lee:<br><em>"It’s not the daily increase but daily decrease. Hack away at the unessential."</em></p><p>Developers worry about cutting bundle sizes so small they could fit through a coffee straw. Have you ever considered the bundle size comprised of all the priorities you’re balancing in your life? If cutting bundle sizes makes the web experience faster and smoother, perhaps removing some fluff from the edges of your life could do the same for it.</p><h4 id="measure-your-growth">Measure your Growth</h4><p>Everything scales, and so does your influence.</p><p>As a library grows and more users adopt it maintainers get stretched thinner and thinner trying to meet the needs of a growing community of users.</p><p>Some species of bamboo demonstrate how difficult it can be to measure growth, but also the importance of being strongly rooted. Some of these species of bamboo can grow at astronomical rates of 4cm (1.6in) an hour. It’s easy to watch peers and friends around you growing at those speeds and wondering what you are doing wrong. That kind of growth is possible because bamboo can take a long time to get established where it’s planted, and your current growth might be more focused on your roots, which is okay too.</p><p>The visible signs of growth come in time. Your metric of choice to keep track of progress on your goals might be obfuscated by all sorts of other variables, but trust that your impact will still be there.</p>]]></content:encoded></item><item><title><![CDATA[What I've learned from nearly three years of enterprise Wi-Fi at my home]]></title><description><![CDATA[Perched precariously on the top step of an inadequate and shaky ladder in the corner of my living room; I think "Maybe I’ll just stand here for a few hours and not move, maybe I don't even need Wi-Fi anymore. Maybe I should live in the mountains and never think of technology again"]]></description><link>https://failedmachine.com/unifi-three-years/</link><guid isPermaLink="false">5d047ae60464b808a062b7d3</guid><dc:creator><![CDATA[Amudhan Manivasagam]]></dc:creator><pubDate>Sat, 15 Jun 2019 05:30:00 GMT</pubDate><media:content url="https://failedmachine.com/content/images/2019/06/maxresdefault.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://failedmachine.com/content/images/2019/06/maxresdefault.jpg" alt="What I've learned from nearly three years of enterprise Wi-Fi at my home"><p>Do you <em>just</em> want better Wi-Fi in every room? Consider buying a <a href="https://www.plume.com">Plume</a> or <a href="https://store.google.com/?srp=/product/google_wifi">Google Wifi</a> or other similar plug-n-go mesh system. On the other hand, are you a technically proficient network kind of person who wants to build an enterprise-lite configuration at home? Do you dream of VLANs and port profiles and lovingly tweaked firewall rules? Does the idea of crawling around in your attic to ceiling-mount some access points sound like a fun way to kill a weekend? Is your office just too <em>quiet</em> for your liking? Buy some Ubiquiti Unifi gear and enter network nerd nirvana.</p><p>There is a moment of perfect stillness after the cable slips through my fingers and vanishes back up the hole in the ceiling like an angry snake. Then the opening stanza of a rich poem of invective leaps from my lips and my mom stares up at me from below, eyes wide, frozen just as I am, ready to catch me if I rage too hard and lose my balance.</p><p>But perched precariously on the top step of an inadequate and shaky ladder in the corner of my living room, drenched in sweat and speckled head to toe in dust, body aching with dull red heat, I just can’t maintain the torrent of swearing. I’m too tired. The words die on my lips and I drop my burning arms to my side. Sweat stings my cut hands—“man hands", hands that seem to always sport an ever-changing collection of cuts and dry spots and calluses and torn nails as house or computer projects come and go. Tiny drops of blood ooze from shredded cuticles.</p><p><em>Maybe I’ll just stand here for a few hours and not move,</em> I think, mind going blank rather than face the thought of climbing back up into the baking attic and fishing out the cable from underneath mountains of insulation. <em>Maybe I don’t even need Wi-Fi anymore. Maybe I don’t even need </em>computers <em>anymore. Maybe I should throw away everything I own and live in the mountains and grow my own food and never think about technology ever again.</em></p><p>But let’s back up a bit.</p><h3 id="what-was-going-on">What was going on</h3><p>In mid-2015, I retired my rats-nest of random routers and repeaters and upgraded my home’s Wi-Fi with a set of wireless access points from New York-based networking company <a href="https://www.ubnt.com/">Ubiquiti</a>. I was trying to accomplish two things: first, to eliminate some persistent Wi-Fi dead spots that I just couldn’t reach, even by extending my network with a couple routers and repeaters. Secondly, and perhaps more importantly, I wanted some new homelab gear to tinker with so that I could get some hands-on time with an enterprise grade (or at least “enterprise-lite” grade) Wi-Fi system, because playing with the big toys is fun.</p><p>The Ubiquiti access points delivered on both points. The individual devices weren’t even particularly expensive—strategically placing a few of the APs can be cheaper than buying a single monster consumer-grade AP/router. The monster consumer router can (usually) deliver higher single-client performance in synthetic benchmarks, but the distributed Ubiquiti APs are far better at delivering consistent multi-client performance (and they’re not all bottlenecked behind a single backhaul, either).</p><p>More importantly, having multiple access points means that instead of having to take a <strong>“make my one base station scream as loud as possible”</strong> approach to whole-house coverage, you have the opportunity to fine-tune each individual AP’s 2.4GHz and 5GHz radio strengths and channel selections to create a series of interlocking cells that together offer vastly more consistent coverage—especially in the 5GHz range, which is almost certainly where you want your wireless clients connecting whenever possible.</p><p>As it turns out, this kind of network tuning is a lot like sailing: it’s relatively easy to learn the fundamentals in an afternoon, but mastering it probably takes more time than you’re willing to commit unless you just really freaking love sailing. Or screwing around with your Wi-Fi. (Or, alternately, you can get paid to do it at your job.)</p><blockquote><strong>"I will admit that configuration mistakes were made."</strong></blockquote><p>The upside, though, is that I learned a lot by screwing up so much, and the only person I hurt was myself. Well, and the family, whenever my weekend tinkering sessions resulted in no Wi-Fi for a few hours. This piece is intended to let you laugh at my mistakes as much as anything else.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://failedmachine.com/content/images/2019/06/wifi.png" class="kg-image" alt="What I've learned from nearly three years of enterprise Wi-Fi at my home"><figcaption><a href="http://imgs.xkcd.com/comics/wifi.png">Credit: xkcd</a></figcaption></figure><h3 id="unifi-my-wi-fi">Unifi my Wi-Fi</h3><p>Ubiquiti makes all manner of stuff, ranging from wired gear to full-on heavy-duty <a href="https://store.ubnt.com/collections/wireless/airfiber">WISP equipment</a>. I became interested in the company’s <a href="https://unifi-sdn.ubnt.com/#home">Unifi</a> line of Wi-Fi networking primarily because of the price—the gear seemed exceedingly cheap for the capabilities it offered, especially considering how the access points stacked up against consumer offerings.</p><p>There’s more to the Unifi product line than just wireless access points, though—it’s at this point a vertical that includes switching and routing, too, using hardware adapted from Ubiquiti’s more mature <a href="https://www.ubnt.com/products/#edgemax">EdgeMAX line</a>. Unlike Unifi, EdgeMAX kit isn’t centrally managed (well, sort of, but no.). EdgeMAX is meant to be standalone, used for enterprise switching and routing, without the software defined special sause exclusive to the Unifi line.</p><h3 id="flying-too-close-to-the-sun-repeatedly">Flying too close to the sun, repeatedly</h3><p>After being lured in by the price, I quickly decided I wanted Unifi APs in my house because of the huge amount of <em>cool stuff</em> they’d let me do. Being a <em>sort-of-nearly-sysadmin</em>, and although at the time I've never been in charge of administering the guts of a large network, I picked up the ins and outs of enterprise network administration through countless collaborations and hallway conversations over the years.</p><p>From that sprung grand designs for my home WLAN: I didn’t just want to set up Wi-Fi with a guest network—that’s so <em>pedestrian</em>. No, I wanted to emulate the things I used to have at work. I wanted multiple segments and VLANs. I wanted to sequester my IoT crap on its own little isolated chunk of space. I wanted complex packet filter rules. I wanted WPA2 Enterprise Wi-Fi, with cryptographic certificate-based client authentication via RADIUS that I could control and revoke, rather than a lame-ass WPA passphrase. I wanted metrics, deep packet inspection, intrusion detection, charts and graphs and data everywhere. I wanted something to <em>play</em> with.</p><p>I eventually got all of these things, and more. But the biggest takeaway from my still-ongoing Unifi experience is this: enterprise networking gear in the home is a drug, and you can overdose.</p><p>It’s <em>easy</em> to add Unifi access points—addictively so. They’re not terribly expensive, and if you’re like me, you can over-plan your deployment because no one who knows any better is there to stop you. Much like with heroin, it’s pretty easy to go too far—sure, you <em>can</em> buy five APs to cover a 2600-square-foot house, but you <em>probably shouldn’t.</em> Which is how I found myself on a ladder in my living room, caked in sweat and attic filth, questioning my life choices and sanity. (Past Amudhan, if you’re somehow reading this article via some kind of space-time vortex or causality loop, please pay particular attention to this section.)</p><p>“I want to set up a bunch of VLANs” is a great weekend project to dream about. It’s nowhere near as great when it’s 3am and you’ve broken everything and you can’t go to bed until you at least get the Internet working again.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://failedmachine.com/content/images/2019/06/success.png" class="kg-image" alt="What I've learned from nearly three years of enterprise Wi-Fi at my home"><figcaption><a href="https://imgs.xkcd.com/comics/success.png">Credit: xkcd</a></figcaption></figure><p>“I’m going to set up <a href="https://en.wikipedia.org/wiki/FreeRADIUS">freeRADIUS</a>” sounds like a worthy way to spend some quality time with your servers. It’s a little different when Chrome crashes because you have too many tabs open because you have to keep looking up new arcane error messages because setting up freeRADIUS is actually more complex than building a 1:1 scale reconstruction of St. Peter's Basilica out of matches and tin foil. (It’s still easier than setting up OpenLDAP, but that’s another article.)</p><p>“I can mount a fourth AP right there and push 5GHz into the bedroom” sounds simple enough, until it’s six hours later and you’ve almost fallen through your ceiling four times and you can’t stop bleeding from your forehead from where you scraped yourself on roof nails and you’ve got dust in both eyes.</p><blockquote>I eventually got all of these things, and more.</blockquote><h3 id="the-freedom-to-choose">The freedom to choose</h3><p>That sounds like a heap of bitching about the gear, but it’s not, not really—it’s bitching about my dumb choices. More to the point, it’s bitching that demonstrates <em>why</em> enterprise Wi-Fi deployments at real companies are (or at least should be) the product of careful consideration of requirements, with a planful deployment and appropriate back-out procedures to follow in case things don’t go how they should. When I’m at work, I do those things. But when I’m at home, <em>I do what I want</em>—and then I have to face the consequences for being crazy.</p><p>So, now that I’ve done with the bitching, let me state this unequivocally: I am <em>thrilled</em> with how well my Unifi setup works, and I love having it. I love the look on visitors’ faces when they see my guest Wi-Fi login page. I love finally having solid Wi-Fi coverage in every nook and corner of the house and backyard. I love the security of being able to really and truly shove all the IoT crap into its own isolated and firewalled segment. I love, ultimately, having the freedom to tinker—to do <em>what</em> I want, <em>how</em> I want, <em>when</em> I want, without being shackled to my ISP’s (or anyone else’s) Wi-Fi configuration whims.</p><h3 id="where-we-go-from-here">Where we go from here</h3><p>I like to think that I’ve finally, after more time and cost than I care to admit, achieved homelab nerd nirvana. But who’s kidding whom? Scratching the urge to tinker is not unlike scratching a mosquito bite—you get some temporary relief, but man, the itch comes back <em>quick.</em></p><p>For now, though, I think I’m done buying networking gear. The configuration I’ve landed in checks a whole hell of a lot of boxes—available optical or copper 10-gigabit Ethernet, fast 5GHz Wi-Fi in every room, and a reasonably secure network with appropriate client segregation. The cost wasn’t inconsiderable, but it wasn’t <em>that</em> over the top—creating a similar setup with another OEM’s components would likely incur similar or higher cost if I were going for near-absolute feature parity.</p><p>If it’s not clear by now, I really, <em>really</em> like my Unifi gear. It’s always possible that in a couple of years I’ll rip it out and try something else—gotta scratch that itch, after all—but at least for now, I’m pretty damn happy.</p><h3 id="the-good">The Good</h3><ul><li>This is the Wi-Fi setup I’ve always wanted.</li><li>AP pricing is, for the most part, excellent and makes the gear extremely accessible.</li><li>Extremely in-depth Wi-Fi options for exact cell size and performance tuning.</li><li>Single pane of glass is elegant and easy to use.</li><li>AP integration with switches and router via SDN makes complex config tasks incorporating both wired and wireless gear extremely easy.</li><li>Products are in active development and new features regularly appear.</li></ul><h3 id="the-bad">The Bad</h3><ul><li>You need to know what you’re doing because it’s easy to overcomplicate your setup. (Note: I might not know what I’m doing.)</li><li>Current USG product lineup is problematic if you're not at the high-end.</li><li>Controller software required for that SDN goodness.</li><li>You <em>will</em> need to spend time planning and configuring to get the most out of this gear—plug-n-go is possible, but full functionality requires work.</li><li>Wireless uplink is still, in my experience, not reliable enough for production use (but your mileage may vary).</li><li>The Wi-Fi side is great, but there’s an annoying lack of GUI-exposed features on the routing and switching side.</li><li>If all you care about is single-host raw Wi-Fi speed in benchmarks, you can do better elsewhere.</li><li>Homelabbers or folks obsessed with the perfect setup might spend more money than they’re comfortable with once the Unifi gear gets a foot in the door.</li></ul><h3 id="the-ugly">The Ugly</h3><ul><li>The reality is that you probably don’t need this at home. I know I don’t. But “need” and “want” are very different animals.</li></ul>]]></content:encoded></item><item><title><![CDATA[Wordpress - Destroyer of CPUs]]></title><description><![CDATA[<p>Lately I've been delving into the <a href="http://wordpress.org/">WordPress</a> ecosystem, as it seems to be the most popular CMS platform around at the moment. I've built several sites with it so far. In the process, I've gotten quite comfortable with the setup, interface, and overall operation of WordPress.</p><p>I've been thoroughly impressed</p>]]></description><link>https://failedmachine.com/wordpress-cpu-destroy/</link><guid isPermaLink="false">5c82a1eba8c1a13fed5526d8</guid><dc:creator><![CDATA[Amudhan Manivasagam]]></dc:creator><pubDate>Fri, 08 Mar 2019 17:37:11 GMT</pubDate><media:content url="https://failedmachine.com/content/images/2019/03/fix-wordpress-briefly-unavailable-for-scheduled-maintenance.png" medium="image"/><content:encoded><![CDATA[<img src="https://failedmachine.com/content/images/2019/03/fix-wordpress-briefly-unavailable-for-scheduled-maintenance.png" alt="Wordpress - Destroyer of CPUs"><p>Lately I've been delving into the <a href="http://wordpress.org/">WordPress</a> ecosystem, as it seems to be the most popular CMS platform around at the moment. I've built several sites with it so far. In the process, I've gotten quite comfortable with the setup, interface, and overall operation of WordPress.</p><p>I've been thoroughly impressed with the community around WordPress, and the software itself is remarkably polished. That's not to say that I haven't run into a few egregious bugs in the newest release, but on the whole, the experience has been good bordering on pleasant.</p><p>Or at least it <em>was</em>, until I noticed how much CPU time the PHP FastCGI process was using for <a href="https://signaturecakes.in">a modest little website</a>.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://failedmachine.com/content/images/2019/03/cpu-before.png" class="kg-image" alt="Wordpress - Destroyer of CPUs"><figcaption>Running on a windows webserver VM running apache with a single vCPU dedicated entirely to it</figcaption></figure><p>This is an <em>incredibly</em> scary result; this website is getting, at best, a <strong>moderate trickle of incoming traffic</strong>. It's barely linked anywhere! With that kind of CPU load level, this site would fall over instantaneously if it got remotely popular, or God forbid, anywhere <em>near</em> the front page of a social bookmarking website.</p><p>For a bare-bones site which is doing approximately nothing, this is a completely unacceptable result. It's appalling.</p><p>As evidence of what a systemic problem this is, there's an entire cottage industry built around shoehorning better caching behavior into WordPress. Take your pick: WP-Cache, WP-Super-Cache, or Bad Behavior. The caching add-ins don't work very well under IIS because they assume they're running on a *NIX platform, but they can be coerced into working.</p><p>Does it work? Does it ever. Here's what CPU usage looks like with basic WP-Cache type functionality enabled:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://failedmachine.com/content/images/2019/03/cpu-after.png" class="kg-image" alt="Wordpress - Destroyer of CPUs"><figcaption>CPU usage after caching was enabled</figcaption></figure><p>I'm not alone; just do a web search on <a href="http://www.google.com/search?q=wordpress+%27cpu+usage%27">WordPress CPU usage</a> or <a href="http://www.google.com/search?q=wordpress+%27digg+effect%27">WordPress Digg Effect</a> and you'll find page after page of horror stories, most (all?) of which are solved by the swift and judicious application of the WP-Cache plugins.</p><p>It's not like this a new issue. Personally, I think it's absolutely irresponsible that <strong>WP-Cache like functionality isn't already built into WordPress.</strong> I would not even consider deploying WordPress anywhere without it.</p><p>A default WordPress install will query the database twenty times every time you refresh the page, even if not <em>one single element</em> on that page has changed. Doesn't that strike you as a bad idea? Maybe even, dare I say it, <em>sloppy programming?</em></p><p>I understand that users may have umpteen thousand <a href="http://wordpress.org/extend/plugins/">WordPress plugins</a> installed, all of which demand to change on every page load. Yes, the easiest path, the path of least resistance, is to mindlessly query the database every time you're building a page. But I <em>cannot</em> accept that a default, bare-bones WordPress install hasn't the first clue how to cache and avoid expensive, redundant trips to the database.</p><p>It's frustrating, because caching is a completely solved problem in other programming communities. For example, the .NET framework has had <a href="http://msdn2.microsoft.com/en-us/library/aa478965.aspx">page output caching</a> and <a href="http://msdn2.microsoft.com/en-us/library/h30h475z(VS.71).aspx">page fragment output caching</a> baked into ASP.NET for years.</p><p>I sure am glad <a href="https://failedmachine.com/ghost-post/">I started this blog with Ghost</a>, but I shudder to think of the number of times the Failed Machine web server would have been completely incapacitated by the naive -- no, that's too tame -- brainlessly stupid dynamic rendering approach WordPress uses.</p><p>What I just don't understand is why, after all these years, and all these documented problems, WordPress hasn't <strong>folded WP-Cache into the core</strong>. If you're ever planning to have traffic of any size on a WordPress blog, consider yourselves warned.</p><blockquote>Just a few days before this post; a friend pointed out that the Query Cache is extremely important to performance, and for some reason it defaulted to off (zero size) on my installation. You may also want to look into <a href="http://www.xaprb.com/blog/2006/07/02/innotop-mysql-innodb-monitor/">innotop</a> and <a href="http://hackmysql.com/mysqlreport">mysqlreport</a> to ensure that all your MySQL caches are functioning at appropriate levels. It is badly needed.</blockquote>]]></content:encoded></item><item><title><![CDATA[Bad Apples eventually become toxic]]></title><description><![CDATA[<p>As my role at the<a href="https://www.simunglobal.org"> South Indian Model United Nations</a> grows increasingly more complex, I draw parallels with yet another excerpt that a fellow redditor posted:</p><blockquote>I was part of a team writing an web-based job application and screening system (a job kiosk the customer called it) and my team</blockquote>]]></description><link>https://failedmachine.com/bad-apples/</link><guid isPermaLink="false">5c61d2e7a8c1a13fed5526c4</guid><dc:creator><![CDATA[Amudhan Manivasagam]]></dc:creator><pubDate>Mon, 11 Feb 2019 20:09:43 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1543812997-ad049e8a208c?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=1080&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1543812997-ad049e8a208c?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjExNzczfQ" alt="Bad Apples eventually become toxic"><p>As my role at the<a href="https://www.simunglobal.org"> South Indian Model United Nations</a> grows increasingly more complex, I draw parallels with yet another excerpt that a fellow redditor posted:</p><blockquote>I was part of a team writing an web-based job application and screening system (a job kiosk the customer called it) and my team and our customer signed on to implementing this job kiosk using Windows, Apache, PHP5, and the ZendFramework -- everyone except one of our team members, who I will refer to as "Joe". Joe kept advocating the use of JavaScript throughout the technology deliberation phase, even though the customer made it quite clear that he expected the vast majority of the job kiosk to be implemented using a server-side technology and all the validation should be done using server-side technology.The fact that the customer signed off on this, however, did nothing to deter Joe from advocating JavaScript -- abrasively. Every time our project hit a bump in the road, Joe would go off on some tirade on how much easier our lives would be if we were only writing this job kiosk in JavaScript. Joe would constantly bicker about how we were all doing this all wrong because we weren't doing it in JavaScript, not even bother to learn the technologies we were actually using, and, whenever fellow teammates would try and gently bring him back into the fold (usually via email), Joe would just flame the poor guy. At the height of Joe's pro-JavaScript bigotry, he would regularly belt off comments like, "Well, if we had only done it in JavaScript," to such an extent that the team would have been better off if he had just quit (or was reassigned or fired.)</blockquote><p>After reading this story, I had to resist the urge to lean forward, hand placed thoughtfully under my chin, brow furrowed, and ask -- have you tried designing?</p><p>I first thought this story was a cautionary tale about technology dependence, but now, I see something else: <strong>a problem team member, a classic bad apple</strong>.</p><figure class="kg-card kg-image-card"><img src="https://blog.codinghorror.com/content/images/uploads/2008/07/6a0120a85dcdae970b0120a86df121970b-pi.jpg" class="kg-image" alt="Bad Apples eventually become toxic"></figure><p>I'm sure "Joe" had the best of intentions, but at the point where you're actively campaigning against the project, and working against your teammates -- <strong>you're a liability to the project</strong>.</p><p>The cost of problem personnel on a project is severe, from personal experience:</p><blockquote>If you tolerate even one person whom the other people think is a problem, you'll hurt the morale of the good people. You are implying that not only do you expect your team members to give their all; you expect them to do it when their co-workers are working against them. In a review of 32 management teams, Larson and LaFasto found that <strong>the most consistent and intense complaint from team members was that their team leaders were unwilling to confront and resolve problems associated with poor performance by individual team members.</strong> (Larson and LaFasto 1989). They report that, "more than any other single aspect of team leadership, members are disturbed by leaders who are unwilling to deal directly and effectively with self-serving or noncontributing team members." They go on to to say that this is a significant management blind spot because managers nearly always think their teams are running more smoothly than their team members do.</blockquote><p>How do we identify problem personnel? It's not difficult as you might think. I had a friend of mine once describe someone on his team as -- and this is a direct quote -- "a cancer". At the point which you, or anyone else on your team, are using words like <em>cancer</em> to describe a teammate, you have a serious project pathology. You don't have to be friends with everyone on your team, although it certainly helps, but a level of basic personal and professional respect is mandatory for any team to function normally.</p><p>Here's an outline of a few warning signs that you're dealing with a bad apple on your team:</p><ol><li>They cover up their ignorance rather than trying to learn from their teammates. "I don't know how to explain my design; I just know that it works." or "My rationale is too complicated for you to understand." (These are both actual quotes.)</li><li>They have an excessive desire for privacy. "I don't need anyone to review my work."</li><li>They are territorial. "No one else can fix it. I'm too busy to fix them right now, but I'll get to them next week."</li><li>They grumble about team decisions and continue to revisit old discussions long after the team has moved on. "I still think we ought to go back and change the design we were talking about last month. The one we picked isn't going to work."</li><li>Other team members all make wisecracks or complain about the same person regularly. Team members often won't complain directly, so you have to ask if there's a problem when you hear many wisecracks.</li><li>They don't pitch in on team activities. On one project I worked on, two days before our first major deadline, a teammate asked for the day off. The reason? He wanted to spend the day watching a new movie that had just come out in a nearby city -- a clear sign he hadn't integrated with the team.</li></ol><p>Let me be quite clear on this point: if your team leader or manager isn't dealing with the bad apples on your project, <strong>he/she isn't doing her job</strong>.</p><p>You should never be afraid to remove -- or even fire -- people who do not have the best interests of the team at heart. You can develop skill, but you can't develop a positive attitude. The longer these disruptive personalities stick around on a project, the worse their effects get. They'll slowly spread poison throughout your project, in the form of design, code, relationships, and contacts.</p><p>Removing someone from a team is painful; it's not fun for anyone. But <strong>realizing you should have removed someone six months ago</strong> is far more painful.</p>]]></content:encoded></item><item><title><![CDATA[Coding: Isn't It Just Writing?]]></title><description><![CDATA[<p>As my formal education in computer science progresses, I have now discovered an unexpected relationship between coding and writing.</p><p>There is perhaps no single greater way to articulate and delve deeper into one's thoughts than writing. It's one of those essential feelings you discover in high school or college, and</p>]]></description><link>https://failedmachine.com/coding-just-writing/</link><guid isPermaLink="false">5c3e1bd8a8c1a13fed5526b3</guid><dc:creator><![CDATA[Amudhan Manivasagam]]></dc:creator><pubDate>Tue, 15 Jan 2019 18:13:15 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1504639725590-34d0984388bd?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=1080&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1504639725590-34d0984388bd?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjExNzczfQ" alt="Coding: Isn't It Just Writing?"><p>As my formal education in computer science progresses, I have now discovered an unexpected relationship between coding and writing.</p><p>There is perhaps no single greater way to articulate and delve deeper into one's thoughts than writing. It's one of those essential feelings you discover in high school or college, and then spend the rest of your life wondering why people waste time using other <em>less-efficient</em> forms of media to get their point across.</p><p>This is all well and good if you plan to become a writer, but what's the connection between this timeless little book and writing a computer program?</p><p>Writing programs that the computer can understand is challenging. That's why so few people, in the big scheme of things, become competent programmers. But writing paragraphs and sentences that your fellow humans can understand -- well, that's even <em>more</em> difficult. The longer you write programs and the older you get, eventually you come to realize that in order to truly succeed, <strong>you have to write programs that can be understood by both the computer <em>and</em> your fellow programmers.</strong></p><!--kg-card-begin: markdown--><pre><code>/*Code Readability*/

if (readable()){
    be_happy();
}else{
    refactor();
}
</code></pre>
<!--kg-card-end: markdown--><p>Of all the cruel tricks in software engineering, this has to be the cruelest. Most of us entered this field because the machines are so much more logical than people. And yet, even when you're writing code explicitly intended for the machine, you're still <em>writing</em>. For other people. Fallible, flawed, distracted human beings just like you. And that's the truly difficult part.</p><p>I think that's what Knuth was getting at with <a href="http://www.literateprogramming.com/knuthweb.pdf">his concept of Literate Programming</a>. <a href="http://www.literateprogramming.com/knuthweb.pdf">(link to a pdf)</a></p><blockquote><strong>The practitioner of literate programming can be regarded as an essayist, whose main concern is with exposition and excellence of style.</strong> Such an author, with thesaurus in hand, chooses the names of variables carefully and explains what each variable means. He or she strives for a program that is comprehensible because its concepts have been introduced in an order that is best for human understanding, using a mixture of formal and informal methods that reinforce each other.</blockquote><p>This is, of course, much easier said than done. <strong>Most of us spend our entire lives learning how to write effectively. </strong>I'd like to highlight one (very popular) rule that I keep coming back to, over and over again; I think it serves as a helpful guidepost for great code:</p><h3 id="omit-needless-words">Omit Needless Words</h3><blockquote>Vigorous writing is concise. A sentence should contain no unnecessary words, a paragraph no unnecessary sentences, for the same reason that a drawing should have no unnecessary lines and a machine no unnecessary parts. This requires not that the writer make all his sentences short, or that he avoid all detail and treat his subjects only in outline, but that every word tell.</blockquote><p>What does this say to you about your writing?About your code?<br>Coding, after all, is just writing.</p><p>How hard can it be?</p>]]></content:encoded></item><item><title><![CDATA[The journey to eBooks - Bits vs. Atoms]]></title><description><![CDATA[I adore words, but let's face it: books suck in a lot of ways. Beautiful ideas have been helplessly trapped in physical books for the last few centuries....]]></description><link>https://failedmachine.com/ebooks-bits-vs-atoms/</link><guid isPermaLink="false">5c2086dba8c1a13fed552699</guid><dc:creator><![CDATA[Amudhan Manivasagam]]></dc:creator><pubDate>Mon, 24 Dec 2018 08:53:18 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1542412138098-8f997794d3d1?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=1080&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1542412138098-8f997794d3d1?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjExNzczfQ" alt="The journey to eBooks - Bits vs. Atoms"><p></p><p>Before I begin, I've given this topic a fair bit of thought; and at the expense of welcoming controversy and haters; here goes.</p><p><strong>It's been just over a decade since the launch of the first industry-changing eBook reader - The Kindle in 2007.</strong><br><strong>So why aren't we all using eBooks already?</strong></p><p>I adore words, but let's face it: books suck in a lot of ways.</p><p>More specifically, so many beautiful ideas have been helplessly trapped in physical books for the last few centuries.</p><p>How do books suck? Let me make a list:</p><!--kg-card-begin: markdown--><ul>
<li>Books are heavy.</li>
<li>Books take up a lot of space.</li>
<li>Books have to be printed.</li>
<li>Books have to be carried and shipped in trucks.</li>
<li>Aren't always available at a library.</li>
<li>Must be purchased at a bookstore.</li>
<li>Difficult to find</li>
<li>Books are difficult to search within.</li>
<li>Some books are too expensive.</li>
<li>Books aren't interactive.</li>
<li>They cannot be updated for errors and addendums.</li>
<li>Books are often copyrighted.</li>
<li>The worst of them all: Books can go out of print entirely.</li>
</ul>
<!--kg-card-end: markdown--><p>What is the point of a bookshelf packed with books other than an antiquated trophy case of amazing ideas, trapped in awkward, constantly-deteriorating, temporary physical relics?</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://images.unsplash.com/photo-1526721940322-10fb6e3ae94a?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=1080&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" class="kg-image" alt="The journey to eBooks - Bits vs. Atoms"><figcaption>Photo by <a href="https://unsplash.com/@technobulka?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit">Stanislav Kondratiev</a> / <a href="https://unsplash.com/?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit">Unsplash</a></figcaption></figure><p>I've now convinced myself that books should not be celebrated. Words, ideas and concepts should be celebrated. Books <em>were necessary</em> to store these things, simply because we didn't have any other viable form to contain them. But now, we do.</p><h3 id="words-belong-on-the-internet">Words Belong on the Internet</h3><p>At the risk of stating the obvious, if your goal is to get a written idea in front of as many human beings as efficiently as possible, you shouldn't be publishing dead-tree-books. You should be editing a wiki, writing a blog, or building a website.<br>That's exactly why <a href="https://mediadecoder.blogs.nytimes.com/2012/03/13/after-244-years-encyclopaedia-britannica-stops-the-presses/">Encyclopedia Britannica officially went out of print</a> in 2012, after a 244 year print run.</p><p>In a straight-up battle between paper and web, Britannica lost. Big time.<br>This is why book scanning efforts of <a href="https://archive.org">The Internet Archive</a> and libraries around the world are so important - to unlock the knowledge trapped in those books and place it online so the entire world can benefit.</p><p>In the never-ending human quest for communication, bits have decisively won over atoms. But bits haven't completely replaced atoms - Yet. That will take a few more decades.</p><h3 id="an-argument-for-the-ebook">An Argument for the eBook</h3><p>While the Internet is perfectly adequate for basic printed text juxtaposed with images, videos and tables, it is a far cry from the <strong>eye-catching, beautiful, complex layout and typography of modern books.</strong></p><p>Sometimes, the medium is part of the message. That's what led computer science to create PostScript and TeX, systems of representing the printed page using code and mathematics that can scale infinitely - packaging written content as a special file format preserves those beautiful layouts so you can <strong>read the text as the author intended.</strong></p><p>It's also fair that <strong>writers should be paid for their work. </strong>Nobody is going to pay a rupee for every webpage. The commercial model of packaging content into a book and selling it has existed for longer than most people would admit.</p><p>You can't always rely on the Internet being available. What if you have a bad/unusable connection? You could periodically download what you need as a packaged file. Local files have <strong>built in, persistent offline availability.</strong></p><p>I don't think the Internet will kill the book. But it will radically transform their form permanently. Books will no longer be pages printed with atoms; but rather <strong>files printed with bits: eBooks. </strong>This is already apparent in the fact that most writers these days use a computer to write their books - instead of pen and paper; why not publish the same way as well? Right?</p><h3 id="the-problem-with-using-bits">The Problem with using Bits</h3><p>The journey of migrating from atoms to bits is not easy, and we're only looking at the beginning of this journey. eBooks are vastly more flexible than printed books, but they come with their own set of tradeoffs:</p><!--kg-card-begin: markdown--><ul>
<li>They require a reading device</li>
<li>eBooks cannot be loaned to friends</li>
<li>Cannot be resold to others</li>
<li>You can't really donate an eBook to a library</li>
<li>Copy protection</li>
<li>They might come in a format that your eBook reader doesn't understand</li>
<li>Incomplete, obsolete or broken page layouts</li>
<li>They may have low resolution images that are worse than print</li>
<li>They may have a substantially worse reading experience than print except on very high resolution reading devices.</li>
</ul>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://failedmachine.com/content/images/2018/12/6a0120a85dcdae970b016303f1aafc970d-800wi.jpg" class="kg-image" alt="The journey to eBooks - Bits vs. Atoms"></figure><p>I'd say that the copy protection is the worst of them all. With eBooks, <strong>book publishers now have an <em>unprecedented </em>level of control over when, where and how you can read their books.</strong></p><p>In the world of atoms, once the book is shipped out, the publisher cedes all control to the reader. Once you buy that physical book, you can do whatever you will: read it, burn it, and here's a popular one: photocopy it (for personal use), share it, resell it, loan it, donate it, use it as a monitor stand (guilty as charged) and even throw it at a burglar's face as a weapon.</p><p>In the world of bits, the publisher has an iron grip over <strong>their eBook </strong>and it isn't sold to you as it is "licensed for use", maybe even only on their specific devices (ahem...Kindle). And they can <a href="https://www.theregister.co.uk/2009/07/18/amazon_removes_1984_from_kindle/">silently remove the book <strong>from your device</strong></a><strong> </strong>at <strong>their whim.</strong></p><p>In the brave new world of eBooks, publishers are waking up <strong>drunk with new power</strong>. And I can't say I blame them. After an eternity of publishers having virtually no control over the books they publish, they've now been given near <em>total control.</em></p><h3 id="how-much-do-ebooks-cost">How much do eBooks cost?</h3><p>Consider one of my favorite books, <a href="https://www.amazon.in/dp/9332542864/ref=pd_lpo_sbs_dp_ss_1?pf_rd_p=cd818f9c-142a-4b42-ad2c-f0421857aaf5&amp;pf_rd_s=lpo-top-stripe&amp;pf_rd_t=201&amp;pf_rd_i=0321344758&amp;pf_rd_m=A1VBAL9TL5WCBF&amp;pf_rd_r=R8GVC4HA0PTBWHSP1X5T&amp;pf_rd_r=R8GVC4HA0PTBWHSP1X5T&amp;pf_rd_p=cd818f9c-142a-4b42-ad2c-f0421857aaf5">Don't Make Me Think</a>. How much does it cost to buy, as an eBook or otherwise?</p><!--kg-card-begin: markdown--><p><a href="https://www.amazon.in/dp/9332542864/ref=pd_lpo_sbs_dp_ss_1?pf_rd_p=cd818f9c-142a-4b42-ad2c-f0421857aaf5&amp;pf_rd_s=lpo-top-stripe&amp;pf_rd_t=201&amp;pf_rd_i=0321344758&amp;pf_rd_m=A1VBAL9TL5WCBF&amp;pf_rd_r=R8GVC4HA0PTBWHSP1X5T&amp;pf_rd_r=R8GVC4HA0PTBWHSP1X5T&amp;pf_rd_p=cd818f9c-142a-4b42-ad2c-f0421857aaf5">Amazon print</a> - ₹450<br>
<a href="https://www.amazon.in/Dont-Make-Think-Revisited-Usability-ebook/dp/B00HJUBRPG/ref=tmm_kin_swatch_0?_encoding=UTF8&amp;qid=&amp;sr=">Amazon eBook</a> - ₹475<br>
<a href="http://www.mypearsonstore.com/bookstore/dont-make-me-think-revisited-a-common-sense-approach-9780321965516?xid=PSED">Publisher print</a> - $45 (which is ₹3150 at the time of writing)<br>
<a href="http://www.informit.com/store/dont-make-me-think-revisited-a-common-sense-approach-9780133597264">Publisher eBook</a> - $36 (which is ₹2520 at the time of writing)</p>
<!--kg-card-end: markdown--><p>Strangely enough, the Amazon eBook is <strong>more expensive than the print version. </strong>This...makes no sense. How can bits in the digital version, that require no printing, no shipping and no physical storage whatsoever, be <em><strong>more expensive </strong></em>than the atoms?</p><h3 id="and-what-do-ebooks-look-like">And what do eBooks look like?</h3><p>Don't even get me started on this one. What you end up reading when you buy an eBook can vary wildly. And here's where you'll understand why it's worth buying the publisher's version of the eBook.</p><p>Here's a a couple of scanned pages from my copy of the book:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://failedmachine.com/content/images/2018/12/scanned-pages.png" class="kg-image" alt="The journey to eBooks - Bits vs. Atoms"><figcaption>Scanned pages from my copy of the book</figcaption></figure><p>If you <a href="http://www.informit.com/store/dont-make-me-think-revisited-a-common-sense-approach-9780133597264">buy the eBook from the publisher</a>, you get a PDF which is based on the <strong>exact, same data </strong>used to print the book. The footnotes, layout, typography and text are almost completely left intact. <em>It's almost like a scanned copy of a physical book.</em></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://failedmachine.com/content/images/2018/12/publisher-ebook.png" class="kg-image" alt="The journey to eBooks - Bits vs. Atoms"><figcaption>The very same pages of the book from the publisher's eBook</figcaption></figure><p><a href="https://www.amazon.in/Dont-Make-Think-Revisited-Usability-ebook/dp/B00HJUBRPG/ref=tmm_kin_swatch_0?_encoding=UTF8&amp;qid=&amp;sr=) - ₹475 [Publisher print](http://www.mypearsonstore.com/bookstore/dont-make-me-think-revisited-a-common-sense-approach-9780321965516?xid=PSED">Buy the eBook from Amazon</a> however, and you're presented with a proprietary eBook format which contains very little (or none) of the original formatting. Footnotes are missing. Font colors and styles are lost. And for the strangest reason, it now take 4 pages to read one page worth of content from the print book. <em>It's almost as though the pages of the book were broken.</em></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://failedmachine.com/content/images/2018/12/amazon-ebook.png" class="kg-image" alt="The journey to eBooks - Bits vs. Atoms"><figcaption>The same pages; from Amazon's eBook</figcaption></figure><h3 id="so-ebooks-suck-as-well-now-what">So eBooks suck as well, now what?</h3><p>I intentionally chose a book that highlights the remaining gap between atoms and bits. I've read dozens of other eBooks and the experience is great. <strong>For books that are entirely text, with very little layout, the various eBook formats do a great job. </strong>This is the majority of books in the world.</p><p>All eBook formats handle text and basic fonts perfectly fine. But then, so does the Internet. If an eBook can't outperform the Internet at layout, it loses the strongest argument in it's favor.</p><p>Even so, there's no way that Amazon's version of eBooks are suitable replacements for the print version. Worse, you won't even know what you're missing out on until you compare it with a print version. <br><strong>That's disappointing.</strong></p><p>We, as readers, are giving up just as much as we're getting in the transition from books made of atoms to eBooks made of bits. To make it worthwhile, I think publishers and resellers (like Amazon) need to do two things:</p><!--kg-card-begin: markdown--><ol>
<li>
<p><strong>eBooks should be inexpensive.</strong> I can't lend them, I can't resell them, I can't buy a cheaper used copy, because I can only read them on all &quot;supported&quot; (basically their own) readers under whatever terms the publisher will allow me to, <strong>an eBook simply has less utility and value to me.</strong> Right now, eBooks are far less flexible than physical books and therefore a worse value. Yet, they are far cheaper to produce and sell for everyone involved. <em>The pricing absolutely has to reflect this.</em> If I can get a new copy of a book for less than the eBook, no sale and <em><strong>screw you.</strong></em></p>
</li>
<li>
<p><strong>eBooks should be a near-perfect replica of the print book.</strong> With the advent of high-resolution displays; it's possible for eBook readers to have high visual fidelity - almost just as good as the print book. I don't want to spend money on an overpriced eBook reader with a crappy display and pay extra for a worse, broken reading experience. <em>Give me an eBook that I would be confident in handing to my children with the same confidence my dad gave me his.</em></p>
</li>
</ol>
<!--kg-card-end: markdown--><h3 id="why">Why?</h3><p>Because I love words. I want to love eBooks. I want to buy lots and lots of eBooks. But unless the publishers are willing to treat eBooks with the same respect and care they give to printed books - and most of all, adjust their pricing to reflect the new economy of bits and not the economy of atoms - they're destined to eventually suffer <a href="http://www.hyperorg.com/blogger/2012/03/20/2b2k-13-reasons-why-the-britannica-failed-on-paper/">the same fate as Encyclopedia Brittanica.</a></p>]]></content:encoded></item><item><title><![CDATA[Please Don't Learn to Code]]></title><description><![CDATA[I'm fast approaching the end of the first semester of my CS course at college and it seems to me that the whole "everyone should learn programming" has gotten out of control. Nearly every course has to have a programming class - even the ones that don't seem to benefit from it whatsoever...]]></description><link>https://failedmachine.com/coding-for-the-sake-of-it/</link><guid isPermaLink="false">5c0145d880a2ae15a5a7b9f4</guid><dc:creator><![CDATA[Amudhan Manivasagam]]></dc:creator><pubDate>Fri, 30 Nov 2018 15:13:08 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1535551951406-a19828b0a76b?ixlib=rb-0.3.5&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=1080&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ&amp;s=93f908af7d2e4fd51a1351bf20e764dc" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1535551951406-a19828b0a76b?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjExNzczfQ&s=93f908af7d2e4fd51a1351bf20e764dc" alt="Please Don't Learn to Code"><p>I'm fast approaching the end of the first semester of my CS course at college and it seems to me that the whole "everyone should learn programming" has gotten out of control. Nearly every course has to have a programming class - even the ones that don't seem to benefit from it whatsoever.</p><p>Definitely a great step to improve technological awareness; although if a person designing buildings actually needs to <em>commit JavaScript code to do his job</em>, something is deeply, horribly, terribly wrong with the methods people use to design buildings. The education definitely seems to be at fault here.</p><!--kg-card-begin: markdown--><pre><code>10 PRINT "I have no clue why I need programming"
20 GOTO 10</code></pre><!--kg-card-end: markdown--><p>Fortunately, the odds of something like that happening - even in jest are near-zero for good reason. Designers and creators will hopefully spend their time doing real work instead. To those who argue programming is an essential skill that everyone should learn, right up there with reading, writing and math: <strong>can you explain to me how an aerospace engineer would be better at his day to day job of designing better airplanes if he woke up one morning as a crack Java coder? </strong>It's obvious to me (and you) how being a skilled reader, writer and basic high-school math are fundamental to the job of an engineer. Or <em>any </em>job for that matter. But understanding variables, functions, pointers and recursion? I can't see it.</p><p>Look, I love programming. I believe it is important...in the right context, for some people - probably a computer person. But so are a lot of skills. CS students aren't forced to learn how to analyze structural stresses. In fact, I would no more urge everyone to learn programming than I would urge everyone to learn plumbing. That'd be ridiculous, right?</p><!--kg-card-begin: markdown--><blockquote>
<p>&quot;If we don't learn to plumb, we risk being plumbed ourselves...plumb, or be plumbed.&quot;</p>
</blockquote>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p>The &quot;everyone should learn to code&quot; movement isn't just wrong because it falsely equates coding with essential life skills like reading, writing and math. I wish. It is wrong in so many other ways.</p>
<ul>
<li>It assumes that more code in the world is an inherently desirable thing. In my experience, I have found this...not to be the case. Should you learn to code? No, I can't answer that for you. You should be learning to <em>write as little code as possible</em>. Ideally none.</li>
<li>It assumes that coding is the goal. &quot;Non-programmers&quot; like to think that software developers and programmers are addicts who just write code. But it's not. Their job is to solve problems. <em>Don't celebrate the creation of code, celebrate the creation of solutions.</em></li>
<li>It puts the method before the problem. Don't get me wrong. I love computers - they are the single most powerful tool in solving problems. But that's exactly what they are - <strong>a tool.</strong> Before you go rushing out to learn to code, <em>figure out what exactly you're going to solve</em>. Do you even have a problem? Have you researched it and it's possible solutions? Does coding solve that problem? <em>Are you sure?</em></li>
<li>It assumes that adding naive, novice, not-even-sure-if-they-like-this programmers to the workforce is a net positive for the world. I guess that's true if you consider that one bad programmer can easily create two new jobs a year. The truth is, there are few great programmers out there.</li>
<li>It implies that there's a thin, easily permeable membrane between learning to program and getting paid to program. While programming is an egalitarian field where degrees and certifications are irrelevant in the face of experience, you still gotta put a lot of hours behind honing your skill before even thinking about getting paid to program.</li>
</ul>
<!--kg-card-end: markdown--><p>I can support everyone learning a tiny bit <strong>about </strong>programming<strong> </strong>just so you can recognize when code might be the most appropriate way to solve a problem. But then again, I can recognize a plumbing problem without any prior training in the area. The average Joe could benefit a lot more from a basic understanding of how computers and the internet work; being able to navigate on the internet is becoming a basic life skill and we should be worried about fixing that first.</p><!--kg-card-begin: markdown--><p>The tech around us has achieved Clarkian levels of magic for the vast majority of people, and most of us still don't understand how it all works. You don't learn to build a car to get your driving license; you learn to drive it.</p>
<p><strong>Please don't advocate learning to code just for the sake of learning how to code.</strong> Or worse, for the promises of fat paychecks. Instead, I humbly suggest that we spend our spare time learning how to...</p>
<ul>
<li>Try and understand the fundamentals of how things around us work.</li>
<li>Communicate with other human beings.</li>
<li>Other skills that extend far beyond coding and will help you in every aspect of your life.</li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Persuade the Lobbyist-in-Chief]]></title><description><![CDATA[<p>I recently read <a href="http://www.africa.upenn.edu/Articles_Gen/Letter_Birmingham.html">Letter from a Birmingham Jail</a> by Martin Luther King Jr. and what I absolutely love about the letter – beyond the incredible emotion – is that it illustrates just how powerful of a force persuasion really is. In the hands of a madman or demagogue, dangerously powerful. It works</p>]]></description><link>https://failedmachine.com/persuade-the-lobbyist-in-chief/</link><guid isPermaLink="false">5bdde63b80a2ae15a5a7b99f</guid><dc:creator><![CDATA[Amudhan Manivasagam]]></dc:creator><pubDate>Sat, 03 Nov 2018 18:48:10 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1505682614136-0a12f9f7beea?ixlib=rb-0.3.5&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=1080&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ&amp;s=86386b48ce6407d473588330df2ffe17" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1505682614136-0a12f9f7beea?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjExNzczfQ&s=86386b48ce6407d473588330df2ffe17" alt="Persuade the Lobbyist-in-Chief"><p>I recently read <a href="http://www.africa.upenn.edu/Articles_Gen/Letter_Birmingham.html">Letter from a Birmingham Jail</a> by Martin Luther King Jr. and what I absolutely love about the letter – beyond the incredible emotion – is that it illustrates just how powerful of a force persuasion really is. In the hands of a madman or demagogue, dangerously powerful. It works so well that it exposes the unavoidable truth: <strong>to have any hope of influencing others, <em>you must be able to persuade them</em>.</strong></p><p>An engineer that I found on Reddit - VP at a software firm, thinks of himself not as a CEO or boss, but as the Lobbyist-in-Chief. I believe that could be re-written as Persuader-in-Chief with no loss of meaning or nuance.</p><blockquote>I was recently asked how I run our development team. I said, “Well, <strong>basically I write about something I think we should do, and if the blog post convinces the developers, they do it. If not, I lobby for it, and if that fails too, the idea falls on the floor.</strong> They need my approval to launch something, but that’s it. That’s as much ‘running things’ as I do, and most of the ideas come from other people at this point, not from me and my posts. I’ve argued against some of our most successful ideas, so it’s a good thing I don’t try to exert more control.”I’m exaggerating somewhat; of course I haven’t written about all of our ideas yet. But I do think of myself as Lobbyist-in-Chief, and I have lots of good examples of cases where I failed to talk people into an idea and it didn’t happen as a result. One person I said this to asked, “So who holds the product vision, then?” and I replied, “Well, I guess I do,” but really that’s not right. We all do. The product is the result of the ideas that together we’ve agreed to pursue. I recruit people based on their interest in and enthusiasm about the ideas and then set them loose, and we all talk and listen constantly. That’s how it works — and believe it or not, it does work.</blockquote><p>So how do we persuade? Primarily, I think, when we lead by example. Even if that means getting down on your knees and cleaning a toilet to show someone else how it's done. But maybe you're not a leader. Maybe you're just a lowly peon. Even as a peon, it's still possible to persuade your team and those around you. A commenter summarized this grassroots method of persuasion nicely:</p><ul><li>His ideas were, on the whole, pretty good.</li><li>He worked mostly bottom-up rather than top-down.</li><li>He worked to gain the trust of others first by dogfooding his own recommendations before pushing them on others.</li><li>He was patient and waited for the wheels to turn.</li></ul><p>Science and data are among the best ways to be objectively persuasive, but remember that data alone isn't the reductionist end of every single topic.</p><p>If measured by click data alone, all Internet advertising should have breasts in it. Incorporate data, by all means. But you need to tell a bigger, grander, more inspiring story than that to be truly <em>persuasive</em>.</p><p>I believe that <a href="http://www.africa.upenn.edu/Articles_Gen/Letter_Birmingham.html">letter from a Birmingham jail</a> is the single best persuasive essay I've ever read. It is remarkably persuasive without ever resorting to anger, incivility, or invective. But do more than just read; <em>study</em> it. How does it work? Why does it work? Does it cite any data? What techniques make this essay so incredibly compelling?</p><figure class="kg-card kg-image-card"><img src="https://failedmachine.com/content/images/2018/11/letterfrombirminghamjail_0.jpg" class="kg-image" alt="Persuade the Lobbyist-in-Chief"></figure><p>Nobody ever changed anything by remaining quiet, idly standing by, or blending into the faceless, voiceless masses. If you ever want to effect change, in your work, in your life, <strong>you must learn to persuade others</strong>.</p>]]></content:encoded></item></channel></rss>