<?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"><channel><title><![CDATA[davidosomething.com]]></title><description><![CDATA[Computers and stuff]]></description><link>https://www.davidosomething.com</link><generator>GatsbyJS</generator><lastBuildDate>Tue, 25 Oct 2022 04:04:07 GMT</lastBuildDate><item><title><![CDATA[/uses-2021]]></title><description><![CDATA[I keep this post updated throughout 2021. Some of the links below are affiliate links. This means that, at zero cost to
you, I may earn a…]]></description><link>https://www.davidosomething.com/uses-2021/</link><guid isPermaLink="false">https://www.davidosomething.com/uses-2021/</guid><pubDate>Mon, 29 Mar 2021 20:31:48 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/81e46f8460314a4f91ac907f57d17740/01dae/desk-2021.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 125%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAZCAYAAAAxFw7TAAAACXBIWXMAAAsTAAALEwEAmpwYAAAGwElEQVQ4yx3O21fThwHA8d+2dlpn6wUFgoGQ+z0hARITkgBJCCFgAEO4yk0ugmJBuQpapFwKKPe73RSL9tjiVq2iq8cdrW490+6c7WE7Zw/7P/KW787pw+f9I9SfvcjOnXWWF2fZ2d7i6eMHrK7Msbk2/4uO9rNMT17juz/usPdklxc/fM/3j3a5MTvNgwf32dt7wtO9J/z5h2c8f76HUF7Vwr3tDVaWbnDv7hbPnn7D6so8G2sL3NpYpLmxjtGRfjY3lpiZmWJycpyRkWE6z5+nuqaOvt7LDPb3MTQ4wPDwMEKwtI6d7XVWlmbZubvJ86ffsro6z/rqAptrC9TXVbN9a4md7U2i0WoqK6qoiVZyZ3WD14/3+Mt3j3j1+DHbKytMT4wieAIRbn+5xPLSNHdur/F87yHLy3OsrMyztbHMzBdjfP3Vxi9jjcaMXmfBkmFldXqe//7tZ/7z5q/8793P7H55m47mOoRsV5DlpVkWFqa4u73Fnx5tM3tzjPGJEW7OjDN+pZf5mVHu3tnAoLeiVpnQ6UwsfD7Fv1+/5adnL/jHyx/ZmlukouwUgs0d5MbMGMvL48wtT9DeX0HkbAH1bTWcKfXjUKtxud18vbOJSmFEKtEikSgZG/yM9y/ecuf2E17tvWZpaoZTRQEEqdZGz+VO6jvKqe2J0tBViTnXjDfsIux3cvy4CJ3BzK2tBYrDZeS7vWg1Jnrae3j15C27uz/y/s2/WJxeIBgMIHR2fcrU5BVaO2sZuN5LdWs99kI7BeFc1CYlKekyiisi3F+fpTcaoe1cG6PXr3Ou81Ma6loYHp6kd2SVxqaLuPzFCHM3Jxj7rI+hvi6ufTZMsKGFZI0Ej9uFJduKSiUnz2VnoKWagFqDOF2B0Wiho7ODnr5+7n+zy9ZX39LZM4TD40cYvdrPYN8FWpsrudwUoa2qHItGjU0txyxLR5smQZYiRiuR4LNno9ebSRGlEvR7GRsb46d373n77p+8fPN3Nv5wD2F4oJvL3RcYGRzB4zxJXYGdFreRxlCA06XVFBSU0X6ui4H+QaoiUXy+IDk5ediyHYQKC5mZnODevQc8fLTH85dvEJraqhm82MXWxCqfD01izcxi/74DWKUphO0ZlPmDdFzoZ/X3O+w8eMjA4FXy84NYrCfR6q04sx3URirxF5ZREa1FKDntpyJSyplQmPWRCeaGJ7Cas9j/cQIahYzTPiehk1b8Tg+19ecojzaR4ypCo8tEodCTacvDnJXHCaOfA4dPIOSVOLD7vZg1eq5WlrF+ZYyZji48lgx8fh8Bbx75ThsOrYwCkwaH0YLDFURv8SCV6zGaHZisHqQ6B0kiKUKWx0C6QYox083AKR+LHc34jSbcsnQK9VpcqWL0iUlIU8RUhQN01ZRQnGXCYcrE7ghicRSRke3DoNSjEqcheAuzsDlMqFRaBmqq6CjKJ1MuwywS4VXI8chkeKQyMkUiTFIZl7o7WVucpK8pSpU7ixJPLlalmvwsK6FgCMHrtxAoyCPxWCJnHBlstEa5VJJPekICJyVp5Mrl2CTpGFPTUSaKUCan0NnazNrGMr0XWvHqZQTdTgYG+ikOlSDUR8vRq1WIRckcP5pAb0keay0RTGIxmoRj6FIlGCQyHHIlXqUKQ3IKpsRkdDIFHx86xqGjyZgzrHRfPI8334fQWluBJEWEPE1Muug4TrWYyWiAwqxMlDItdqWGkNlK2JSBR6FCfiwRkziNQwc+4YMPP0KcKuc3H3yEJE2K46QTobEijDE9BbvqBGV2BZU5Slp8RhxmE0aZinyNjoDBjFetQXIkAZNGRzgUIlmUyr79B0mTqDjwu8P86tf7EIulCFV+O5VOOZ0hA70RK0G7lqAjA0mqhKMHP8GSmoZNKkVy9Bh6tZau9rOcLglhNhg5fCQRsVjOh789wJGjyaTJ9AjjTW6mzuYw1ZbLtcY8PGYV4RwTZrWChIOHSTucwPFDCaQkJSOTSMl1eTjfVEN5kQ+lQk1CQgqiEzJ0GS4UOhvC+kAkPnUuGL/a4I8PnvHHh5uC8aH6QNyfrY9rJKlxdboknpupi0tEKfEMlSwuTkqK67W6eOWpQFyjUMYN5pNxq7MwrjG74hqTKy4s9Tcy3hlltKWEyc5ShprDlPtyaCx201uVS0PISaknE5dBjsuoxGvVIk4SoU8/QdAfxOkrR5+ZhyEzD1O2D2FpqCN2o7c1duNSU2ywORJrCAdiV1orYkNN4VhXJC92ptAWK3RYY6dzDLESuy5WlKWNFViUsYHu7lj7xSsxoy0/luEoiJls/pjZXhD7P2OG4AV4LU0dAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/81e46f8460314a4f91ac907f57d17740/cbe2e/desk-2021.webp 148w,
/static/81e46f8460314a4f91ac907f57d17740/3084c/desk-2021.webp 295w,
/static/81e46f8460314a4f91ac907f57d17740/5ca24/desk-2021.webp 590w,
/static/81e46f8460314a4f91ac907f57d17740/c71bf/desk-2021.webp 721w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/81e46f8460314a4f91ac907f57d17740/12f09/desk-2021.png 148w,
/static/81e46f8460314a4f91ac907f57d17740/e4a3f/desk-2021.png 295w,
/static/81e46f8460314a4f91ac907f57d17740/fcda8/desk-2021.png 590w,
/static/81e46f8460314a4f91ac907f57d17740/01dae/desk-2021.png 721w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/81e46f8460314a4f91ac907f57d17740/fcda8/desk-2021.png&quot;
            alt=&quot;My desk as of 2021-03-29&quot;
            title=&quot;My desk as of 2021-03-29&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I keep this post updated throughout 2021.&lt;br&gt;
Some of the links below are affiliate links. This means that, at zero cost to
you, I may earn a commission if you click through the link and finalize
a purchase.&lt;/p&gt;
&lt;h2 id=&quot;physical-setup&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#physical-setup&quot; aria-label=&quot;physical setup permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Physical setup&lt;/h2&gt;
&lt;p&gt;I sit on a limited edition &lt;a href=&quot;https://www.lauradavidsondirect.com/collections/soho-pad&quot;&gt;SOHO Premier Soft Pad Management Chair&lt;/a&gt; in brown
Italian leather with a matte black aluminum frame. My previously chair was
a generic padded dining chair, but it broke and now I use the seat as a foot
rest.&lt;/p&gt;
&lt;p&gt;My desk is a 48”x24” &lt;a href=&quot;https://store.hermanmiller.com/office/conference-tables/everywhere-rectangular-table/3383.html&quot;&gt;Herman Miller Everywhere Rectangular Table&lt;/a&gt;. I wish
I had gone with the white finish and legs for the table.&lt;/p&gt;
&lt;p&gt;A giant &lt;a href=&quot;https://amzn.to/2Pb1NGi&quot;&gt;AUKEY mouse pad&lt;/a&gt; covers the top, granting unlimited mouse travel, and
it’s much nicer to have a soft surface than to place my wrists on the bare
desktop.&lt;/p&gt;
&lt;p&gt;In the corner of the desk is an &lt;a href=&quot;https://amzn.to/3dlQtAg&quot;&gt;Amazon Basics Magazine Rack&lt;/a&gt; to hold mail and
to-do paper items I eventually have to go through.&lt;/p&gt;
&lt;p&gt;I have a nice &lt;a href=&quot;https://amzn.to/32ganpY&quot;&gt;Poppin file cabinet&lt;/a&gt; that doubles as a second seat.&lt;/p&gt;
&lt;h2 id=&quot;hardware&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#hardware&quot; aria-label=&quot;hardware permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Hardware&lt;/h2&gt;
&lt;h3 id=&quot;main-computer&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#main-computer&quot; aria-label=&quot;main computer permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Main computer&lt;/h3&gt;
&lt;p&gt;My primary computer is a &lt;a href=&quot;https://forums.macrumors.com/forums/mac-pro.1/&quot;&gt;Mac Pro 5,1 2010&lt;/a&gt;. I bought it in an office
liquidation auction in 2016. It’s considered end-of-life by Apple, but with
third party support through &lt;a href=&quot;https://github.com/acidanthera/OpenCorePkg&quot;&gt;OpenCore bootloader&lt;/a&gt; I’m able to continue
updating it.&lt;/p&gt;
&lt;p&gt;I upgraded it with a wireless AC/bluetooth 4 card, 48GB of RAM, a &lt;a href=&quot;https://amzn.to/3af7lGY&quot;&gt;SAPPHIRE
PULSE RX580&lt;/a&gt;, two &lt;a href=&quot;https://amzn.to/3v0xCkp&quot;&gt;NVMe drives using PCI-E adapters&lt;/a&gt; and several SSDs.&lt;/p&gt;
&lt;p&gt;For peripherals, I use&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;a href=&quot;https://amzn.to/3wcr83h&quot;&gt;31.5-inch wide LED light bar&lt;/a&gt; clamped to my desk&lt;/li&gt;
&lt;li&gt;A 27-inch &lt;a href=&quot;https://amzn.to/3toSJMO&quot;&gt;Lenovo P27u-10&lt;/a&gt; 4K IPS Monitor with a built-in USB hub&lt;/li&gt;
&lt;li&gt;A &lt;a href=&quot;https://amzn.to/3rCPHTk&quot;&gt;VIVO desk mount&lt;/a&gt; holds the monitor&lt;/li&gt;
&lt;li&gt;An &lt;a href=&quot;https://amzn.to/3fm30Fi&quot;&gt;Apple Magic Keyboard&lt;/a&gt; because I got used to the Apple scissor feel&lt;/li&gt;
&lt;li&gt;A &lt;a href=&quot;https://amzn.to/3sAWSwL&quot;&gt;VicTsing gaming mouse&lt;/a&gt; silent click and USB rechargeable. I’ve used at
least 5 other silent click mice from Amazon, and this one is so far the
winner.&lt;/li&gt;
&lt;li&gt;A &lt;a href=&quot;https://amzn.to/39pD1c5&quot;&gt;Fujitsu ScanSnap S1300i&lt;/a&gt; scanner because I scan everything important&lt;/li&gt;
&lt;li&gt;A &lt;a href=&quot;https://www.usa.canon.com/internet/portal/us/home/products/details/printers/inkjet-single-function/ip-series/ip110&quot;&gt;Canon PIXMA iP110 printer&lt;/a&gt; which is really slim&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Everything plugs in to a &lt;a href=&quot;https://amzn.to/3dlicje&quot;&gt;Belkin 8-Outlet surge protector&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;media-computer&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#media-computer&quot; aria-label=&quot;media computer permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Media computer&lt;/h3&gt;
&lt;p&gt;I use an &lt;a href=&quot;https://amzn.to/3afGKJQ&quot;&gt;Intel NUC 7i5BNH&lt;/a&gt; as a secondary computer. It is outfitted with&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An &lt;a href=&quot;https://amzn.to/3uXvvxo&quot;&gt;ElecGear iNUC-H Vertical Stand&lt;/a&gt; to take up less desk space&lt;/li&gt;
&lt;li&gt;32GB RAM, which is just adequate these days&lt;/li&gt;
&lt;li&gt;A 500GB &lt;a href=&quot;https://amzn.to/3cwF6oE&quot;&gt;Samsung 970 EVO NVMe&lt;/a&gt; for the OS + /home&lt;/li&gt;
&lt;li&gt;A 500GB &lt;a href=&quot;https://amzn.to/2PiZa51&quot;&gt;Samsung 850 EVO SSD&lt;/a&gt; for document storage&lt;/li&gt;
&lt;li&gt;A &lt;a href=&quot;https://www.logitech.com/en-us/product/wireless-touch-keyboard-k400-plus&quot;&gt;Logitech K400 Plus&lt;/a&gt; keyboard+trackpad&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;phone&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#phone&quot; aria-label=&quot;phone permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Phone&lt;/h3&gt;
&lt;p&gt;I’m an Android user on a &lt;a href=&quot;https://amzn.to/3gkLeTv&quot;&gt;Pixel 4a&lt;/a&gt;. My particular favorite apps are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.samruston.twitter&quot;&gt;Flamingo for Twitter&lt;/a&gt; though I don’t think it’s available any more&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.laurencedawson.reddit_sync.pro&quot;&gt;Sync Pro&lt;/a&gt; for reddit&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=au.com.shiftyjelly.pocketcasts&amp;#x26;hl=en_US&quot;&gt;PocketCasts&lt;/a&gt; briefly switched to &lt;a href=&quot;https://play.google.com/store/apps/details?id=de.danoeh.antennapod&quot;&gt;AntennaPod&lt;/a&gt; but now back&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.devhd.feedly.classic&quot;&gt;Feedly Classic&lt;/a&gt; you can’t “mark page as read” with the same ease in the new
version&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.brave.browser&quot;&gt;Brave&lt;/a&gt; blocks ads and is Chromium-based&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tachiyomi.org/&quot;&gt;Tachiyomi&lt;/a&gt; for reading endless amounts of manhua and isekai trash.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;audio&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#audio&quot; aria-label=&quot;audio permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Audio&lt;/h3&gt;
&lt;p&gt;On my main computer, I use &lt;a href=&quot;https://amzn.to/3syEO6d&quot;&gt;Sony MDR7506 headphones&lt;/a&gt; that I never put on my
head. I use them as terrible speakers even though they’re highly praised
studio headphones. They’re connected to a &lt;a href=&quot;https://amzn.to/2OajG7C&quot;&gt;Nobsound NS-08E&lt;/a&gt; preamp, which
I mostly use for the physical volume knob.&lt;/p&gt;
&lt;p&gt;My going-out headphones are &lt;a href=&quot;https://amzn.to/31sbqmt&quot;&gt;Samsung Galaxy Buds+&lt;/a&gt;, paired only to my phone.&lt;/p&gt;
&lt;p&gt;My work headphones are &lt;a href=&quot;https://amzn.to/2Rz6gDf&quot;&gt;Bose SoundSport Wireless Headphones&lt;/a&gt;, paired only to
my work computer.&lt;/p&gt;
&lt;h3 id=&quot;watch&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#watch&quot; aria-label=&quot;watch permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Watch&lt;/h3&gt;
&lt;p&gt;White &lt;a href=&quot;https://www.kickstarter.com/projects/getpebble/pebble-time-awesome-smartwatch-no-compromises&quot;&gt;Pebble Time&lt;/a&gt; running &lt;a href=&quot;http://rebble.io/&quot;&gt;rebble&lt;/a&gt; services. I’ve had two pebbles, both
Kickstarter backer editions. I still consider the Time the best smartwatch.&lt;/p&gt;
&lt;h2 id=&quot;software&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#software&quot; aria-label=&quot;software permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Software&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/davidosomething/dotfiles&quot;&gt;My dotfiles&lt;/a&gt;, vimrc, zshrc, and &lt;a href=&quot;https://github.com/davidosomething/dotfiles/blob/dev/chromium/extensions.md&quot;&gt;Chrome extensions&lt;/a&gt; of choice are in GitHub
if that’s what you’re into.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/1af6cfeb1e8fb96f135664bfb11c0af0/c6bbc/terminal-potatopro.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 68.91891891891892%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAAsTAAALEwEAmpwYAAACiklEQVQ4y52TW08TURSFeTMxilzrtMztdKbTaaelTAu13ATkZmJQgxCJCSHGhIuPmnCHENBEjfFZA7RT4K9g5An5RZ+ZaUUaedGHLzuTk7Nmrb33qft5cUGxVOTk5Iij4zIlr8RR2aNYLLK/f1jh4A8HB4ccljyKXjmg5B3hlY/5+m2f09Pv1O19+ERYUTBMDcPSaFMiqGobpqUiDAUjpqEKOcD/DkkSzaEwobBcIaIQljVu3LzN/MIidSura9xpbEUYMQZGssRsC9u26O7Jk8vncdJpkqkUqfZMUDVhoOrRKwiEYdLUEmJhcakimMlGeTxZYHK6wOjDHN1dDuNDXWRzeRJOOviZrOrIqgiqooka9KhJQ1NLRfDdzjYvx3K8nRnmzfQQz8fyuBmb8aFOOlyXZKod5RqRq/iuLwX3trZ54rQz19PPXHcfjzKddKQTDPZ34WZzQVTfQZuiVV3qly5/1xrB9fUNHhRGmJt6xYuns8xMzDLYW2BiNMf9/m7yhR7cXBfpjEvSSWMnU5ctuNbh8vIKkrC4NzJBdmCcVGEQJ2niuhmSaZe4bWPE4piWHQzhusg1PfSHUt/QjCZMZEUnomgkLIfd+Ufsbi2xvPOFx1PPCN0NV2JWo8qqVkHR0PQodxqbK4Ibm5tIEYl4Io4Zj6EbgpTjMNyTpa8vT+/gGO1uloisXvZNFQa6YQUIM45hJYLdXFh6Td37j58x7SRutgMzbiEMAxEVSLJKqyQTuisRjig1EX1BLRpD9zEsojGbplapIriyshpEVnXjyq6JoF9+FLW6yH/1zh9KdeI1Q1ldW+dWfUNwEG5T/gv/rq8RPL3z83NKJQ/PK1fx/p1ymWKxxI+zM34BEaLkyb3CNJIAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/1af6cfeb1e8fb96f135664bfb11c0af0/cbe2e/terminal-potatopro.webp 148w,
/static/1af6cfeb1e8fb96f135664bfb11c0af0/3084c/terminal-potatopro.webp 295w,
/static/1af6cfeb1e8fb96f135664bfb11c0af0/5ca24/terminal-potatopro.webp 590w,
/static/1af6cfeb1e8fb96f135664bfb11c0af0/dad35/terminal-potatopro.webp 885w,
/static/1af6cfeb1e8fb96f135664bfb11c0af0/92674/terminal-potatopro.webp 910w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/1af6cfeb1e8fb96f135664bfb11c0af0/12f09/terminal-potatopro.png 148w,
/static/1af6cfeb1e8fb96f135664bfb11c0af0/e4a3f/terminal-potatopro.png 295w,
/static/1af6cfeb1e8fb96f135664bfb11c0af0/fcda8/terminal-potatopro.png 590w,
/static/1af6cfeb1e8fb96f135664bfb11c0af0/efc66/terminal-potatopro.png 885w,
/static/1af6cfeb1e8fb96f135664bfb11c0af0/c6bbc/terminal-potatopro.png 910w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/1af6cfeb1e8fb96f135664bfb11c0af0/fcda8/terminal-potatopro.png&quot;
            alt=&quot;My terminal&quot;
            title=&quot;My Terminal&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;CLI tools I use include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/sharkdp/fd&quot;&gt;fd&lt;/a&gt; for finding files and directories&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/junegunn/fzf&quot;&gt;fzf&lt;/a&gt; for fuzzy finding integrated with git, vim, and my shell&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/BurntSushi/ripgrep&quot;&gt;ripgrep&lt;/a&gt; for finding and filtering files by contents&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/zdharma/zinit&quot;&gt;zinit&lt;/a&gt; for managing my zsh plugins&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.coma/ajeetdsouza/zoxide&quot;&gt;zoxide&lt;/a&gt; a fast implementation of autojump / z&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On the mac I use Catalina and am scared of Big Sur. I use iTerm2 because
I like its window splitting features above all other terminal emulators.&lt;/p&gt;
&lt;p&gt;On the NUC and on a second boot drive on the mac I use &lt;a href=&quot;https://manjaro.org/&quot;&gt;Manjaro&lt;/a&gt; Linux KDE
version. Manjaro has the benefits of Arch Linux (IMO, primarily pacman and the
AUR) without having to do the setup for the millionth time. Konsole is my
terminal emulator because it is non-electron, supports splitting without tmux,
24-bit color, customizable shortcuts and scrollback.&lt;/p&gt;
&lt;h3 id=&quot;editor&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#editor&quot; aria-label=&quot;editor permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Editor&lt;/h3&gt;
&lt;p&gt;I still use the HEAD release of &lt;a href=&quot;https://neovim.io&quot;&gt;Neovim&lt;/a&gt; having moved from Vim years ago.&lt;/p&gt;
&lt;p&gt;I made my own color scheme called ”&lt;a href=&quot;https://github.com/davidosomething/vim-colors-meh&quot;&gt;meh&lt;/a&gt;.” It caters to what I consider
important when looking at code.&lt;/p&gt;
&lt;p&gt;My programming font of choice is Mozilla’s &lt;a href=&quot;https://mozilla.github.io/Fira/&quot;&gt;Fira Mono&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f5633de8f1f77b5b300bc8ce79c4a311/90712/vim-potatonuc.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 89.1891891891892%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADQ0lEQVQ4y31TS47bRhTUORKLZH/ZH/5FiqSkkTQaj53JBFkk2XmbTe7kkxhaGb6BCXjlAxheemeQKqNb8mTGCLIo1Osmu7qK73G2WL14vWhv32b1/k1W7455sz86LpeHY7+7O/a7X4/99u7Ybl4eu+2dr4vl4YLrY9XeHPPm+k2zunm72z9/PVuUm4+vfvkHq/aAzdUB/WqPzdUN2m7reX/9Erv9LdabA7p+h6Zdo1lusGyv0HY7VE2HsupQVR2Uth9nlMr3RqWoqvrrctmNdd2M7bIbm7oZl007luViLMtqNNqOWpmxKfrRmnRMkmwUUo4v+t/HVJdfgyAEoeL9jBAxRBEF53KKY+0YjAmQkPja7WltobWBkgb36z/BmQQhDO5cbmoIFk9ekIlhRpkcCOHI82IqyhL3279Q5x2UMRAixnweIQguCAl+evYzwpB4RBHDPAgRhtHkxAnjw0ypZOBcIcvyabvf4nb3G+62fyDLCxiTuhhPQKk81+TJenKmHhy6m2JlprpZwKoMhW4QEeqju5vDkHp+jLND6l1GEZnc2jskVAzuoIit33QRns3n/kAQRg/x/guPxB8LyoGx2D2Yzk4YvH3CnuDshF2eX2rCz4iYP+sjy9gOXXeFvt9Odd2jrJbI8gWybIE0rTznRY2iaFCUjecsr5FmCyiVQusUcZxMQiZgInZN0UPX9Vit1pPj5bJzDfIjc44TgRKGPM5QZBnyPIXNLdJCQVsOYymsJZOUHK4fM6XNsKgb1E0zVZW71UBK5UfGRXPfhlKOXElYFSNNE6SJhRYxYq1hrYbRfFJKgLrIXnDRYN1upyRJz80InjYjIgxGCBgZI7EWqTFQIkbiZpULUMIn11jKxTBL03Q47J7j1f3fD4I/jodzyoiA5LF3yyOB2KeQl8EnfrApl8PM2GRoux5ZkU9pmv8wY/8KupoxAmMIhCSQMoJSDu6TkMm9cxG0w3q9gvvZo4iewpCcPEeOiV9Tyk6EONBTUZBTnpFTkpCT1vSktWMySnkRZNx8cO1n3HjwCz+uubBwYyFEAikTxOrMbv0d8jw2H2ZBSN8FIfsShOxTGLHPQcQ+f+eHOnSg/4dPQUi/RJS/+wayOwb6gvRXfAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/f5633de8f1f77b5b300bc8ce79c4a311/cbe2e/vim-potatonuc.webp 148w,
/static/f5633de8f1f77b5b300bc8ce79c4a311/3084c/vim-potatonuc.webp 295w,
/static/f5633de8f1f77b5b300bc8ce79c4a311/5ca24/vim-potatonuc.webp 590w,
/static/f5633de8f1f77b5b300bc8ce79c4a311/9d646/vim-potatonuc.webp 882w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/f5633de8f1f77b5b300bc8ce79c4a311/12f09/vim-potatonuc.png 148w,
/static/f5633de8f1f77b5b300bc8ce79c4a311/e4a3f/vim-potatonuc.png 295w,
/static/f5633de8f1f77b5b300bc8ce79c4a311/fcda8/vim-potatonuc.png 590w,
/static/f5633de8f1f77b5b300bc8ce79c4a311/90712/vim-potatonuc.png 882w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/f5633de8f1f77b5b300bc8ce79c4a311/fcda8/vim-potatonuc.png&quot;
            alt=&quot;Neovim in Konsole&quot;
            title=&quot;Neovim in Konsole&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;note-taking&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#note-taking&quot; aria-label=&quot;note taking permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Note Taking&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://standardnotes.org/&quot;&gt;Standard Notes&lt;/a&gt; is my note-taking app for the moment. My criteria are full,
audited encryption, markdown support, and automatic syncing. I left
&lt;a href=&quot;https://joplinapp.org/&quot;&gt;Joplin Notes&lt;/a&gt; because the WebDav sync was giving me issues (though it could
have been my server).&lt;/p&gt;
&lt;h3 id=&quot;password-manager&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#password-manager&quot; aria-label=&quot;password manager permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Password manager&lt;/h3&gt;
&lt;p&gt;My password manager is &lt;a href=&quot;https://bitwarden.com/&quot;&gt;Bitwarden&lt;/a&gt;. I moved off of &lt;a href=&quot;https://keepassxc.org/&quot;&gt;KeepassXC&lt;/a&gt; to make it
easier on my family, but they are equally good to me.&lt;/p&gt;
&lt;h3 id=&quot;file-sync-and-backups&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#file-sync-and-backups&quot; aria-label=&quot;file sync and backups permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;File sync and backups&lt;/h3&gt;
&lt;p&gt;I’ve done my best to stop using Dropbox, just so I have one less account to
manage. I use Google Drive for one-off document sharing and syncing app
settings on any app that natively supports it.&lt;/p&gt;
&lt;p&gt;For everything else I use my &lt;a href=&quot;https://www.synology.com/&quot;&gt;Synology NAS&lt;/a&gt;. My phone automatically backs up
photos to it using DS File.&lt;/p&gt;
&lt;p&gt;The NAS is running &lt;a href=&quot;https://gitea.io/&quot;&gt;Gitea&lt;/a&gt; on Docker. I have my GitHub and GitLab repos are
mirrored in case either of those services go down or missing. On both my NUC
and Mac (when using Linux), I have &lt;code&gt;/etc&lt;/code&gt; backed up using &lt;a href=&quot;https://joeyh.name/code/etckeeper/&quot;&gt;etckeeper&lt;/a&gt; and
pushing to a remote repo in Gitea.&lt;/p&gt;
&lt;p&gt;Google Drive is synced to my NAS as well. Everything is backed up using
&lt;a href=&quot;https://restic.net/&quot;&gt;restic&lt;/a&gt;, which send encrypted, incremental snapshots to &lt;a href=&quot;https://www.backblaze.com/&quot;&gt;Backblaze B2&lt;/a&gt;.&lt;/p&gt;
&lt;style class=&quot;grvsc-styles&quot;&gt;
  .grvsc-container {
    overflow: auto;
    position: relative;
    -webkit-overflow-scrolling: touch;
    padding-top: 1rem;
    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));
    padding-bottom: 1rem;
    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));
    border-radius: 8px;
    border-radius: var(--grvsc-border-radius, 8px);
    font-feature-settings: normal;
    line-height: 1.4;
  }
  
  .grvsc-code {
    display: table;
  }
  
  .grvsc-line {
    display: table-row;
    box-sizing: border-box;
    width: 100%;
    position: relative;
  }
  
  .grvsc-line &gt; * {
    position: relative;
  }
  
  .grvsc-gutter-pad {
    display: table-cell;
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  .grvsc-gutter {
    display: table-cell;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter::before {
    content: attr(data-content);
  }
  
  .grvsc-source {
    display: table-cell;
    padding-left: 1.5rem;
    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));
    padding-right: 1.5rem;
    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));
  }
  
  .grvsc-source:empty::after {
    content: &apos; &apos;;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter + .grvsc-source {
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  /* Line transformer styles */
  
  .grvsc-has-line-highlighting &gt; .grvsc-code &gt; .grvsc-line::before {
    content: &apos; &apos;;
    position: absolute;
    width: 100%;
  }
  
  .grvsc-line-diff-add::before {
    background-color: var(--grvsc-line-diff-add-background-color, rgba(0, 255, 60, 0.2));
  }
  
  .grvsc-line-diff-del::before {
    background-color: var(--grvsc-line-diff-del-background-color, rgba(255, 0, 20, 0.2));
  }
  
  .grvsc-line-number {
    padding: 0 2px;
    text-align: right;
    opacity: 0.7;
  }
  
&lt;/style&gt;</content:encoded></item><item><title><![CDATA[/uses-2020]]></title><description><![CDATA[This post is out of date and is for archive/comparison purposes only.
See the 2021 post here Physical setup My desk is a 48”x24” Herman…]]></description><link>https://www.davidosomething.com/uses-2020/</link><guid isPermaLink="false">https://www.davidosomething.com/uses-2020/</guid><pubDate>Sun, 22 Dec 2019 04:09:21 GMT</pubDate><content:encoded>&lt;p&gt;This post is out of date and is for archive/comparison purposes only.
See the &lt;a href=&quot;/uses-2021&quot;&gt;2021 post here&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;physical-setup&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#physical-setup&quot; aria-label=&quot;physical setup permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Physical setup&lt;/h2&gt;
&lt;p&gt;My desk is a 48”x24” &lt;a href=&quot;https://store.hermanmiller.com/office/conference-tables/everywhere-rectangular-table/3383.html&quot;&gt;Herman Miller Everywhere Rectangular Table&lt;/a&gt;. I wish
I had gone with the white finish and legs for the table.&lt;/p&gt;
&lt;p&gt;A giant &lt;a href=&quot;https://www.amazon.com/gp/product/B00QM9KL5M&quot;&gt;AUKEY mouse pad&lt;/a&gt; covers the top, granting unlimited mouse travel, and
it’s much nicer to have a soft surface than to place my wrists on the bare
desktop.&lt;/p&gt;
&lt;p&gt;I sit on a limited edition &lt;a href=&quot;https://www.lauradavidsondirect.com/products/soho-premier-soft-pad-management-chair-brown-leather-black-frame-limited-edition&quot;&gt;SOHO Premier Soft Pad Management Chair&lt;/a&gt; in brown
Italian leather with a matte black aluminum frame. My previously chair was
a generic padded dining chair, but it broke and now I use the seat as a foot
rest.&lt;/p&gt;
&lt;p&gt;I have a nice &lt;a href=&quot;https://www.poppin.com/White-%2B-Light-Gray-Mini-Stow-2-Drawer-File-Cabinet%2C-Rolling-104771+%3A+104732.html&quot;&gt;Poppin file cabinet&lt;/a&gt; that doubles as a second seat.&lt;/p&gt;
&lt;h2 id=&quot;hardware&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#hardware&quot; aria-label=&quot;hardware permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Hardware&lt;/h2&gt;
&lt;h3 id=&quot;main-computer&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#main-computer&quot; aria-label=&quot;main computer permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Main computer&lt;/h3&gt;
&lt;p&gt;My primary computer is a &lt;a href=&quot;https://forums.macrumors.com/forums/mac-pro.1/&quot;&gt;Mac Pro 5,1 2010&lt;/a&gt;. I bought it in an office
liquidation auction in 2016. It’s considered end-of-life by Apple, but with
third party support I’m able to continue using it.&lt;/p&gt;
&lt;p&gt;I upgraded it with a wireless AC/bluetooth 4 card, 48GB of RAM, a &lt;a href=&quot;https://www.sapphiretech.com/en/consumer/pulse-rx-580-8g-g5&quot;&gt;SAPPHIRE
PULSE RX580&lt;/a&gt;, and an NVMe boot drive along side several SSDs. I use &lt;a href=&quot;https://github.com/acidanthera/OpenCorePkg&quot;&gt;OpenCore
bootloader&lt;/a&gt; for EFI bootscreen and native Catalina support.&lt;/p&gt;
&lt;p&gt;For peripherals, I use&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;a href=&quot;https://www.amazon.com/gp/product/B083XJLWND&quot;&gt;31.5-inch wide LED light bar&lt;/a&gt; clamped to my desk&lt;/li&gt;
&lt;li&gt;A 27-inch &lt;a href=&quot;https://www.lenovo.com/us/en/accessories-and-monitors/monitors/professional/p27u-10-a16270up0-27-inch-monitor-hdmi-cd/p/61CBGAR1US&quot;&gt;Lenovo P27u-10&lt;/a&gt; 4K IPS Monitor on a…&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.com/gp/product/B00B21TLQU&quot;&gt;VIVO desk mount&lt;/a&gt; clamped to my desk&lt;/li&gt;
&lt;li&gt;An &lt;a href=&quot;https://www.amazon.com/gp/product/B016QO64FI&quot;&gt;Apple Magic Keyboard&lt;/a&gt; because I got used to the Apple scissor feel&lt;/li&gt;
&lt;li&gt;A &lt;a href=&quot;https://www.amazon.com/gp/product/B075M3YY18&quot;&gt;VicTsing gaming mouse&lt;/a&gt; with silent click so as not to wake the baby&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.com/gp/product/B000AJIF4E&quot;&gt;Sony MDR7506 headphones&lt;/a&gt; that I never put on my head… I use them as
terrible speakers even though they’re highly praised studio headphones&lt;/li&gt;
&lt;li&gt;Some generic 7 port USB 3.0 powered hub&lt;/li&gt;
&lt;li&gt;A USB 3.0 Anker hard drive docking station to access my old HDDs&lt;/li&gt;
&lt;li&gt;A &lt;a href=&quot;https://www.amazon.com/Fujitsu-ScanSnap-Portable-Document-Scanner/dp/B008HBFADQ&quot;&gt;Fujitsu ScanSnap S1300i&lt;/a&gt; scanner because I scan everything important&lt;/li&gt;
&lt;li&gt;A &lt;a href=&quot;https://www.usa.canon.com/internet/portal/us/home/products/details/printers/inkjet-single-function/ip-series/ip110&quot;&gt;Canon PIXMA iP110 printer&lt;/a&gt; which is really slim&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Everything plugs in to a &lt;a href=&quot;https://www.amazon.com/gp/product/B000HPV3RW&quot;&gt;Belkin 8-Outlet surge protector&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;media-computer&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#media-computer&quot; aria-label=&quot;media computer permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Media computer&lt;/h3&gt;
&lt;p&gt;I use an &lt;a href=&quot;https://www.intel.com/content/www/us/en/products/boards-kits/nuc/kits/nuc7i5bnh.html&quot;&gt;Intel NUC 7i5BNH&lt;/a&gt; as a media computer, connected to my TV. It is
outfitted with&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;32GB RAM, which is just adequate these days&lt;/li&gt;
&lt;li&gt;A 500GB &lt;a href=&quot;https://www.amazon.com/Samsung-970-EVO-500GB-MZ-V7E500BW/dp/B07BN4NJ2J&quot;&gt;Samsung 970 EVO NVMe&lt;/a&gt; for the OS + /home&lt;/li&gt;
&lt;li&gt;A 500GB &lt;a href=&quot;https://www.amazon.com/Samsung-2-5-Inch-Internal-MZ-75E500B-EU/dp/B00P73B1E4&quot;&gt;Samsung 850 EVO SSD&lt;/a&gt; for document storage&lt;/li&gt;
&lt;li&gt;A &lt;a href=&quot;https://www.logitech.com/en-us/product/wireless-touch-keyboard-k400-plus&quot;&gt;Logitech K400 Plus&lt;/a&gt; keyboard+trackpad&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;phone&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#phone&quot; aria-label=&quot;phone permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Phone&lt;/h3&gt;
&lt;p&gt;I’m an Android user on a Pixel 4a.&lt;/p&gt;
&lt;p&gt;My particular favorite apps are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.samruston.twitter&quot;&gt;Flamingo for Twitter&lt;/a&gt; though I don’t think it’s available any more&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.laurencedawson.reddit_sync.pro&quot;&gt;Sync Pro&lt;/a&gt; for reddit&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=au.com.shiftyjelly.pocketcasts&amp;#x26;hl=en_US&quot;&gt;PocketCasts&lt;/a&gt; briefly switched to &lt;a href=&quot;https://play.google.com/store/apps/details?id=de.danoeh.antennapod&quot;&gt;AntennaPod&lt;/a&gt; but now back&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.devhd.feedly.classic&quot;&gt;Feedly Classic&lt;/a&gt; you can’t “mark page as read” with the same ease in the new
version&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.brave.browser&quot;&gt;Brave&lt;/a&gt; blocks ads and is Chromium-based&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tachiyomi.org/&quot;&gt;Tachiyomi&lt;/a&gt; for reading endless amounts of manhua and isekai trash.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;audio&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#audio&quot; aria-label=&quot;audio permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Audio&lt;/h3&gt;
&lt;p&gt;I use &lt;a href=&quot;https://www.amazon.com/Bose-SoundSport-Wireless-Headphones-Black/dp/B01LZI7KQB&quot;&gt;Bose SoundSport Wireless Headphones&lt;/a&gt;. I haven’t gone full wireless
because I like having the neck wire to hang them from when I’m not wearing
them.&lt;/p&gt;
&lt;h3 id=&quot;watch&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#watch&quot; aria-label=&quot;watch permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Watch&lt;/h3&gt;
&lt;p&gt;White &lt;a href=&quot;https://www.kickstarter.com/projects/getpebble/pebble-time-awesome-smartwatch-no-compromises&quot;&gt;Pebble Time&lt;/a&gt; running &lt;a href=&quot;http://rebble.io/&quot;&gt;rebble&lt;/a&gt; services. I’ve had two pebbles, both
Kickstarter backer editions. I still consider the Time the best smartwatch.&lt;/p&gt;
&lt;h2 id=&quot;software&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#software&quot; aria-label=&quot;software permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Software&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/davidosomething/dotfiles&quot;&gt;My dotfiles&lt;/a&gt;, vimrc, zshrc, and &lt;a href=&quot;https://github.com/davidosomething/dotfiles/blob/dev/chromium/extensions.md&quot;&gt;Chrome extensions&lt;/a&gt; of choice are in GitHub
if that’s what you’re into.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/1af6cfeb1e8fb96f135664bfb11c0af0/c6bbc/terminal-potatopro.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 68.91891891891892%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAAsTAAALEwEAmpwYAAACiklEQVQ4y52TW08TURSFeTMxilzrtMztdKbTaaelTAu13ATkZmJQgxCJCSHGhIuPmnCHENBEjfFZA7RT4K9g5An5RZ+ZaUUaedGHLzuTk7Nmrb33qft5cUGxVOTk5Iij4zIlr8RR2aNYLLK/f1jh4A8HB4ccljyKXjmg5B3hlY/5+m2f09Pv1O19+ERYUTBMDcPSaFMiqGobpqUiDAUjpqEKOcD/DkkSzaEwobBcIaIQljVu3LzN/MIidSura9xpbEUYMQZGssRsC9u26O7Jk8vncdJpkqkUqfZMUDVhoOrRKwiEYdLUEmJhcakimMlGeTxZYHK6wOjDHN1dDuNDXWRzeRJOOviZrOrIqgiqooka9KhJQ1NLRfDdzjYvx3K8nRnmzfQQz8fyuBmb8aFOOlyXZKod5RqRq/iuLwX3trZ54rQz19PPXHcfjzKddKQTDPZ34WZzQVTfQZuiVV3qly5/1xrB9fUNHhRGmJt6xYuns8xMzDLYW2BiNMf9/m7yhR7cXBfpjEvSSWMnU5ctuNbh8vIKkrC4NzJBdmCcVGEQJ2niuhmSaZe4bWPE4piWHQzhusg1PfSHUt/QjCZMZEUnomgkLIfd+Ufsbi2xvPOFx1PPCN0NV2JWo8qqVkHR0PQodxqbK4Ibm5tIEYl4Io4Zj6EbgpTjMNyTpa8vT+/gGO1uloisXvZNFQa6YQUIM45hJYLdXFh6Td37j58x7SRutgMzbiEMAxEVSLJKqyQTuisRjig1EX1BLRpD9zEsojGbplapIriyshpEVnXjyq6JoF9+FLW6yH/1zh9KdeI1Q1ldW+dWfUNwEG5T/gv/rq8RPL3z83NKJQ/PK1fx/p1ymWKxxI+zM34BEaLkyb3CNJIAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/1af6cfeb1e8fb96f135664bfb11c0af0/cbe2e/terminal-potatopro.webp 148w,
/static/1af6cfeb1e8fb96f135664bfb11c0af0/3084c/terminal-potatopro.webp 295w,
/static/1af6cfeb1e8fb96f135664bfb11c0af0/5ca24/terminal-potatopro.webp 590w,
/static/1af6cfeb1e8fb96f135664bfb11c0af0/dad35/terminal-potatopro.webp 885w,
/static/1af6cfeb1e8fb96f135664bfb11c0af0/92674/terminal-potatopro.webp 910w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/1af6cfeb1e8fb96f135664bfb11c0af0/12f09/terminal-potatopro.png 148w,
/static/1af6cfeb1e8fb96f135664bfb11c0af0/e4a3f/terminal-potatopro.png 295w,
/static/1af6cfeb1e8fb96f135664bfb11c0af0/fcda8/terminal-potatopro.png 590w,
/static/1af6cfeb1e8fb96f135664bfb11c0af0/efc66/terminal-potatopro.png 885w,
/static/1af6cfeb1e8fb96f135664bfb11c0af0/c6bbc/terminal-potatopro.png 910w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/1af6cfeb1e8fb96f135664bfb11c0af0/fcda8/terminal-potatopro.png&quot;
            alt=&quot;My terminal&quot;
            title=&quot;My Terminal&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;CLI tools I use include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/sharkdp/fd&quot;&gt;fd&lt;/a&gt; for finding files and directories&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/junegunn/fzf&quot;&gt;fzf&lt;/a&gt; for fuzzy finding integrated with git, vim, and my shell&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/BurntSushi/ripgrep&quot;&gt;ripgrep&lt;/a&gt; for finding and filtering files by contents&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/skywind3000/z.lua&quot;&gt;z.lua&lt;/a&gt; a fast lua implementation if autojump / z&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/zdharma/zinit&quot;&gt;zinit&lt;/a&gt; for managing my zsh plugins&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On the mac I use Catalina. I use iTerm2 because I like its window splitting
features above all other terminal emulators.&lt;/p&gt;
&lt;p&gt;On the NUC I use &lt;a href=&quot;https://manjaro.org/&quot;&gt;Manjaro&lt;/a&gt; Linux KDE version. Manjaro has the benefits of Arch
Linux (IMO, primarily pacman and the AUR) without having to do the setup for
the millionth time. And KDE Plasma is pretty. Konsole is my terminal emulator
because it is non-electron, supports splitting without tmux, 24-bit color,
customizable shortcuts and scrollback. It checks all the boxes for me.
Terminator and Termite are my other terminal choices. I am not using them
because they are libvte-based and I wanted to stay in the KDE world.&lt;/p&gt;
&lt;h3 id=&quot;editor&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#editor&quot; aria-label=&quot;editor permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Editor&lt;/h3&gt;
&lt;p&gt;I still use &lt;a href=&quot;https://neovim.io&quot;&gt;Neovim&lt;/a&gt; having moved from Vim years ago. I follow HEAD since
I’m prudent enough read the Gitter room and changelogs.&lt;/p&gt;
&lt;p&gt;I made my own color scheme called ”&lt;a href=&quot;https://github.com/davidosomething/vim-colors-meh&quot;&gt;meh&lt;/a&gt;.” It caters to what I consider
important when looking at code.&lt;/p&gt;
&lt;p&gt;My programming font of choice is Mozilla’s &lt;a href=&quot;https://mozilla.github.io/Fira/&quot;&gt;Fira Mono&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f5633de8f1f77b5b300bc8ce79c4a311/90712/vim-potatonuc.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 89.1891891891892%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADQ0lEQVQ4y31TS47bRhTUORKLZH/ZH/5FiqSkkTQaj53JBFkk2XmbTe7kkxhaGb6BCXjlAxheemeQKqNb8mTGCLIo1Osmu7qK73G2WL14vWhv32b1/k1W7455sz86LpeHY7+7O/a7X4/99u7Ybl4eu+2dr4vl4YLrY9XeHPPm+k2zunm72z9/PVuUm4+vfvkHq/aAzdUB/WqPzdUN2m7reX/9Erv9LdabA7p+h6Zdo1lusGyv0HY7VE2HsupQVR2Uth9nlMr3RqWoqvrrctmNdd2M7bIbm7oZl007luViLMtqNNqOWpmxKfrRmnRMkmwUUo4v+t/HVJdfgyAEoeL9jBAxRBEF53KKY+0YjAmQkPja7WltobWBkgb36z/BmQQhDO5cbmoIFk9ekIlhRpkcCOHI82IqyhL3279Q5x2UMRAixnweIQguCAl+evYzwpB4RBHDPAgRhtHkxAnjw0ypZOBcIcvyabvf4nb3G+62fyDLCxiTuhhPQKk81+TJenKmHhy6m2JlprpZwKoMhW4QEeqju5vDkHp+jLND6l1GEZnc2jskVAzuoIit33QRns3n/kAQRg/x/guPxB8LyoGx2D2Yzk4YvH3CnuDshF2eX2rCz4iYP+sjy9gOXXeFvt9Odd2jrJbI8gWybIE0rTznRY2iaFCUjecsr5FmCyiVQusUcZxMQiZgInZN0UPX9Vit1pPj5bJzDfIjc44TgRKGPM5QZBnyPIXNLdJCQVsOYymsJZOUHK4fM6XNsKgb1E0zVZW71UBK5UfGRXPfhlKOXElYFSNNE6SJhRYxYq1hrYbRfFJKgLrIXnDRYN1upyRJz80InjYjIgxGCBgZI7EWqTFQIkbiZpULUMIn11jKxTBL03Q47J7j1f3fD4I/jodzyoiA5LF3yyOB2KeQl8EnfrApl8PM2GRoux5ZkU9pmv8wY/8KupoxAmMIhCSQMoJSDu6TkMm9cxG0w3q9gvvZo4iewpCcPEeOiV9Tyk6EONBTUZBTnpFTkpCT1vSktWMySnkRZNx8cO1n3HjwCz+uubBwYyFEAikTxOrMbv0d8jw2H2ZBSN8FIfsShOxTGLHPQcQ+f+eHOnSg/4dPQUi/RJS/+wayOwb6gvRXfAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/f5633de8f1f77b5b300bc8ce79c4a311/cbe2e/vim-potatonuc.webp 148w,
/static/f5633de8f1f77b5b300bc8ce79c4a311/3084c/vim-potatonuc.webp 295w,
/static/f5633de8f1f77b5b300bc8ce79c4a311/5ca24/vim-potatonuc.webp 590w,
/static/f5633de8f1f77b5b300bc8ce79c4a311/9d646/vim-potatonuc.webp 882w&quot;
              sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/f5633de8f1f77b5b300bc8ce79c4a311/12f09/vim-potatonuc.png 148w,
/static/f5633de8f1f77b5b300bc8ce79c4a311/e4a3f/vim-potatonuc.png 295w,
/static/f5633de8f1f77b5b300bc8ce79c4a311/fcda8/vim-potatonuc.png 590w,
/static/f5633de8f1f77b5b300bc8ce79c4a311/90712/vim-potatonuc.png 882w&quot;
            sizes=&quot;(max-width: 590px) 100vw, 590px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/f5633de8f1f77b5b300bc8ce79c4a311/fcda8/vim-potatonuc.png&quot;
            alt=&quot;Neovim in Konsole&quot;
            title=&quot;Neovim in Konsole&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;notes&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#notes&quot; aria-label=&quot;notes permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Notes&lt;/h3&gt;
&lt;p&gt;For note-taking, I converted to &lt;a href=&quot;https://joplinapp.org/&quot;&gt;Joplin Notes&lt;/a&gt; last year. Joplin is
cross-platform including mobile apps; it has markdown support, tagging, and
end-to-end encrypted syncing. The desktop UI is a bit drab, but customizable
via CSS.&lt;/p&gt;
&lt;h3 id=&quot;password-manager&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#password-manager&quot; aria-label=&quot;password manager permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Password manager&lt;/h3&gt;
&lt;p&gt;My password manager is &lt;a href=&quot;https://bitwarden.com/&quot;&gt;Bitwarden&lt;/a&gt;, and I pay for Premium. I moved from
&lt;a href=&quot;https://keepassxc.org/&quot;&gt;KeepassXC&lt;/a&gt; to make sharing some passwords easier with my family.&lt;/p&gt;
&lt;h3 id=&quot;file-sync-and-backups&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#file-sync-and-backups&quot; aria-label=&quot;file sync and backups permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;File sync and backups&lt;/h3&gt;
&lt;p&gt;I wouldn’t be at a loss if I had re-provision with the same settings
and restore my files.&lt;/p&gt;
&lt;p&gt;For file syncing and sharing I use Dropbox and Google Drive (e.g. my resume,
avatars, etc.). I always assume that things in those cloud services can go
public at any time. For super private stuff, I have a &lt;a href=&quot;https://www.synology.com/&quot;&gt;Synology NAS&lt;/a&gt; I can
access.&lt;/p&gt;
&lt;p&gt;My cloud files and local photos and documents are synced to my NAS. I send
encrypted, incremental snapshots of the synced drive to &lt;a href=&quot;https://www.backblaze.com/&quot;&gt;Backblaze B2&lt;/a&gt; using
&lt;a href=&quot;https://restic.net/&quot;&gt;restic&lt;/a&gt; running in a Docker container.&lt;/p&gt;
&lt;p&gt;A few of my GitHub and GitLab repos are mirrored to a local Dockerized &lt;a href=&quot;https://gitea.io/&quot;&gt;Gitea&lt;/a&gt;
server in case either of those services go down or missing. &lt;a href=&quot;https://containrrr.github.io/watchtower/&quot;&gt;Watchtower&lt;/a&gt; keeps
my Docker containers up-to-date automatically.&lt;/p&gt;
&lt;p&gt;On the OS-level, I keep my &lt;code&gt;/etc&lt;/code&gt; backed up using &lt;a href=&quot;https://joeyh.name/code/etckeeper/&quot;&gt;etckeeper&lt;/a&gt;, and push to
a remote git repo as backup.&lt;/p&gt;
&lt;style class=&quot;grvsc-styles&quot;&gt;
  .grvsc-container {
    overflow: auto;
    position: relative;
    -webkit-overflow-scrolling: touch;
    padding-top: 1rem;
    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));
    padding-bottom: 1rem;
    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));
    border-radius: 8px;
    border-radius: var(--grvsc-border-radius, 8px);
    font-feature-settings: normal;
    line-height: 1.4;
  }
  
  .grvsc-code {
    display: table;
  }
  
  .grvsc-line {
    display: table-row;
    box-sizing: border-box;
    width: 100%;
    position: relative;
  }
  
  .grvsc-line &gt; * {
    position: relative;
  }
  
  .grvsc-gutter-pad {
    display: table-cell;
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  .grvsc-gutter {
    display: table-cell;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter::before {
    content: attr(data-content);
  }
  
  .grvsc-source {
    display: table-cell;
    padding-left: 1.5rem;
    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));
    padding-right: 1.5rem;
    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));
  }
  
  .grvsc-source:empty::after {
    content: &apos; &apos;;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter + .grvsc-source {
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  /* Line transformer styles */
  
  .grvsc-has-line-highlighting &gt; .grvsc-code &gt; .grvsc-line::before {
    content: &apos; &apos;;
    position: absolute;
    width: 100%;
  }
  
  .grvsc-line-diff-add::before {
    background-color: var(--grvsc-line-diff-add-background-color, rgba(0, 255, 60, 0.2));
  }
  
  .grvsc-line-diff-del::before {
    background-color: var(--grvsc-line-diff-del-background-color, rgba(255, 0, 20, 0.2));
  }
  
  .grvsc-line-number {
    padding: 0 2px;
    text-align: right;
    opacity: 0.7;
  }
  
&lt;/style&gt;</content:encoded></item><item><title><![CDATA[Website Rebuild for 2020]]></title><description><![CDATA[The 2020 version of davidosomething.com is built on GatsbyJS. At the time of
this writing I am working for Squarespace, a company that…]]></description><link>https://www.davidosomething.com/website-rebuild-2020/</link><guid isPermaLink="false">https://www.davidosomething.com/website-rebuild-2020/</guid><pubDate>Mon, 07 Oct 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The 2020 version of davidosomething.com is built on &lt;a href=&quot;https://www.gatsbyjs.org&quot;&gt;GatsbyJS&lt;/a&gt;. At the time of
this writing I am working for &lt;a href=&quot;https://www.squarespace.com&quot;&gt;Squarespace&lt;/a&gt;, a company that provides a website
builder and CMS as one of its services, so you might wonder why I am not
hosting my blog on that platform. The reason is to branch out my knowledge of
the website creation field, both for work research and as an exercise.&lt;/p&gt;
&lt;h2 id=&quot;changes-since-the-sites-last-iteration&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#changes-since-the-sites-last-iteration&quot; aria-label=&quot;changes since the sites last iteration permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Changes since the site’s last iteration&lt;/h2&gt;
&lt;p&gt;Since the 2016 version, I’ve removed commenting from this site. There’s other
ways to share a post and leave notes (including just tweeting me), so I’ve
opted not to include it.&lt;/p&gt;
&lt;p&gt;The changelog output has not made its way back in, but I will probably
re-introduce it later.&lt;/p&gt;
&lt;h2 id=&quot;thoughts-on-the-tech-stack&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#thoughts-on-the-tech-stack&quot; aria-label=&quot;thoughts on the tech stack permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Thoughts on the tech stack&lt;/h2&gt;
&lt;p&gt;The tech stack I’m using is the &lt;a href=&quot;https://www.gatsbyjs.org&quot;&gt;GatsbyJS&lt;/a&gt; build system and framework, React,
&lt;a href=&quot;https://github.com/css-modules/css-modules&quot;&gt;CSS Modules&lt;/a&gt;, &lt;a href=&quot;https://kyleamathews.github.io/typography.js&quot;&gt;typography.js&lt;/a&gt;, and GraphQL.&lt;/p&gt;
&lt;p&gt;Of those, the one I’d previously never used and I’ve have come to like is CSS
Modules. There are some flaws with the &lt;code&gt;@values&lt;/code&gt; system, but it’s a nice break
from using SASS in personal projects and LESS at work.&lt;/p&gt;
&lt;p&gt;I was introduced to typography.js since I started this blog using
&lt;a href=&quot;https://github.com/gatsbyjs/gatsby-starter-blog&quot;&gt;gatsby-starter-blog&lt;/a&gt;. It provides some nice handling of defaults, but it is
not possible to combine with other frameworks (i.e., you can’t really import
&lt;code&gt;rhythym&lt;/code&gt; and &lt;code&gt;scale&lt;/code&gt; into your CSS Modules are functions AFAIK).&lt;/p&gt;
&lt;p&gt;The GraphQL integration into the GatsbyJS framework has been amazing. I’m
using it to query static JSON and all my old markdown files from this blog.
It’s so much nicer than the configuration based system that &lt;a href=&quot;https://metalsmith.io/&quot;&gt;Metalsmith&lt;/a&gt; had.&lt;/p&gt;
&lt;p&gt;GatsbyJS itself has been very nice. I think the biggest barrier to entry
(provided you already know the other parts of the stack) is figuring out which
&lt;code&gt;gatsby-*.js&lt;/code&gt; file to edit and what they do. I’ve also run into some caching
issues during hot reload development, so I typically start with a &lt;code&gt;gatsby clean&lt;/code&gt; every time I start a coding session.&lt;/p&gt;
&lt;style class=&quot;grvsc-styles&quot;&gt;
  .grvsc-container {
    overflow: auto;
    position: relative;
    -webkit-overflow-scrolling: touch;
    padding-top: 1rem;
    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));
    padding-bottom: 1rem;
    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));
    border-radius: 8px;
    border-radius: var(--grvsc-border-radius, 8px);
    font-feature-settings: normal;
    line-height: 1.4;
  }
  
  .grvsc-code {
    display: table;
  }
  
  .grvsc-line {
    display: table-row;
    box-sizing: border-box;
    width: 100%;
    position: relative;
  }
  
  .grvsc-line &gt; * {
    position: relative;
  }
  
  .grvsc-gutter-pad {
    display: table-cell;
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  .grvsc-gutter {
    display: table-cell;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter::before {
    content: attr(data-content);
  }
  
  .grvsc-source {
    display: table-cell;
    padding-left: 1.5rem;
    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));
    padding-right: 1.5rem;
    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));
  }
  
  .grvsc-source:empty::after {
    content: &apos; &apos;;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter + .grvsc-source {
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  /* Line transformer styles */
  
  .grvsc-has-line-highlighting &gt; .grvsc-code &gt; .grvsc-line::before {
    content: &apos; &apos;;
    position: absolute;
    width: 100%;
  }
  
  .grvsc-line-diff-add::before {
    background-color: var(--grvsc-line-diff-add-background-color, rgba(0, 255, 60, 0.2));
  }
  
  .grvsc-line-diff-del::before {
    background-color: var(--grvsc-line-diff-del-background-color, rgba(255, 0, 20, 0.2));
  }
  
  .grvsc-line-number {
    padding: 0 2px;
    text-align: right;
    opacity: 0.7;
  }
  
&lt;/style&gt;</content:encoded></item><item><title><![CDATA[Lint your markdown files with gulp‑remark‑lint‑dko]]></title><description><![CDATA[I’ve just published on npm, my gulp plugin to lint markdown files using
remark and remark-lint. It’s fully functional right now, and you can…]]></description><link>https://www.davidosomething.com/gulp-markdown-linter/</link><guid isPermaLink="false">https://www.davidosomething.com/gulp-markdown-linter/</guid><pubDate>Fri, 22 Jan 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I’ve just &lt;a href=&quot;https://www.npmjs.com/package/gulp-remark-lint-dko&quot;&gt;published on npm&lt;/a&gt;, my gulp plugin to lint markdown files using
&lt;a href=&quot;https://github.com/wooorm/remark&quot;&gt;remark&lt;/a&gt; and &lt;a href=&quot;https://github.com/wooorm/remark-lint&quot;&gt;remark-lint&lt;/a&gt;. It’s fully functional right now, and you can
install it from npm to start using it in your gulpfile:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;bash&quot; data-index=&quot;0&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;npm install --save-dev gulp-remark-lint-dko&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I am planning to add more features, which you can follow in the &lt;a href=&quot;https://github.com/davidosomething/gulp-remark-lint-dko/blob/master/README.md&quot;&gt;README&lt;/a&gt; or
help contribute with a pull request.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/davidosomething/gulp-remark-lint-dko&quot;&gt;gulp-remark-lint-dko on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/gulp-remark-lint-dko&quot;&gt;gulp-remark-lint-dko on npmjs.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here’s a screenshot of the output:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/davidosomething/gulp-remark-lint-dko/master/screenshot.png&quot; alt=&quot;Example output&quot;&gt;&lt;/p&gt;
&lt;style class=&quot;grvsc-styles&quot;&gt;
  .grvsc-container {
    overflow: auto;
    position: relative;
    -webkit-overflow-scrolling: touch;
    padding-top: 1rem;
    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));
    padding-bottom: 1rem;
    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));
    border-radius: 8px;
    border-radius: var(--grvsc-border-radius, 8px);
    font-feature-settings: normal;
    line-height: 1.4;
  }
  
  .grvsc-code {
    display: table;
  }
  
  .grvsc-line {
    display: table-row;
    box-sizing: border-box;
    width: 100%;
    position: relative;
  }
  
  .grvsc-line &gt; * {
    position: relative;
  }
  
  .grvsc-gutter-pad {
    display: table-cell;
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  .grvsc-gutter {
    display: table-cell;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter::before {
    content: attr(data-content);
  }
  
  .grvsc-source {
    display: table-cell;
    padding-left: 1.5rem;
    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));
    padding-right: 1.5rem;
    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));
  }
  
  .grvsc-source:empty::after {
    content: &apos; &apos;;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter + .grvsc-source {
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  /* Line transformer styles */
  
  .grvsc-has-line-highlighting &gt; .grvsc-code &gt; .grvsc-line::before {
    content: &apos; &apos;;
    position: absolute;
    width: 100%;
  }
  
  .grvsc-line-diff-add::before {
    background-color: var(--grvsc-line-diff-add-background-color, rgba(0, 255, 60, 0.2));
  }
  
  .grvsc-line-diff-del::before {
    background-color: var(--grvsc-line-diff-del-background-color, rgba(255, 0, 20, 0.2));
  }
  
  .grvsc-line-number {
    padding: 0 2px;
    text-align: right;
    opacity: 0.7;
  }
  
  .default-dark {
    background-color: #1E1E1E;
    color: #D4D4D4;
  }
  .default-dark .mtk1 { color: #D4D4D4; }
  .default-dark .grvsc-line-highlighted::before {
    background-color: var(--grvsc-line-highlighted-background-color, rgba(255, 255, 255, 0.1));
    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, rgba(255, 255, 255, 0.5));
  }
&lt;/style&gt;</content:encoded></item><item><title><![CDATA[Whitespace settings in Vim]]></title><description><![CDATA[For any good programmer, consistent whitespace is a measure of code-quality.
Vim has a lot of built-in settings and features for handling…]]></description><link>https://www.davidosomething.com/whitespace-in-vim/</link><guid isPermaLink="false">https://www.davidosomething.com/whitespace-in-vim/</guid><pubDate>Tue, 12 Jan 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;For any good programmer, consistent whitespace is a measure of code-quality.
Vim has a lot of built-in settings and features for handling whitespace, and
this article will go over those with the examples the Vim help pages lack.&lt;/p&gt;
&lt;p&gt;For the purposes of this article, tabs are represented as blocks of the
character: &lt;code&gt;░&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;settings&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#settings&quot; aria-label=&quot;settings permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Settings&lt;/h2&gt;
&lt;p&gt;This section pertains to Vim’s built-in settings flags. You can use
&lt;code&gt;:help &apos;somesettingname&apos;&lt;/code&gt; with single quotes from within in Vim to see the full
details, so the most useful information I can give is an example of how the
setting affects editing. (Why the Vim help pages don’t include this? I don’t
know.)&lt;/p&gt;
&lt;p&gt;To turn a setting on or off, use &lt;code&gt;set settingname&lt;/code&gt; or &lt;code&gt;set nosettingname&lt;/code&gt; or
(&lt;code&gt;set settingname=0&lt;/code&gt; to turn off numeric settings).&lt;/p&gt;
&lt;h2 id=&quot;filetype-local-settings&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#filetype-local-settings&quot; aria-label=&quot;filetype local settings permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Filetype-local settings&lt;/h2&gt;
&lt;p&gt;Use &lt;code&gt;setlocal&lt;/code&gt; in an autocommand or &lt;code&gt;ftplugin&lt;/code&gt; instead of &lt;code&gt;set&lt;/code&gt; to make the
setting specific to the buffer. Example of using an autocommand to set
&lt;code&gt;shiftwidth&lt;/code&gt; on JavaScript files only:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;vim&quot; data-index=&quot;0&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;autocmd FileType javascript setlocal shiftwidth=2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Note that autocommands are executed in the order they are added, so if a plugin
decides to use that same autocommand to change the &lt;code&gt;shiftwidth&lt;/code&gt; later, it will
override yours. That is why I recommend you using an ftplugin instead.&lt;/p&gt;
&lt;p&gt;For the ftplugin version, put the line &lt;code&gt;setlocal shiftwidth=2&lt;/code&gt; into the file
&lt;code&gt;~/.vim/after/ftplugin/javascript.vim&lt;/code&gt;, where &lt;code&gt;javascript&lt;/code&gt; is the name of the
filetype you’re changing settings for.&lt;/p&gt;
&lt;p&gt;A good understanding of the order in which Vim runs files and commands will
help you debug rogue whitespace settings.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Don’t just copy settings from someone else without understanding what they
do.&lt;/p&gt;
&lt;div class=&quot;citation&quot;&gt;&amp;mdash; &lt;cite&gt;Everyone in #vim on Freenode&lt;/cite&gt;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;persistent-file-local-settings&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#persistent-file-local-settings&quot; aria-label=&quot;persistent file local settings permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Persistent file-local settings&lt;/h2&gt;
&lt;p&gt;To make special cases for a specific file, you can either make an autocommand
specifically to match the filename, or use Vim’s &lt;code&gt;modeline&lt;/code&gt; feature. You need
&lt;code&gt;set modeline&lt;/code&gt; somewhere in your vimrc to make sure the feature is enabled.&lt;/p&gt;
&lt;p&gt;A &lt;code&gt;modeline&lt;/code&gt; is a comment (in the current syntax) at the beginning or end of
your file that Vim will parse commands from and execute. By default, Vim
assumes the command is &lt;code&gt;set&lt;/code&gt;. Here’s an example of setting the &lt;code&gt;modeline&lt;/code&gt; in
a vimrc file:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;vim&quot; data-index=&quot;1&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;&amp;quot; vim: set ai sw=4:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The double quote at the beginning indicates a VimL comment. This will set
&lt;code&gt;set autoindent&lt;/code&gt; and &lt;code&gt;set shiftwidth=4&lt;/code&gt; for the buffer. The use of the short
form is optional.&lt;/p&gt;
&lt;h3 id=&quot;display-options&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#display-options&quot; aria-label=&quot;display options permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Display options&lt;/h3&gt;
&lt;p&gt;These options affect how whitespace appears in Vim. If someone else were to
open your file, they might see something completely different based on their
display options.&lt;/p&gt;
&lt;h4 id=&quot;list-and-listchars&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#list-and-listchars&quot; aria-label=&quot;list and listchars permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;list and listchars&lt;/h4&gt;
&lt;p&gt;The option &lt;code&gt;set list&lt;/code&gt; will turn this feature on. This is used to highlight
trailing spaces, differentiate tabs from regular spaces, and show a
continuation symbol when you have &lt;code&gt;set nowrap&lt;/code&gt; and a line is longer than the
window.&lt;/p&gt;
&lt;p&gt;My options are:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;vim&quot; data-index=&quot;2&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;set list&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;set listchars=&amp;quot;&amp;quot;                      &amp;quot; reset&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;set listchars=tab:→\ &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;set listchars+=trail:·&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Note there is a trailing space after the backslash on the tab line (for
escaping the literal space symbol). So 4-character-wide tabs look like this:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;handlebars&quot; data-index=&quot;3&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    normal code indented with 4 spaces and no trailing spaces&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;→░░░→░░░code indented with two tabs and with two trailing spaces··&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  normal code indented with 2 spaces and no trailing spaces&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;tabstopnumber&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#tabstopnumber&quot; aria-label=&quot;tabstopnumber permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;tabstop=NUMBER&lt;/h4&gt;
&lt;p&gt;A real tab will be this wide. E.g. &lt;code&gt;set tabstop=4&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;handlebars&quot; data-index=&quot;4&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;→░░░text&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With &lt;code&gt;set tabstop=8&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;handlebars&quot; data-index=&quot;5&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;→░░░░░░░text&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;wrap&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#wrap&quot; aria-label=&quot;wrap permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;wrap&lt;/h4&gt;
&lt;p&gt;The &lt;code&gt;wrap&lt;/code&gt; setting affects display lines. When it is off, text appears like so:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;handlebars&quot; data-index=&quot;6&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;This option changes how text is displayed.  It doesn&amp;#39;t change the text in the buffer, see &amp;#39;textwidth&amp;#39; for that.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When it is on, text is displayed as:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;handlebars&quot; data-index=&quot;7&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;This option changes how text is displayed.  It doesn&amp;#39;t change the text in the&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;buffer, see &amp;#39;textwidth&amp;#39; for that.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When you save the file, the text is saved as one long line — this setting is
a display setting only.&lt;/p&gt;
&lt;h3 id=&quot;whitespace-in-lines&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#whitespace-in-lines&quot; aria-label=&quot;whitespace in lines permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Whitespace in lines&lt;/h3&gt;
&lt;p&gt;These settings affect the actual text content of the file.&lt;/p&gt;
&lt;h4 id=&quot;backspace&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#backspace&quot; aria-label=&quot;backspace permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;backspace&lt;/h4&gt;
&lt;p&gt;This affects what backspace deletes. With the following settings:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;vim&quot; data-index=&quot;8&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;set backspace=indent,eol,start&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Before backspace:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;handlebars&quot; data-index=&quot;9&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;→░░░→░░░Code that was indented with two tabs&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After backspace:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;handlebars&quot; data-index=&quot;10&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;→░░░Code that was indented with two tabs&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The indent can be deleted with backspace. Your settings for &lt;code&gt;expandtab&lt;/code&gt;, and
&lt;code&gt;shiftwidth&lt;/code&gt; will determine how many characters are deleted, so if you have
a &lt;code&gt;set tabstop=4&lt;/code&gt; and &lt;code&gt;set shiftwidth=2&lt;/code&gt; and you hit backspace, you will delete
two spaces from the tab, leaving a two space indent (if &lt;code&gt;expandtab&lt;/code&gt; is on).&lt;/p&gt;
&lt;h4 id=&quot;expandtab&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#expandtab&quot; aria-label=&quot;expandtab permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;expandtab&lt;/h4&gt;
&lt;p&gt;Use spaces instead of tabs. This is a personal coding preference, and sometimes
dictated by your language, but I recommend turning this on (&lt;code&gt;set expandtab&lt;/code&gt;)
for consistency and overriding it using an autocommand or filetype plugin
specific to whatever needs to use real tabs (&lt;code&gt;set noexpandtab&lt;/code&gt;).&lt;/p&gt;
&lt;h4 id=&quot;shiftwidthnumber&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#shiftwidthnumber&quot; aria-label=&quot;shiftwidthnumber permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;shiftwidth=NUMBER&lt;/h4&gt;
&lt;p&gt;This affects all of the auto-indenting settings like &lt;code&gt;cindent&lt;/code&gt;. When you use
&lt;code&gt;&gt;&gt;&lt;/code&gt; or &lt;code&gt;&amp;#x3C;&amp;#x3C;&lt;/code&gt; to indent or un-indent a line it will remove this many spaces
(or tabs).&lt;/p&gt;
&lt;p&gt;Before:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;handlebars&quot; data-index=&quot;11&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    Unindented when sw=2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    Unindented when sw=4&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;handlebars&quot; data-index=&quot;12&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  Unindented when sw=2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;Unindented when sw=4&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;softtabstopnumber&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#softtabstopnumber&quot; aria-label=&quot;softtabstopnumber permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;softtabstop=NUMBER&lt;/h4&gt;
&lt;p&gt;This tells Vim how many spaces or to insert when you hit &lt;code&gt;&amp;#x3C;Tab&gt;&lt;/code&gt; in insert
mode. If you use real tabs, it will insert spaces until the number of spaces
is equivalent to a &lt;code&gt;tabstop&lt;/code&gt;, in which case it will merge that many spaces
into a single tab.&lt;/p&gt;
&lt;p&gt;Example when &lt;code&gt;softtabstop=2&lt;/code&gt; and for varying values of &lt;code&gt;tabstop&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;handlebars&quot; data-index=&quot;13&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  Indented once, ts=4 sts=2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;→░░░Indented twice, ts=4 sts=2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    Indented twice, ts=8 sts=2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When the &lt;strong&gt;NUMBER&lt;/strong&gt; is negative (e.g. -1 or -2 or whatever), this will use the
value of &lt;code&gt;shiftwidth&lt;/code&gt;. Since I use a &lt;code&gt;shiftwidth&lt;/code&gt; of 2, I keep it at
&lt;code&gt;softtabstop=-2&lt;/code&gt; so I know how much it counts for, even though it is using the
value from &lt;code&gt;shiftwidth&lt;/code&gt;. This may have side effects on 3rd party plugins that
don’t account for negative values, but I’d sooner fork the plugin than change
my value.&lt;/p&gt;
&lt;h4 id=&quot;shiftround&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#shiftround&quot; aria-label=&quot;shiftround permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;shiftround&lt;/h4&gt;
&lt;p&gt;This is for &lt;code&gt;&gt;&gt;&lt;/code&gt; and &lt;code&gt;&amp;#x3C;&amp;#x3C;&lt;/code&gt; indenting. Vim will round odd numbers of leading
spaces to the nearest &lt;code&gt;shiftwidth&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Example of when &lt;code&gt;shiftround&lt;/code&gt; is on, before:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;handlebars&quot; data-index=&quot;14&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;   Three spaces with shiftwidth=4, indent me&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After, the line gets indented to 4 spaces since that was the nearest
&lt;code&gt;shiftwidth&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;handlebars&quot; data-index=&quot;15&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    Three spaces with shiftwidth=4, indent me&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I have this setting off (&lt;code&gt;set noshiftround&lt;/code&gt;) so I can control odd-numbers of
indents, particularly for cases like JSDoc blocks, where you have an extra
alignment space that you want to preserve:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;javascript&quot; data-index=&quot;16&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;mtk3&quot;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk3&quot;&gt;     * &amp;lt;-- alignment space left of asterisk&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk3&quot;&gt;     */&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Example of bad unindenting when &lt;code&gt;set expandtab&lt;/code&gt; and &lt;code&gt;set shiftround&lt;/code&gt; and you
use &lt;code&gt;&amp;#x3C;&amp;#x3C;&lt;/code&gt; to unindent the JSDoc:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;javascript&quot; data-index=&quot;17&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk3&quot;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk3&quot;&gt;    * &amp;lt;-- alignment space left of asterisk&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk3&quot;&gt;    */&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;joinspaces&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#joinspaces&quot; aria-label=&quot;joinspaces permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;joinspaces&lt;/h4&gt;
&lt;p&gt;When you press &lt;code&gt;gj&lt;/code&gt; in normal mode, vim takes the line below and moves it to
the end of the current line. With this setting on, Vim inserts spaces after
punctuation.&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;handlebars&quot; data-index=&quot;18&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;Before text. _&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;After text.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Becomes:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;handlebars&quot; data-index=&quot;19&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;Before text._  After text.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When the &lt;code&gt;cpoptions&lt;/code&gt; flag has J, it will become:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;handlebars&quot; data-index=&quot;20&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;Before text. After text._&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In all examples, the &lt;code&gt;_&lt;/code&gt; is the cursor position.&lt;/p&gt;
&lt;p&gt;You probably want to turn this off so you don’t get extra spaces when coding.&lt;/p&gt;
&lt;h3 id=&quot;indenting&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#indenting&quot; aria-label=&quot;indenting permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Indenting&lt;/h3&gt;
&lt;h4 id=&quot;autoindent&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#autoindent&quot; aria-label=&quot;autoindent permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;autoindent&lt;/h4&gt;
&lt;p&gt;Starting from insert mode with:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;handlebars&quot; data-index=&quot;21&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    Indented line 1_&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pressing &lt;code&gt;&amp;#x3C;CR&gt;&lt;/code&gt; (Return/Enter) will put you at the next line, same indent
level:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;handlebars&quot; data-index=&quot;22&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    Indented line 1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    _&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You probably want this on if you use &lt;code&gt;smartindent&lt;/code&gt;.&lt;br&gt;
This setting is modified by &lt;code&gt;smartindent&lt;/code&gt;, &lt;code&gt;cindent&lt;/code&gt;, &lt;code&gt;indentexpr&lt;/code&gt;, and
&lt;code&gt;paste&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id=&quot;smartindent&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#smartindent&quot; aria-label=&quot;smartindent permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;smartindent&lt;/h4&gt;
&lt;p&gt;This setting tells Vim to parse your code a little, and based on curly-braces
and keywords defined in the indent syntax for the filetype, it will add an
indent going from one line to another.&lt;/p&gt;
&lt;p&gt;There are built-in exceptions for lines starting with the character &lt;code&gt;#&lt;/code&gt;. For no
good reason, in my opinion.&lt;/p&gt;
&lt;p&gt;Before:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;handlebars&quot; data-index=&quot;23&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    if (true) {_&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;handlebars&quot; data-index=&quot;24&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    if (true) {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;        _&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This setting modifies &lt;code&gt;autoindent&lt;/code&gt;. It is recommended to use both of them
together for consistent behavior.&lt;/p&gt;
&lt;p&gt;It is not applied when &lt;code&gt;cindent&lt;/code&gt; is on or &lt;code&gt;indentexpr&lt;/code&gt; is set.&lt;/p&gt;
&lt;h4 id=&quot;cindent&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#cindent&quot; aria-label=&quot;cindent permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;cindent&lt;/h4&gt;
&lt;p&gt;This is more programmatic than &lt;code&gt;smartindent&lt;/code&gt; and uses even more parsing and
some Vim options that can be defined in indent plugins. Your milage may vary
with this, so turn it on or off as desired. It produces pretty much the same
result as &lt;code&gt;smartindent&lt;/code&gt; for C, but might not do anything for other languages
where the required Vim options like &lt;code&gt;cinkeys&lt;/code&gt; aren’t defined.&lt;/p&gt;
&lt;p&gt;This setting modifies the formatting of &lt;code&gt;autoindent&lt;/code&gt;.&lt;br&gt;
This setting supercedes &lt;code&gt;smartindent&lt;/code&gt;.&lt;br&gt;
This setting is not applied when &lt;code&gt;indentexpr&lt;/code&gt; is set.&lt;/p&gt;
&lt;p&gt;I leave this off in favor of just &lt;code&gt;smartindent&lt;/code&gt; since the languages I work in
aren’t always as C-style.&lt;/p&gt;
&lt;h4 id=&quot;indentexpr&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#indentexpr&quot; aria-label=&quot;indentexpr permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;indentexpr&lt;/h4&gt;
&lt;p&gt;This is typically set by indent plugins (including the ones provided by Vim) to
give programmatic rules for indenting. Unless you’re writing custom logic to
indent code, you don’t need to set it manually. These settings will override
&lt;code&gt;smartindent&lt;/code&gt; and &lt;code&gt;cindent&lt;/code&gt;, so indent plugins have the greatest priority in
determining how to indent.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/pangloss/vim-javascript/blob/master/indent/javascript.vim&quot;&gt;indent plugin code for pangloss/vim-javascript&lt;/a&gt; is a pretty clear example
of how &lt;code&gt;indentexpr&lt;/code&gt; works — basically it parses lines of code to determine
what the next line’s indent should be.&lt;/p&gt;
&lt;h4 id=&quot;copyindent&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#copyindent&quot; aria-label=&quot;copyindent permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;copyindent&lt;/h4&gt;
&lt;p&gt;If you have mixed tabs and spaces for some reason, and you’re a strict coder
when it comes to whitespace, the mix is probably intentional.&lt;/p&gt;
&lt;p&gt;When using &lt;code&gt;autoindent&lt;/code&gt; and the &lt;code&gt;copyindent&lt;/code&gt; setting is on:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;handlebars&quot; data-index=&quot;25&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;░░░░ ░░░░ code_&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Will yield the following on the next line:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;handlebars&quot; data-index=&quot;26&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;░░░░ ░░░░ code&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;░░░░ ░░░░ another line&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When off, you’ll get Vim’s attempt to reconstruct the whitespace:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;handlebars&quot; data-index=&quot;27&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;░░░░ ░░░░ code&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;░░░░░░░░  another line&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is a good setting to keep on if you like to control your own whitespace.&lt;/p&gt;
&lt;h4 id=&quot;preserveindent&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#preserveindent&quot; aria-label=&quot;preserveindent permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;preserveindent&lt;/h4&gt;
&lt;p&gt;When this is on:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;handlebars&quot; data-index=&quot;28&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;░░░░ ░░░░ unindentme&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;░░░░ ░░░░ indentme&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;░░░░  ░░░░ indentme&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And you un-indent your code using &lt;code&gt;&amp;#x3C;&amp;#x3C;&lt;/code&gt; or &lt;code&gt;&gt;&gt;&lt;/code&gt;, you get:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;handlebars&quot; data-index=&quot;29&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;░░░░ unindentme&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;░░░░ ░░░░ ░░░░ indentme&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;░░░░  ░░░░ ░░░░ indentme&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Basically, Vim will keep your original indent pattern if you indent, and remove
as little as possible — tabs first, and then spaces. In the last line, you’ll
notice Vim detected the tab pattern as &lt;code&gt;&amp;#x3C;Tab&gt;&amp;#x3C;Space&gt;&lt;/code&gt; so it continues to add
both every time you indent.&lt;/p&gt;
&lt;p&gt;I keep this setting on because I don’t want Vim to change what I probably
intentially wrote — which is the only scenario where I would intermix tabs and
spaces.&lt;/p&gt;
&lt;h4 id=&quot;formatoptions-and-cpoptions&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#formatoptions-and-cpoptions&quot; aria-label=&quot;formatoptions and cpoptions permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;formatoptions and cpoptions&lt;/h4&gt;
&lt;p&gt;You definitely need to tweak these to your liking, but I think Vim’s help info
is sufficient in this case since some visual samples are provided. Check out
&lt;code&gt;:help formatoptions&lt;/code&gt;, &lt;code&gt;:help fo-table&lt;/code&gt; and &lt;code&gt;:help cpoptions&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;plugins&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#plugins&quot; aria-label=&quot;plugins permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Plugins&lt;/h2&gt;
&lt;p&gt;Vim’s built-in whitespace options may be enough for plain text and C code, but
for other languages, Vim supports indent plugins. There are many indent plugins
that come bundled with vim, and to automatically enable them use this line in
your vimrc:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;vim&quot; data-index=&quot;30&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;filetype indent on&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You may have &lt;code&gt;filetype plugin indent on&lt;/code&gt;, which also loads the rest of the
filetype related plugins, so that’s fine. If you’re using &lt;a href=&quot;https://github.com/junegunn/vim-plug&quot;&gt;vim-plug&lt;/a&gt; to manage
plugins, it will automatically turn the setting on after plugins have loaded,
so don’t include the line in your vimrc or things will load twice!&lt;/p&gt;
&lt;h3 id=&quot;editorconfig&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#editorconfig&quot; aria-label=&quot;editorconfig permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;EditorConfig&lt;/h3&gt;
&lt;p&gt;I recommend using the &lt;a href=&quot;http://editorconfig.org&quot;&gt;EditorConfig&lt;/a&gt; standard for anyone working in open-source
or collaborating with others.&lt;/p&gt;
&lt;p&gt;EditorConfig lets you define whitespace standards in an &lt;code&gt;.editorconfig&lt;/code&gt; file
(but it’s not &lt;a href=&quot;https://github.com/sirbrillig/mixedindentlint&quot;&gt;a linting plugin&lt;/a&gt;!).&lt;br&gt;
The rules are grouped by file extension , and it will set the &lt;code&gt;expandtab&lt;/code&gt;,
&lt;code&gt;shiftwidth&lt;/code&gt;, &lt;code&gt;tabstop&lt;/code&gt;, &lt;code&gt;softtabstop&lt;/code&gt;, and other settings for you after you
open a file with a definition in the &lt;code&gt;.editorconfig&lt;/code&gt; file you provide.&lt;/p&gt;
&lt;p&gt;Many non-Vim text editors and IDEs support EditorConfig, too. This is
especially nice because you can keep the file along with your project and other
EditorConfig users will automatically be conforming to your whitespace
standards.&lt;/p&gt;
&lt;p&gt;There are three EditorConfig plugins for Vim. The official one,
&lt;a href=&quot;https://github.com/editorconfig/editorconfig-vim&quot;&gt;editorconfig/editorconfig-vim&lt;/a&gt; requires Vim to be compiled with Python support
(or takes some configuration to use a binary), so check in command mode
(&lt;code&gt;:has(&apos;python&apos;)&lt;/code&gt; or &lt;code&gt;:has(&apos;python3&apos;)&lt;/code&gt;) or starting vim with the &lt;code&gt;--version&lt;/code&gt;
flag:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;bash&quot; data-index=&quot;31&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;vim --version&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;An unofficial one, &lt;a href=&quot;https://github.com/sgur/vim-editorconfig&quot;&gt;sgur/vim-editorconfig&lt;/a&gt;, is written in pure VimScript so it
is technically slower, but for something so simple it is unnoticable. I use
this one myself.&lt;/p&gt;
&lt;p&gt;There is another unofficial EditorConfig vim plugin written in pure VimScript:
&lt;a href=&quot;https://github.com/dahu/EditorConfig&quot;&gt;dahu/EditorConfig&lt;/a&gt; — but it is in alpha and the implementation does not
include all the EditorConfig features. Instead, it provides a &lt;code&gt;autocmd&lt;/code&gt; hooks
so you can implement your own interpretation for things it does not implement
like &lt;code&gt;trim_trailing_whitespace&lt;/code&gt; and &lt;code&gt;insert_final_newline&lt;/code&gt;. I’ve checked out
the source code (as I have for all plugins I use) and it’s quite well written
so if you want to implement the other features (or don’t need them), it is a
viable option.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/editorconfig/editorconfig-vim&quot;&gt;editorconfig/editorconfig-vim&lt;/a&gt; is the official plugin&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/sgur/vim-editorconfig&quot;&gt;sgur/vim-editorconfig&lt;/a&gt; is the unofficial one that I use&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/dahu/EditorConfig&quot;&gt;dahu/EditorConfig&lt;/a&gt; is another unofficial one with &lt;code&gt;autocmd&lt;/code&gt; hooks&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;auto-determine-whitespace-settings&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#auto-determine-whitespace-settings&quot; aria-label=&quot;auto determine whitespace settings permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Auto-determine whitespace settings&lt;/h3&gt;
&lt;p&gt;As an alternative to editorconfig, Tim Pope’s plugin &lt;a href=&quot;https://github.com/tpope/vim-sleuth&quot;&gt;tpope/vim-sleuth&lt;/a&gt; will
run through the current file or similar files and try to automatically
determine what &lt;code&gt;expandtab&lt;/code&gt;, &lt;code&gt;shiftwidth&lt;/code&gt;, etc. settings were used on them
during creation and set those on the current file. Another option is
&lt;a href=&quot;https://github.com/ciaranm/detectindent&quot;&gt;ciaranm/detectindent&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/tpope/vim-sleuth&quot;&gt;tpope/vim-sleuth&lt;/a&gt; detects and applies settings on file open&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ciaranm/detectindent&quot;&gt;ciaranm/detectindent&lt;/a&gt; detects when you run &lt;code&gt;:DetectIndent&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;better-indent-visibility&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#better-indent-visibility&quot; aria-label=&quot;better indent visibility permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Better indent visibility&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;listchars&lt;/code&gt; option is helpful, but sometimes it gets hard to look at
symbols, or you need a better way to distinguish your current indent level.
There are two &lt;em&gt;good&lt;/em&gt; plugins that can provide you with this. Check the links to
their GitHub repos for screenshots.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/nathanaelkane/vim-indent-guides&quot;&gt;nathanaelkane/vim-indent-guides&lt;/a&gt; changes the background color at each level
of indent. I use this one and toggle it on/off as desired using its built-in
commands.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Yggdroot/indentLine&quot;&gt;Yggdroot/indentLine&lt;/a&gt; actually inserts symbols at the start of each indent.
This may have some performance problems on large files though, so I’d be wary
of it.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;better-whitespace-visibility&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#better-whitespace-visibility&quot; aria-label=&quot;better whitespace visibility permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Better whitespace visibility&lt;/h3&gt;
&lt;p&gt;The plugin &lt;a href=&quot;https://github.com/ntpeters/vim-better-whitespace&quot;&gt;ntpeters/vim-better-whitespace&lt;/a&gt;, similar to
&lt;a href=&quot;https://github.com/nathanaelkane/vim-indent-guides&quot;&gt;nathanaelkane/vim-indent-guides&lt;/a&gt;, uses syntax groups to match whitespace. This
plugin can set up very visible background colors for whitespace, making sure
you don’t miss anything.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ntpeters/vim-better-whitespace&quot;&gt;ntpeters/vim-better-whitespace&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;line-splitting&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#line-splitting&quot; aria-label=&quot;line splitting permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Line splitting&lt;/h3&gt;
&lt;p&gt;For a bunch of programming languages, you can put code all on one line. Using
native Vim, you’d have to manually press &lt;code&gt;&amp;#x3C;CR&gt;&lt;/code&gt; at points to properly break it
up into several lines (sure, you could automate it with macros or regex, but
every time is different).&lt;/p&gt;
&lt;p&gt;The plugin &lt;a href=&quot;https://github.com/AndrewRadev/splitjoin.vim&quot;&gt;AndrewRadev/splitjoin.vim&lt;/a&gt; adds mappings to automaticaly do
this for you (for certain syntaxes only). Check out the plugin’s README to see
visual examples, and &lt;code&gt;doc/&lt;/code&gt; on how to configure it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/AndrewRadev/splitjoin.vim&quot;&gt;AndrewRadev/splitjoin.vim&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;alignment&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#alignment&quot; aria-label=&quot;alignment permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Alignment&lt;/h3&gt;
&lt;p&gt;There are some plugins that will reformat your code for you by adding
whitespace to align things together. See each page for examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/tommcdo/vim-lion&quot;&gt;tommcdo/vim-lion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/junegunn/vim-easy-align&quot;&gt;junegunn/vim-easy-align&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/godlygeek/tabular&quot;&gt;godlygeek/tabular&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;my-vim-setup&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#my-vim-setup&quot; aria-label=&quot;my vim setup permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;My Vim setup&lt;/h2&gt;
&lt;p&gt;You can dig through &lt;a href=&quot;https://github.com/davidosomething/dotfiles/tree/master/vim&quot;&gt;my Vim configuration on GitHub&lt;/a&gt;. My whitespace settings
and the plugins I use are all in the main vimrc file, and their configurations
are interspersed into &lt;code&gt;plugin/&lt;/code&gt;, &lt;code&gt;ftplugin/&lt;/code&gt;, and &lt;code&gt;after/*/&lt;/code&gt; to cope with the
order in which Vim loads files.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/davidosomething/dotfiles/tree/master/vim&quot;&gt;my Vim configuration on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;style class=&quot;grvsc-styles&quot;&gt;
  .grvsc-container {
    overflow: auto;
    position: relative;
    -webkit-overflow-scrolling: touch;
    padding-top: 1rem;
    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));
    padding-bottom: 1rem;
    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));
    border-radius: 8px;
    border-radius: var(--grvsc-border-radius, 8px);
    font-feature-settings: normal;
    line-height: 1.4;
  }
  
  .grvsc-code {
    display: table;
  }
  
  .grvsc-line {
    display: table-row;
    box-sizing: border-box;
    width: 100%;
    position: relative;
  }
  
  .grvsc-line &gt; * {
    position: relative;
  }
  
  .grvsc-gutter-pad {
    display: table-cell;
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  .grvsc-gutter {
    display: table-cell;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter::before {
    content: attr(data-content);
  }
  
  .grvsc-source {
    display: table-cell;
    padding-left: 1.5rem;
    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));
    padding-right: 1.5rem;
    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));
  }
  
  .grvsc-source:empty::after {
    content: &apos; &apos;;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter + .grvsc-source {
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  /* Line transformer styles */
  
  .grvsc-has-line-highlighting &gt; .grvsc-code &gt; .grvsc-line::before {
    content: &apos; &apos;;
    position: absolute;
    width: 100%;
  }
  
  .grvsc-line-diff-add::before {
    background-color: var(--grvsc-line-diff-add-background-color, rgba(0, 255, 60, 0.2));
  }
  
  .grvsc-line-diff-del::before {
    background-color: var(--grvsc-line-diff-del-background-color, rgba(255, 0, 20, 0.2));
  }
  
  .grvsc-line-number {
    padding: 0 2px;
    text-align: right;
    opacity: 0.7;
  }
  
  .default-dark {
    background-color: #1E1E1E;
    color: #D4D4D4;
  }
  .default-dark .mtk1 { color: #D4D4D4; }
  .default-dark .mtk3 { color: #6A9955; }
  .default-dark .grvsc-line-highlighted::before {
    background-color: var(--grvsc-line-highlighted-background-color, rgba(255, 255, 255, 0.1));
    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, rgba(255, 255, 255, 0.5));
  }
&lt;/style&gt;</content:encoded></item><item><title><![CDATA[Setting up Vim for JavaScript development]]></title><description><![CDATA[Before you read any of this I will caveat with the fact that Vim is perfectly
adequate for modern JavaScript development without plugins…]]></description><link>https://www.davidosomething.com/vim-for-javascript/</link><guid isPermaLink="false">https://www.davidosomething.com/vim-for-javascript/</guid><pubDate>Sat, 09 Jan 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Before you read any of this I will caveat with the fact that Vim is perfectly
adequate for modern JavaScript development &lt;em&gt;without&lt;/em&gt; plugins. The Vim runtime
comes with syntax highlighting and omni-completion already, and you can even
configure Vim as a task runner without plugins.&lt;/p&gt;
&lt;p&gt;This is geared towards people who already know how to use Vim. E.g., if you
understand minutiae like the difference between &lt;code&gt;set autoindent&lt;/code&gt; and
&lt;code&gt;set indentexpr&lt;/code&gt;, and have found neither to your liking, then read on.
Otherwise, I highly advise you learn a little more about what the standard
Vim runtime comes with.&lt;/p&gt;
&lt;h2 id=&quot;installing-plugins&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#installing-plugins&quot; aria-label=&quot;installing plugins permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Installing plugins&lt;/h2&gt;
&lt;p&gt;I recommend using &lt;a href=&quot;https://github.com/junegunn/vim-plug&quot;&gt;vim-plug&lt;/a&gt; to install plugins. It’s simple, works on both Vim
and Neovim, and can perform operations asynchronously.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/junegunn/vim-plug&quot;&gt;vim-plug&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;syntax&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#syntax&quot; aria-label=&quot;syntax permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Syntax&lt;/h2&gt;
&lt;p&gt;Vim comes with a JavaScript syntax file. It is automatically loaded when you
open up a JavaScript file (where the value of &lt;code&gt;filetype&lt;/code&gt; is &lt;code&gt;javascript&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;By default Vim doesn’t automatically detect filetypes, so if you aren’t using
&lt;a href=&quot;https://github.com/junegunn/vim-plug&quot;&gt;vim-plug&lt;/a&gt; (for which the call to &lt;code&gt;call plug#end()&lt;/code&gt; enables this), you’ll need
to enable it manually by adding this to your vimrc:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;vim&quot; data-index=&quot;0&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;filetype plugin indent on&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will enable filetype detection, running filetype specific plugins, and
loading filetype specific indentation settings.&lt;/p&gt;
&lt;p&gt;You may also need to enable syntax highlighting in your vimrc file if you’re not
using &lt;a href=&quot;https://github.com/junegunn/vim-plug&quot;&gt;vim-plug&lt;/a&gt;. To manually enable syntax highlighting, add the following line
to your vimrc file:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;vim&quot; data-index=&quot;1&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;syntax enable&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;plugins-that-provide-better-syntax-support&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#plugins-that-provide-better-syntax-support&quot; aria-label=&quot;plugins that provide better syntax support permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Plugins that provide better syntax support&lt;/h3&gt;
&lt;p&gt;The standard JavaScript syntax highlighting is typically adequate, but you may
want more features such as ES2015 support, or better distinguishing of keywords.&lt;/p&gt;
&lt;p&gt;There are quite a few options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/pangloss/vim-javascript&quot;&gt;pangloss/vim-javascript&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Includes custom indent settings. These indent settings are also the ones
included in the Vim default runtime now, and the one in the plugin may
be trailing what comes with Vim (i.e., Vim has a newer version of the same
indent file!)&lt;/li&gt;
&lt;li&gt;Adds special concealing symbols so to make your code pretty at a glance&lt;/li&gt;
&lt;li&gt;Last updated April 2016 with additional ES2015 support (better arrow
function and highlighting among other things) and some regex performance
updates.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/sheerun/vim-polyglot&quot;&gt;sheerun/vim-polyglot&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;This is a plugin that bundles a bunch of language syntax plugins into
one. It includes &lt;a href=&quot;https://github.com/pangloss/vim-javascript&quot;&gt;pangloss/vim-javascript&lt;/a&gt; at the latest version, as well
as some other plugins like &lt;a href=&quot;https://github.com/mxw/vim-jsx&quot;&gt;mxw/vim-jsx&lt;/a&gt;. Worth checking out if you don’t
want to maintain syntax plugins on your own, but you should double-check
to make sure you aren’t manually adding the bundled plugins outside of
the pack (resulting in having the plugin twice).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/jelera/vim-javascript-syntax&quot;&gt;jelera/vim-javascript-syntax&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Does not include custom indent settings (not that you need them…)&lt;/li&gt;
&lt;li&gt;Updated about once a month according to the GitHub contributors graph&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/othree/yajs.vim&quot;&gt;othree/yajs.vim&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;This is a fork of &lt;a href=&quot;https://github.com/jelera/vim-javascript-syntax&quot;&gt;jelera/vim-javascript-syntax&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Does not include custom indent settings (again, you might not need one)&lt;/li&gt;
&lt;li&gt;Updated very often to keep in line with ES specifications&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/bigfish/vim-js-context-coloring&quot;&gt;bigfish/vim-js-context-coloring&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;This is an interesting new method of syntax highlighting. It picks out
function scopes from your program by running it through a node.js binary
that runs a JavaScript parser and assigns a color to the scope. Things
within that scope are assigned a color. Because it requires in-depth
parsing of your code, it may not color your code when it is incomplete
(i.e., the syntax is not yet valid).&lt;/li&gt;
&lt;li&gt;This syntax plugin can be used in combination with any of the above, and
you can toggle it on and off.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With the exception of vim-js-context-coloring, &lt;strong&gt;all of these provide ES2015
(ES6) and JSDoc support to varying degrees&lt;/strong&gt;, which Vim lacks by default.
I personally use and recommend &lt;a href=&quot;https://github.com/pangloss/vim-javascript&quot;&gt;pangloss/vim-javascript&lt;/a&gt; purely because it has
started active development again. I have not experienced any issues since
switching to this from &lt;a href=&quot;https://github.com/othree/yajs.vim&quot;&gt;othree/yajs.vim&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/othree/yajs.vim&quot;&gt;othree/yajs.vim&lt;/a&gt; with
&lt;a href=&quot;https://github.com/othree/es.next.syntax.vim&quot;&gt;es.next.syntax.vim&lt;/a&gt; might better
suit your needs if you use ES2016 (ES7). The author also writes a few other
plugins that can be used in conjunction with it (although they may work with
the other syntaxes, too, depending on the syntax groups provided). I’ve used
this plugin extensively in place of the default syntax and haven’t had any
problems.&lt;/p&gt;
&lt;p&gt;Using &lt;a href=&quot;https://github.com/junegunn/vim-plug&quot;&gt;vim-plug&lt;/a&gt;, I recommend installing the plugin like this:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;vim&quot; data-index=&quot;2&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;Plug &amp;#39;othree/yajs.vim&amp;#39;, { &amp;#39;for&amp;#39;: &amp;#39;javascript&amp;#39; }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The additional requirement at the end makes sure the syntax plugin is loaded in
a Vim autocommand based on filetype detection (as opposed to relying on Vim’s
&lt;code&gt;runtimepath&lt;/code&gt; based sourcing mechanism. This way the main Vim syntax plugin
will have already run, and the plugin’s syntax will override it.&lt;/p&gt;
&lt;h3 id=&quot;plugins-that-provide-better-indentation-support&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#plugins-that-provide-better-indentation-support&quot; aria-label=&quot;plugins that provide better indentation support permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Plugins that provide better indentation support&lt;/h3&gt;
&lt;p&gt;Vim’s bundled JavaScript indent may be enough for you, especially if you use
a strictly C-style whitespace (Vim’s C-style indent options is even called
&lt;code&gt;cindent&lt;/code&gt;). Vim, as of August 26, 2016, comes with a modified version of the
&lt;a href=&quot;https://github.com/pangloss/vim-javascript&quot;&gt;pangloss/vim-javascript&lt;/a&gt; indent rules that does not include the reformatting
&lt;code&gt;gq&lt;/code&gt; action. This means 99% of people probably won’t need to change their indent
file.&lt;/p&gt;
&lt;p&gt;Some notable options in this case are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/pangloss/vim-javascript&quot;&gt;pangloss/vim-javascript&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Using this entire syntax plugin will provide you with a more JavaScript-y
indent for things like switch/case and multi-line var declarations.&lt;/li&gt;
&lt;li&gt;This indent plugin has a side-effect in that it also changes the format
expression — that is, if you highlight a block and use &lt;code&gt;gq&lt;/code&gt; to reformat
it, it will re-indent the code using this plugin as well.&lt;/li&gt;
&lt;li&gt;The Vim runtime (stuff that comes with Vim) may include a newer version of
this indent file that does not have the modified &lt;code&gt;gq&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/gavocanov/vim-js-indent&quot;&gt;gavocanov/vim-js-indent&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;I don’t recommend this one, but I’ve listed it here because you’ll
probably find it and have questions. The author no longer uses it, so it
should not be considered.&lt;/li&gt;
&lt;li&gt;This is the indent portion of &lt;a href=&quot;https://github.com/pangloss/vim-javascript&quot;&gt;pangloss/vim-javascript&lt;/a&gt;, ripped out into
its own plugin.&lt;/li&gt;
&lt;li&gt;There are modifications to it, diverging it from
&lt;a href=&quot;https://github.com/pangloss/vim-javascript&quot;&gt;pangloss/vim-javascript&lt;/a&gt;, notably support for the syntax group names in
&lt;a href=&quot;https://github.com/othree/yajs.vim&quot;&gt;othree/yajs.vim&lt;/a&gt;. That helps it pick out keywords and when you are
inside comments if you are using &lt;a href=&quot;https://github.com/othree/yajs.vim&quot;&gt;othree/yajs.vim&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The format expression from the pangloss plugin has been removed.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/itspriddle/vim-javascript-indent&quot;&gt;itspriddle/vim-javascript-indent&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;This is a git mirror of &lt;a href=&quot;http://www.vim.org/scripts/script.php?script%5Fid=1936&quot;&gt;Ryan Fabella’s indent script&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;It mostly detects closing brackets and parentheses and indents based on
what it finds.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/jiangmiao/simple-javascript-indenter&quot;&gt;jiangmiao/simple-javascript-indenter&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;An indent plugin with an option for alignment under functions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/jason0x43/vim-js-indent&quot;&gt;jason0x43/vim-js-indent&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;This is a somewhat new (last updated 2014, as of this writing) indent
script that also has some TypeScript support. It is based on an
&lt;a href=&quot;http://www.vim.org/scripts/script.php?script_id=1840&quot;&gt;older indent script by Tye Zdrojewski&lt;/a&gt; and the default JS-in-HTML indent
logic that comes with Vim.&lt;/li&gt;
&lt;li&gt;The indent logic starts with normal &lt;code&gt;cindent&lt;/code&gt; styles and adds special
cases for comments, JSDoc, arrays, and switch/case.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Your best bet is to stick with what comes with Vim by default, and only try
out the others if your coding style does not match what the rest of the
JavaScript community is converging towards. If there’s a quirk, it is probably
better to submit an issue with the &lt;a href=&quot;https://github.com/pangloss/vim-javascript&quot;&gt;pangloss/vim-javascript&lt;/a&gt; repo.&lt;/p&gt;
&lt;h2 id=&quot;related-syntaxes&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#related-syntaxes&quot; aria-label=&quot;related syntaxes permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Related syntaxes&lt;/h2&gt;
&lt;p&gt;During JavaScript development you may find yourself editing a lot of other
filetypes that plain JavaScript.&lt;/p&gt;
&lt;h3 id=&quot;esnext--es2016--es7-support&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#esnext--es2016--es7-support&quot; aria-label=&quot;esnext  es2016  es7 support permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;es.next / ES2016 / ES7 support&lt;/h3&gt;
&lt;p&gt;othree has a syntax plugin that provides support for planned, but not-yet-final
EcmaScript features: &lt;a href=&quot;https://github.com/othree/es.next.syntax.vim&quot;&gt;othree/es.next.syntax.vim&lt;/a&gt;. I personally don’t use it
since I currently stick to the ES2015 feature set at most.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/othree/es.next.syntax.vim&quot;&gt;othree/es.next.syntax.vim&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;jsx-support-for-react&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#jsx-support-for-react&quot; aria-label=&quot;jsx support for react permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;JSX support for React&lt;/h3&gt;
&lt;p&gt;If you write React and use its optional JSX syntax, adding the following plugin
will provide you with syntax highlighting for those inline XML-nodes:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;vim&quot; data-index=&quot;3&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;Plug &amp;#39;mxw/vim-jsx&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This plugin requires a JavaScript syntax plugin from above to define certain
JavaScript regions. It specifically mentions pangloss’ extension in the docs but
&lt;a href=&quot;https://github.com/mxw/vim-jsx/commit/80dbab7588c615126f47e50fa4d9c329d080ff95#diff-604ad63592f45d351d97cdc9eeae21a3R28&quot;&gt;actually supports any of them&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/mxw/vim-jsx&quot;&gt;mxw/vim-jsx&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;json&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#json&quot; aria-label=&quot;json permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;JSON&lt;/h3&gt;
&lt;p&gt;A lot of things use JSON for configuration, so I recommend &lt;a href=&quot;https://github.com/elzr/vim-json&quot;&gt;elzr/vim-json&lt;/a&gt; for
that. Check out its options, though; I don’t like some of the defaults so
I turn them off, but you might want them. Install with:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;vim&quot; data-index=&quot;4&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;Plug &amp;#39;elzr/vim-json&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/elzr/vim-json&quot;&gt;elzr/vim-json&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;jsdoc-syntax-highlighting&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#jsdoc-syntax-highlighting&quot; aria-label=&quot;jsdoc syntax highlighting permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;JSDoc syntax highlighting&lt;/h3&gt;
&lt;p&gt;If you document using JSDoc, all of the syntax plugins above support JSDoc
highlighting already. There’s a plugin called &lt;a href=&quot;https://github.com/othree/jsdoc-syntax.vim&quot;&gt;othree/jsdoc-syntax.vim&lt;/a&gt; that
pulls that support out of &lt;a href=&quot;https://github.com/othree/yajs.vim&quot;&gt;othree/yajs.vim&lt;/a&gt;, but it is only for adding JSDoc
support to &lt;em&gt;other&lt;/em&gt; languages like TypeScript.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/othree/jsdoc-syntax.vim&quot;&gt;othree/jsdoc-syntax.vim&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;jsdoc-auto-snippets&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#jsdoc-auto-snippets&quot; aria-label=&quot;jsdoc auto snippets permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;JSDoc auto-snippets&lt;/h3&gt;
&lt;p&gt;The plugin &lt;a href=&quot;https://github.com/heavenshell/vim-jsdoc&quot;&gt;heavenshell/vim-jsdoc&lt;/a&gt; can automatically insert JSDoc comments for
you if your cursor is on a function definition. It’ll check for the function
name, arguments, and add the doc-block comment for you.&lt;/p&gt;
&lt;p&gt;I use this plugin quite often (I actually have a fork of it with some additions
but hopefully they get merged into the upstream).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/heavenshell/vim-jsdoc&quot;&gt;heavenshell/vim-jsdoc&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;jquery-plugins&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#jquery-plugins&quot; aria-label=&quot;jquery plugins permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;jQuery plugins&lt;/h3&gt;
&lt;p&gt;Files named &lt;code&gt;jquery.*.js&lt;/code&gt; are typically jQuery plugins. There’s a specific
syntax highlighting plugin for such files: &lt;a href=&quot;https://github.com/itspriddle/vim-jquery&quot;&gt;itspriddle/vim-jquery&lt;/a&gt;, but it’s
pretty old and you’ll have better support combining an up-to-date syntax plugin
with the JavaScript libraries plugin in the next section.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/itspriddle/vim-jquery&quot;&gt;itspriddle/vim-jquery&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;javascript-libraries&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#javascript-libraries&quot; aria-label=&quot;javascript libraries permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;JavaScript libraries&lt;/h3&gt;
&lt;p&gt;othree has a syntax plugin, &lt;a href=&quot;https://github.com/othree/javascript-libraries-syntax.vim&quot;&gt;othree/javascript-libraries-syntax.vim&lt;/a&gt;, that
supports special highlighting of functions and keywords for various libraries
such as jQuery, lodash, React, Handlebars, Chai, etc. For an extensive list, see
the README at the plugin’s homepage.&lt;/p&gt;
&lt;p&gt;I personally do use this plugin.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/othree/javascript-libraries-syntax.vim&quot;&gt;othree/javascript-libraries-syntax.vim&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;code-completion-for-vim&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#code-completion-for-vim&quot; aria-label=&quot;code completion for vim permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Code completion for Vim&lt;/h2&gt;
&lt;p&gt;This is what you might know as “autocomplete” or “Intellisense.”&lt;/p&gt;
&lt;p&gt;Vim has a built-in completion feature that you can trigger by just using
&lt;code&gt;&amp;#x3C;C-X&gt;&lt;/code&gt; (that’s the &lt;code&gt;control-x&lt;/code&gt; key) and then another control-key sequence like
&lt;code&gt;&amp;#x3C;C-F&gt;&lt;/code&gt; to complete filenames or &lt;code&gt;&amp;#x3C;C-O&gt;&lt;/code&gt; to trigger omni-completion. You should
try it before trying to install a bunch of plugins to modify this behavior.&lt;/p&gt;
&lt;h3 id=&quot;omni-completion&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#omni-completion&quot; aria-label=&quot;omni completion permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Omni completion&lt;/h3&gt;
&lt;p&gt;I won’t go into too much detail about this since it isn’t JavaScript specific.&lt;/p&gt;
&lt;p&gt;Vim includes basic code completion built in. See &lt;a href=&quot;http://vim.wikia.com/wiki/Omni_completion&quot;&gt;this wikia article&lt;/a&gt; for
information on how to use that. The gist is that the completion system will
run a function, the &lt;code&gt;omnifunc&lt;/code&gt;, to populate autocompletion pop-up with results.&lt;/p&gt;
&lt;p&gt;To use the default completion function, you may need to add this to your
&lt;code&gt;.vimrc&lt;/code&gt; file:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;vim&quot; data-index=&quot;5&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;autocmd FileType javascript setlocal omnifunc=javascriptcomplete#CompleteJS&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You might not need to add it if the &lt;code&gt;&amp;#x3C;C-X&gt;&amp;#x3C;C-O&gt;&lt;/code&gt; trigger already works for you,
it depends on what version of Vim and the Vim runtime you have.&lt;/p&gt;
&lt;p&gt;For even better completion, consider using a plugin like
&lt;a href=&quot;https://github.com/Shougo/neocomplete.vim&quot;&gt;Shougo/neocomplete.vim&lt;/a&gt; or &lt;a href=&quot;https://github.com/Valloric/YouCompleteMe&quot;&gt;Valloric/YouCompleteMe&lt;/a&gt;. On Neovim, an option is
&lt;a href=&quot;https://github.com/Shougo/deoplete.nvim&quot;&gt;Shougo/deoplete.nvim&lt;/a&gt;.&lt;br&gt;
These plugins will add features like automatically popping up the completion
menu, caching of keywords, and integration with other sources of completion
than what’s in the current Vim buffer (allowing for multiple &lt;code&gt;omnifunc&lt;/code&gt;s).&lt;/p&gt;
&lt;p&gt;For portability across my systems without needing a recompile, I use
&lt;a href=&quot;https://github.com/Shougo/neocomplete.vim&quot;&gt;Shougo/neocomplete.vim&lt;/a&gt;. Shougo’s plugins and YouCompleteMe both offer roughly
the same feature set, though, so whatever might be missing in one can probably
be configured into it.&lt;/p&gt;
&lt;p&gt;With &lt;a href=&quot;https://github.com/Shougo/neocomplete.vim&quot;&gt;Shougo/neocomplete.vim&lt;/a&gt;, using multiple sources of completion can be done
by providing a list of function names like so:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;vim&quot; data-index=&quot;6&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  let g:neocomplete#sources#omni#functions.javascript = [&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;        \   &amp;#39;jspc#omni&amp;#39;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;        \   &amp;#39;tern#Complete&amp;#39;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;        \ ]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I won’t guarantee that the above works, since the plugins get updated regularly
and neocomplete does not like &lt;code&gt;omnifunc&lt;/code&gt;s that move the cursor around when the
function is executed.&lt;/p&gt;
&lt;h3 id=&quot;extended-omni-completion&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#extended-omni-completion&quot; aria-label=&quot;extended omni completion permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Extended omni-completion&lt;/h3&gt;
&lt;p&gt;The plugin &lt;a href=&quot;https://github.com/1995eaton/vim-better-javascript-completion&quot;&gt;1995eaton/vim-better-javascript-completion&lt;/a&gt; provides a somewhat
up-to-date JavaScript with HTML5 methods (e.g. &lt;code&gt;localStorage&lt;/code&gt; and &lt;code&gt;canvas&lt;/code&gt;
methods).&lt;/p&gt;
&lt;p&gt;This plugin creates a new omni-completion function, &lt;code&gt;js#CompleteJS&lt;/code&gt;, and
replaces your current JS &lt;code&gt;omnifunc&lt;/code&gt; with that. That means you’ll have to use
a completion plugin or write some VimL yourself if you want to use it in
conjunction with another &lt;code&gt;omnifunc&lt;/code&gt; like TernJS in the next section.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/1995eaton/vim-better-javascript-completion&quot;&gt;1995eaton/vim-better-javascript-completion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;code-analysis-based-completion-via-ternjs&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#code-analysis-based-completion-via-ternjs&quot; aria-label=&quot;code analysis based completion via ternjs permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Code-analysis based completion via TernJS&lt;/h3&gt;
&lt;p&gt;TernJS is kind of like IntelliSense if you’ve ever used Visual Studio, or like
the autocompletion for many very robust IDEs. It parses your code and extracts
various symbols, like function names, variable names, and values.&lt;/p&gt;
&lt;p&gt;The official vim plugin can also show you function signatures (what parameters
parameters it expects) and can extract values from related files (e.g. CommonJS
&lt;code&gt;require()&lt;/code&gt;‘d files) if you configure it to do so (via a &lt;code&gt;.tern-project&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;The completion is provided to Vim’s auto-completion engine via an &lt;code&gt;omnifunc&lt;/code&gt;,
&lt;code&gt;tern#Complete&lt;/code&gt;. Again, you’ll have to setup your &lt;code&gt;omnifunc&lt;/code&gt; appropriately to
use TernJS results instead of the default omni-completion results.&lt;/p&gt;
&lt;p&gt;Installing via &lt;a href=&quot;https://github.com/junegunn/vim-plug&quot;&gt;vim-plug&lt;/a&gt;, which can run additional commands before plugin
installation, is done like this:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;vim&quot; data-index=&quot;7&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;Plug &amp;#39;ternjs/tern_for_vim&amp;#39;, { &amp;#39;do&amp;#39;: &amp;#39;npm install&amp;#39; }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will install its npm dependencies for you (Tern runs a node-based analyzer
in the background while you’re editing).&lt;/p&gt;
&lt;p&gt;I use this plugin with many of its extra features turned off, just keeping the
completion.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ternjs/tern_for_vim&quot;&gt;ternjs/tern_for_vim&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;function-parameter-completion&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#function-parameter-completion&quot; aria-label=&quot;function parameter completion permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Function parameter completion&lt;/h3&gt;
&lt;p&gt;othree has a plugin called JavaScript Parameter Complete that detects when
you’re inside a function argument and provides some common autocomplete
suggestions for it. This is not a feature that TernJS provides, since Tern only
adds existing symbols. For example, if you’re writing an event listener, it’ll
suggest things like &lt;code&gt;click&lt;/code&gt;, and &lt;code&gt;mouseover&lt;/code&gt; for you. You can see all the
suggestions it provides in its &lt;a href=&quot;https://github.com/othree/jspc.vim/blob/master/autoload/jspc/javascript.vim&quot;&gt;GitHub source&lt;/a&gt;.
Install the plugin via:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;vim&quot; data-index=&quot;8&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;Plug &amp;#39;othree/jspc.vim&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On load, the jspc.vim plugin automatically detects whatever &lt;code&gt;omnifunc&lt;/code&gt; you
already have set as your default. It wraps it with the parameter completion,
and falls back to your default if you are not in a parameter completion.
Because of this you should specify &lt;code&gt;jspc#omni&lt;/code&gt; &lt;em&gt;instead&lt;/em&gt; of whatever your
default completion is (typically &lt;code&gt;javascriptcomplete#CompleteJS&lt;/code&gt;).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/othree/jspc.vim&quot;&gt;othree/jspc.vim&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;code-navigation&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#code-navigation&quot; aria-label=&quot;code navigation permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Code navigation&lt;/h2&gt;
&lt;h3 id=&quot;jumping-between-commonjs-modules&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#jumping-between-commonjs-modules&quot; aria-label=&quot;jumping between commonjs modules permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Jumping between CommonJS modules&lt;/h3&gt;
&lt;p&gt;The plugin &lt;a href=&quot;https://github.com/moll/vim-node&quot;&gt;moll/vim-node&lt;/a&gt; adds keybindings like for jumping to files in your
CommonJS &lt;code&gt;require&lt;/code&gt; statements.&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;vim&quot; data-index=&quot;9&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;Plug &amp;#39;moll/vim-node&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/moll/vim-node&quot;&gt;moll/vim-node&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;ctags---symbol-based-navigation&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#ctags---symbol-based-navigation&quot; aria-label=&quot;ctags   symbol based navigation permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;CTags - Symbol based navigation&lt;/h3&gt;
&lt;p&gt;CTags are lists of all symbols in your projects (function names, variable names,
filenames, etc.). Vim provides ctag support by default, with keybindings to jump
to declarations and definitions, and there are a slew of plugins (e.g.
&lt;a href=&quot;https://github.com/ludovicchabant/vim-gutentags&quot;&gt;ludovicchabant/vim-gutentags&lt;/a&gt;) that can auto-generate the tags file for you.
Using &lt;a href=&quot;https://github.com/majutsushi/tagbar&quot;&gt;majutsushi/tagbar&lt;/a&gt;, &lt;a href=&quot;https://github.com/Shougo/unite.vim&quot;&gt;Shougo/unite.vim&lt;/a&gt;, &lt;a href=&quot;https://github.com/ctrlpvim/ctrlp.vim&quot;&gt;ctrlpvim/ctrlp.vim&lt;/a&gt;, or a bunch
of other plugins (and plugins that work with them — plugin-plugins), you can
browse through those tags.&lt;/p&gt;
&lt;p&gt;Of particular note on the generation side is &lt;a href=&quot;https://github.com/ramitos/jsctags&quot;&gt;ramitos/jsctags&lt;/a&gt;, which will
generate ctags using TernJS.&lt;/p&gt;
&lt;p&gt;Personally, I find ctags too annoying to use since the files need to be
regenerated to search them (except with &lt;a href=&quot;https://github.com/majutsushi/tagbar&quot;&gt;majutsushi/tagbar&lt;/a&gt; which runs ctags
on every open, but only for the current file). Usually just using &lt;code&gt;git grep&lt;/code&gt; or
&lt;a href=&quot;https://github.com/ggreer/the_silver_searcher&quot;&gt;the_silver_searcher&lt;/a&gt; is adequate, and there are plugins for those, too (out
of scope for this article).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ramitos/jsctags&quot;&gt;ramitos/jsctags&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;linting&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#linting&quot; aria-label=&quot;linting permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Linting&lt;/h2&gt;
&lt;p&gt;While there are actually JSHint, JSLint, eslint, etc. runners for Vim, for your
own sanity just use &lt;a href=&quot;https://github.com/scrooloose/syntastic&quot;&gt;scrooloose/syntastic&lt;/a&gt;. It supports a variety of syntax
checkers, but you may need to install them first. For example, for eslint
support, which is the standard these days, &lt;code&gt;npm install -g eslint&lt;/code&gt; first.
Refer to syntastic’s &lt;a href=&quot;https://github.com/scrooloose/syntastic/wiki/JavaScript&quot;&gt;wiki page on configuring various JavaScript linters&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Syntastic’s pitfalls are that it is large (it is essentially a linter
framework for Vim) and it doesn’t run asynchronously (doesn’t mean it is slow
though — depends on the speed of the lint program).&lt;/p&gt;
&lt;p&gt;You could alternatively use Vim’s built-in &lt;code&gt;makeprg&lt;/code&gt;, which can run any program
and output the results to Vim, but you miss out on things like using multiple
&lt;code&gt;makeprg&lt;/code&gt;s at a time (e.g. JSCS, eslint, and the flow type checker at once)
and grouping results. Syntastic actually uses makeprg under the covers, so
besides the minimal overhead of configuring some variables it really isn’t
any slower.&lt;/p&gt;
&lt;p&gt;There’s &lt;a href=&quot;https://github.com/osyo-manga/vim-watchdogs&quot;&gt;osyo-manga/vim-watchdogs&lt;/a&gt;, which runs linters asynchronously, but the
docs are only in Japanese. The plugins &lt;a href=&quot;https://github.com/Shougo/vimproc.vim&quot;&gt;Shougo/vimproc.vim&lt;/a&gt; and
&lt;a href=&quot;https://github.com/tpope/vim-dispatch&quot;&gt;tpope/vim-dispatch&lt;/a&gt; can run any tool async, but they aren’t easily
configurable as lint-runners. If you follow modern JS design patterns, your
JavaScript files should ideally be small modules so running linters
asynchronously won’t provide noticeable benefit.&lt;/p&gt;
&lt;p&gt;If you’re running Neovim, &lt;a href=&quot;https://github.com/benekastah/neomake&quot;&gt;neomake&lt;/a&gt; is
an option that’s gaining popularity. It makes full use of Neovim’s asynchronous
job support.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/scrooloose/syntastic&quot;&gt;scrooloose/syntastic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/osyo-manga/vim-watchdogs&quot;&gt;osyo-manga/vim-watchdogs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/benekastah/neomake&quot;&gt;neomake&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;formatting&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#formatting&quot; aria-label=&quot;formatting permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Formatting&lt;/h2&gt;
&lt;p&gt;Vim has a built-in re-formatter for whitespace. Visually select some text and
use the &lt;code&gt;=&lt;/code&gt; key to re-indent all of it.&lt;/p&gt;
&lt;p&gt;For minified JS, there’s a vim plugin, &lt;a href=&quot;https://github.com/maksimr/vim-jsbeautify&quot;&gt;vim-jsbeautify&lt;/a&gt;, that can run your code
through jsbeautifier for you. I personally don’t use this and prefer to go to
the jsbeautifier website, copying and pasting it there if I need to un-minify
something.&lt;/p&gt;
&lt;p&gt;There’s also &lt;a href=&quot;https://github.com/Chiel92/vim-autoformat&quot;&gt;Chiel92/vim-autoformat&lt;/a&gt;, which supports formatters for many
different languages. Of note is &lt;a href=&quot;http://jscs.info/&quot;&gt;jscs&lt;/a&gt; and
&lt;a href=&quot;https://github.com/einars/js-beautify&quot;&gt;js-beautifier&lt;/a&gt; support.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/maksimr/vim-jsbeautify&quot;&gt;vim-jsbeautify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Chiel92/vim-autoformat&quot;&gt;Chiel92/vim-autoformat&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;my-vim-setup&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#my-vim-setup&quot; aria-label=&quot;my vim setup permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;My Vim setup&lt;/h2&gt;
&lt;p&gt;You can dig through &lt;a href=&quot;https://github.com/davidosomething/dotfiles/tree/master/vim&quot;&gt;my Vim configuration on GitHub&lt;/a&gt;. Please note that this
article was written a while ago, and since then I’ve completely switched over
to Neovim so a lot of the configuration may not apply to you. The plugins
I use are all in the main vimrc file, and their configurations are
interspersed into &lt;code&gt;plugin/&lt;/code&gt;, &lt;code&gt;ftplugin/&lt;/code&gt;, and &lt;code&gt;after/*/&lt;/code&gt; to cope with the
order in which Vim loads files.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/davidosomething/dotfiles/tree/master/vim&quot;&gt;my Vim configuration on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;style class=&quot;grvsc-styles&quot;&gt;
  .grvsc-container {
    overflow: auto;
    position: relative;
    -webkit-overflow-scrolling: touch;
    padding-top: 1rem;
    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));
    padding-bottom: 1rem;
    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));
    border-radius: 8px;
    border-radius: var(--grvsc-border-radius, 8px);
    font-feature-settings: normal;
    line-height: 1.4;
  }
  
  .grvsc-code {
    display: table;
  }
  
  .grvsc-line {
    display: table-row;
    box-sizing: border-box;
    width: 100%;
    position: relative;
  }
  
  .grvsc-line &gt; * {
    position: relative;
  }
  
  .grvsc-gutter-pad {
    display: table-cell;
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  .grvsc-gutter {
    display: table-cell;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter::before {
    content: attr(data-content);
  }
  
  .grvsc-source {
    display: table-cell;
    padding-left: 1.5rem;
    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));
    padding-right: 1.5rem;
    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));
  }
  
  .grvsc-source:empty::after {
    content: &apos; &apos;;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter + .grvsc-source {
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  /* Line transformer styles */
  
  .grvsc-has-line-highlighting &gt; .grvsc-code &gt; .grvsc-line::before {
    content: &apos; &apos;;
    position: absolute;
    width: 100%;
  }
  
  .grvsc-line-diff-add::before {
    background-color: var(--grvsc-line-diff-add-background-color, rgba(0, 255, 60, 0.2));
  }
  
  .grvsc-line-diff-del::before {
    background-color: var(--grvsc-line-diff-del-background-color, rgba(255, 0, 20, 0.2));
  }
  
  .grvsc-line-number {
    padding: 0 2px;
    text-align: right;
    opacity: 0.7;
  }
  
  .default-dark {
    background-color: #1E1E1E;
    color: #D4D4D4;
  }
  .default-dark .mtk1 { color: #D4D4D4; }
  .default-dark .grvsc-line-highlighted::before {
    background-color: var(--grvsc-line-highlighted-background-color, rgba(255, 255, 255, 0.1));
    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, rgba(255, 255, 255, 0.5));
  }
&lt;/style&gt;</content:encoded></item><item><title><![CDATA[Rebuilding davidosomething.com as a static site]]></title><description><![CDATA[I’ve rebuilt my website from the ground-up for the new year, finishing it just
in time. This site is now fully static, templates in…]]></description><link>https://www.davidosomething.com/rebuilding-for-2016/</link><guid isPermaLink="false">https://www.davidosomething.com/rebuilding-for-2016/</guid><pubDate>Tue, 29 Dec 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I’ve rebuilt my website from the ground-up for the new year, finishing it just
in time. This site is now fully static, templates in Handlebars syntax and posts
written in Markdown are combined into plain old HTML, where WordPress and PHP
were previously providing the templating and storing the post formatting as
HTML in a database.&lt;/p&gt;
&lt;h2 id=&quot;the-new-stack&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-new-stack&quot; aria-label=&quot;the new stack permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The new stack&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Replaced PHP templating with Handlebars&lt;/li&gt;
&lt;li&gt;Replaced WordPress serving with Metalsmith generation&lt;/li&gt;
&lt;li&gt;Replaced MySQL storage engine with Markdown files in git&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There is no more ruby dependency since I am using node-sass instead of ruby-sass
and sass-lint instead of the scss-lint gem.&lt;/p&gt;
&lt;p&gt;JS-wise I am using es2015, but not really using any of its cool features except
arrow functions and dynamic templating. Metalsmith uses generators, so it
requires either node version 4.2+ or 0.12 with the harmony flag on; I opted to
use node v4.2.&lt;/p&gt;
&lt;h2 id=&quot;migrating-from-wordpress&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#migrating-from-wordpress&quot; aria-label=&quot;migrating from wordpress permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Migrating from WordPress&lt;/h2&gt;
&lt;p&gt;There was a brief period of time where I secretly added a query parameter to the
WordPress version of this site which would cause it to spit out the raw contents
of each post as plain text. I only had 40 posts so it wasn’t a big deal to grab
each one and reformat them into Markdown using an HTML to markdown converter.
I output the post meta data into YAML format above each post and saved it out as
the frontmatter for each new markdown file.&lt;/p&gt;
&lt;p&gt;The interim scripts I used to clean up the PHP to HTML to Markdown files are
left in the github repo in
&lt;a href=&quot;https://github.com/davidosomething/16.davidosomething.com/tree/962ba928f4500410d0b2f1469b3fed7361708f97/bin&quot;&gt;bin/&lt;/a&gt;.
It’s one of the few times I’ve ever decided to use PHP from the command-line,
and also the only PHP in the repo.&lt;/p&gt;
&lt;h2 id=&quot;seo&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#seo&quot; aria-label=&quot;seo permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;SEO&lt;/h2&gt;
&lt;p&gt;Getting rid of WordPress meant that I would have to do a lot of plugin-provided
SEO work myself. I’ve fully marked-up this site using
&lt;a href=&quot;https://schema.org/BlogPosting&quot;&gt;schema.org&lt;/a&gt; Microdata. I prefer that over
JSON-LD since it is more specific regarding which DOM node represents an entity.
Twitter cards, OpenGraph tags, standard meta tags and site validation are all
trivial in comparison to the verbosity of Microdata.&lt;/p&gt;
&lt;h2 id=&quot;templating&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#templating&quot; aria-label=&quot;templating permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Templating&lt;/h2&gt;
&lt;p&gt;I redid the HTML templating with Handlebars, which is amazingly clean compared
to jumping in and out of PHP tags. If you’re doing that in WordPress, consider
using twig or something - I really don’t know how anyone can live like that.&lt;/p&gt;
&lt;h2 id=&quot;setting-up-metalsmith&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#setting-up-metalsmith&quot; aria-label=&quot;setting up metalsmith permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Setting up Metalsmith&lt;/h2&gt;
&lt;p&gt;Metalsmith is like gulp in that it is pretty much just a task runner. Or maybe
it is more like broccoli in that it works on a directory (tree) rather than on
a stream.&lt;/p&gt;
&lt;p&gt;You give Metalsmith the path to your markdown files (or any files), and then
tell it to &lt;code&gt;use(someplugin())&lt;/code&gt;, which will transform those files. This is not
exactly a functional map operation, but it works similarly, and the plugins
basically provide a function that serves as the map iteratee.&lt;/p&gt;
&lt;p&gt;Despite Metalsmith providing its own CLI tool and being capable of running
Gulp plugins, I opted to use it as a JS module from within Gulp. It’s just
easier to remember &lt;code&gt;gulp html&lt;/code&gt; to generate my html since it is mentally the same
as &lt;code&gt;gulp css&lt;/code&gt; and &lt;code&gt;gulp js&lt;/code&gt; for those respective build steps. Also my CSS task
actually operates on two different streams so it was worth keeping Gulp around.&lt;/p&gt;
&lt;h2 id=&quot;future-plan&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#future-plan&quot; aria-label=&quot;future plan permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Future plan&lt;/h2&gt;
&lt;p&gt;I’m looking to switch to &lt;a href=&quot;https://github.com/gatsbyjs/gatsby&quot;&gt;gatsby&lt;/a&gt; — a react
based static site generator. Basically all this does is use react templating
instead of handlebars, and uses react’s output to static html to generate the
file. Converting handlebars templates to react is trivial (it is practically
just wrapping the handlebars template in some React code) and this will have the
added bonus of hot-reloading for previewing posts.&lt;/p&gt;
&lt;h2 id=&quot;open-source&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#open-source&quot; aria-label=&quot;open source permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Open source&lt;/h2&gt;
&lt;p&gt;The site source is &lt;a href=&quot;https://github.com/davidosomething/16.davidosomething.com&quot;&gt;on github&lt;/a&gt;.
Kinda nice that there’s nothing to hide (database pws, dot-env files, whatever),
now that there’s no backend.&lt;/p&gt;
&lt;style class=&quot;grvsc-styles&quot;&gt;
  .grvsc-container {
    overflow: auto;
    position: relative;
    -webkit-overflow-scrolling: touch;
    padding-top: 1rem;
    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));
    padding-bottom: 1rem;
    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));
    border-radius: 8px;
    border-radius: var(--grvsc-border-radius, 8px);
    font-feature-settings: normal;
    line-height: 1.4;
  }
  
  .grvsc-code {
    display: table;
  }
  
  .grvsc-line {
    display: table-row;
    box-sizing: border-box;
    width: 100%;
    position: relative;
  }
  
  .grvsc-line &gt; * {
    position: relative;
  }
  
  .grvsc-gutter-pad {
    display: table-cell;
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  .grvsc-gutter {
    display: table-cell;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter::before {
    content: attr(data-content);
  }
  
  .grvsc-source {
    display: table-cell;
    padding-left: 1.5rem;
    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));
    padding-right: 1.5rem;
    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));
  }
  
  .grvsc-source:empty::after {
    content: &apos; &apos;;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter + .grvsc-source {
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  /* Line transformer styles */
  
  .grvsc-has-line-highlighting &gt; .grvsc-code &gt; .grvsc-line::before {
    content: &apos; &apos;;
    position: absolute;
    width: 100%;
  }
  
  .grvsc-line-diff-add::before {
    background-color: var(--grvsc-line-diff-add-background-color, rgba(0, 255, 60, 0.2));
  }
  
  .grvsc-line-diff-del::before {
    background-color: var(--grvsc-line-diff-del-background-color, rgba(255, 0, 20, 0.2));
  }
  
  .grvsc-line-number {
    padding: 0 2px;
    text-align: right;
    opacity: 0.7;
  }
  
&lt;/style&gt;</content:encoded></item><item><title><![CDATA[grunt-wendy – CasperJS for GruntJS]]></title><description><![CDATA[grunt-wendy is my latest Grunt
plugin. It’s a CasperJS test runner with customizable filtering and formatting
options, which CasperJS alone…]]></description><link>https://www.davidosomething.com/grunt-wendy-casperjs/</link><guid isPermaLink="false">https://www.davidosomething.com/grunt-wendy-casperjs/</guid><pubDate>Sat, 19 Sep 2015 00:00:07 GMT</pubDate><content:encoded>&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 100px; &quot;&gt;
      &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/d6a01ed931eaeadc4089a74e67ab2584/7e516/wendy.png&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 160%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAgCAIAAACdAM/hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFSElEQVQ4y3WVe0xTVxzHD5SCWzQSnS4ORyZWWtqLUzIgm9k0Kg6XTFGzTYlLnM7HdG5O3ebc4vA1jWh06ACZGAQFB1NeLQr0RVvaUvqwOEBGQUABAXmsYHt77z3nLPcSoUg9+f1xc/L73PN7fH/nAMwu5G1o9ANBjCDE2NnfN9L3BI/6IW9PDDgUIkyPGcYMQgzG+NnQQNONVP1nS3Sfr+hssD1tbyadQ9wfKIThOAwxDTHNIA/GcGTY6XzmGhkcNB/YUi3g3wsD1RGBZTs36DYvb624DTGGyOMDhgi6yWftD/S1ZQct+R8qv56tXjrNKuYriKAsItgcBvTHDpCQCxBNgCmEUW93i0W2o6VycbtS2FYZ9kgnsecuqFn2qlYYUCp+RS4KqDp+kGI8E2HEIMy4SZexeEeHIrRTI+zUijs1RKda1FwZVZ74ZpWIXynkFccvbDTrMUbMhJxZGLldQ6aCFW3y8Oa7ksdVEV1acUuF0HZ9V8WejQoiSC3iqZeE9DvqMcYMnJAzgzBNUp57iqOtFWG1eeFNsogOtahNLtGkri/cv1O2cJpUPEU6D7QYVBxMTigYFwkaGuiq156RpsQVn1xvztxek/6d6co5efKxioQYRbh/riBQn/yz82kP1y1mUrUZD8a4/NfDV/ZsNWSkm9IuNtTobTezVUePyD4IsxD+xjCg3/6xc2SQU5EXzECWfFR3r/TbdwtOxuclHZafOyVNu6i99Jvh6jrdpRhj3FTzXKD5iOgf6B2VmxfMkBjjlgrptYQ50qTV9oyLNSnJ+vOn6zJ+V12OrSsV6BOCVe8LHFV3kI+wEQUxTTFkTdqZnE/jqs6fMl5Oacz+s+HaVWXK7r+/Cc0/tL3nSTdmFUZDHzmzxu4ODA2YquSFX26QH9pd+cs++ZroO5Ez1HsTGzLPOUpuDPZ0jg7JOMwNE7sHMX5ira79cUu+gK+LmaWNnaUS+BUIAjRvgeq5QBXO0+xa19vm8BYJbLabddlX/rlboj++vzJy6u0QoJEE2iL8jUKQvpS4dWCXdOMKxeLpjYumSGeD2uzU8bBp6CnPztQVFWjzsqSb43VbV19fThQJpyjFQWpx4M1FM//au1V36awyerYhBJTGiR1mo5dI2MGAFEPVG7U9jzqGSZdy0zKTENRK+DaCJ4udU7Rvmzb1QtmmldqDXzyss0zOmWELxnXbkHJCFw6sEp6V4NcKgXRNtK1a03rf1vpvI8nWBPmcZwpjPEy6VAnRpvnAGsm3RvINYaBwTcww6R69iCCimEmXAdtkkvL0Nd+3p582xs60iICFCLBFBujmg1vb1mGMacbNQM/oMROmilMYXXMhSfHOayYBG7CFMxsRUB0Oig7tZocJecbk8BxmL0Tc391uvHU9VzzdLgTWCH+LCFiJABaW8PQRPFnycU5Yk2EubI9nxJSflRH1RsGCIOVKoSKeqInwYwsm9jdEBilyMjmY8gFDSLOH93aXJMYVzgV3ftjxsPmBastqkxBYxH6aqOl2veZlMBu22+NWpyVnSYKz5/HUR/a6MG7Vlivng/sSv1wi2FqSz+Xs6+QOR1Pe91+djQotT9rfICvob3dAjOtyM+QL/MpE/BNvh9jLi18K93Q9rleX9zkaSEiPTkdfV3vOqsXSeaA4MU5x9Y9hZz/bTp/w2EKIphkXwshhrr4R9XpOKEj/ZNVDRxPbYy/yxT7TkKQZ8rkHQ1Eue2Fu/tr3Ts4A5rLbL1TrxVZ5P3Tcg8DqtNVuKtu2tvSnPS73MIuzN+yYz3jYaLIhyD2Uzv+etjYzNOXLDf8Psmu/fZhLMT8AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source srcset=&quot;/static/d6a01ed931eaeadc4089a74e67ab2584/114f5/wendy.webp 100w&quot; sizes=&quot;(max-width: 100px) 100vw, 100px&quot; type=&quot;image/webp&quot;&gt;
          &lt;source srcset=&quot;/static/d6a01ed931eaeadc4089a74e67ab2584/7e516/wendy.png 100w&quot; sizes=&quot;(max-width: 100px) 100vw, 100px&quot; type=&quot;image/png&quot;&gt;
          &lt;img class=&quot;gatsby-resp-image-image&quot; src=&quot;/static/d6a01ed931eaeadc4089a74e67ab2584/7e516/wendy.png&quot; alt=&quot;grunt-wendy logo&quot; title=&quot;grunt-wendy logo&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/davidosomething/grunt-wendy&quot;&gt;grunt-wendy&lt;/a&gt; is my latest Grunt
plugin. It’s a CasperJS test runner with customizable filtering and formatting
options, which CasperJS alone lacks.&lt;/p&gt;
&lt;h2 id=&quot;installation&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#installation&quot; aria-label=&quot;installation permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Installation&lt;/h2&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;bash&quot; data-index=&quot;0&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;npm install --save-dev grunt-wendy&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;See the docs and contribute to grunt-wendy on the GitHub repository here:
&lt;a href=&quot;https://github.com/davidosomething/grunt-wendy&quot;&gt;grunt-wendy on GitHub&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;vs-others&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#vs-others&quot; aria-label=&quot;vs others permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;VS others&lt;/h2&gt;
&lt;p&gt;Compared to
&lt;a href=&quot;https://github.com/iamchrismiller/grunt-casper&quot;&gt;iamchrismiller/grunt-casper&lt;/a&gt;
and
&lt;a href=&quot;https://github.com/ronaldlokers/grunt-casperjs&quot;&gt;ronaldlokers/grunt-casperjs&lt;/a&gt;,
the top two Grunt CasperJS test runners (all others are no longer maintained),
this task:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;adds formatting options to format CasperJS’ output&lt;/li&gt;
&lt;li&gt;adds filtering to filter out unwanted CasperJS output&lt;/li&gt;
&lt;li&gt;adds option to &lt;strong&gt;not fail&lt;/strong&gt; on conditions — e.g. just output a warning when
there are dubious or skipped tests&lt;/li&gt;
&lt;li&gt;is version locked to PhantomJS 1.9.7 via the &lt;a href=&quot;https://github.com/Medium/phantomjs&quot;&gt;node phantomjs 1.9.11
module&lt;/a&gt; — this is a troublemaker for
a lot of errors with the other tasks&lt;/li&gt;
&lt;li&gt;fully exposes the casper cli (iamchrismiller’s uses options only), including
allowing custom test runner instead of just &lt;kbd&gt;casper test&lt;/kbd&gt; (neither
of the others do)&lt;/li&gt;
&lt;li&gt;currently maintained by original developer (ronaldloker’s is not, and
although pull requests are merged by
&lt;a href=&quot;https://github.com/gorillamania&quot;&gt;@gorillamania&lt;/a&gt; other chores are not
guaranteed: changelog, bump, npm publish)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;whats-next&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#whats-next&quot; aria-label=&quot;whats next permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What’s next?&lt;/h2&gt;
&lt;p&gt;Planned additions are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SlimerJS support for gecko (use iamchrismiller’s if you need this) and possibly trifleJS support for IE.&lt;/li&gt;
&lt;li&gt;Optional polyfill auto-injection for &lt;var&gt;Function.prototype.bind&lt;/var&gt;, since PhantomJS 1.9.7 doesn’t implement it.&lt;/li&gt;
&lt;li&gt;Inclusion of other output formats for reporting besides CasperJS’ included xunit xml file&lt;/li&gt;
&lt;/ul&gt;
&lt;style class=&quot;grvsc-styles&quot;&gt;
  .grvsc-container {
    overflow: auto;
    position: relative;
    -webkit-overflow-scrolling: touch;
    padding-top: 1rem;
    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));
    padding-bottom: 1rem;
    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));
    border-radius: 8px;
    border-radius: var(--grvsc-border-radius, 8px);
    font-feature-settings: normal;
    line-height: 1.4;
  }
  
  .grvsc-code {
    display: table;
  }
  
  .grvsc-line {
    display: table-row;
    box-sizing: border-box;
    width: 100%;
    position: relative;
  }
  
  .grvsc-line &gt; * {
    position: relative;
  }
  
  .grvsc-gutter-pad {
    display: table-cell;
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  .grvsc-gutter {
    display: table-cell;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter::before {
    content: attr(data-content);
  }
  
  .grvsc-source {
    display: table-cell;
    padding-left: 1.5rem;
    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));
    padding-right: 1.5rem;
    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));
  }
  
  .grvsc-source:empty::after {
    content: &apos; &apos;;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter + .grvsc-source {
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  /* Line transformer styles */
  
  .grvsc-has-line-highlighting &gt; .grvsc-code &gt; .grvsc-line::before {
    content: &apos; &apos;;
    position: absolute;
    width: 100%;
  }
  
  .grvsc-line-diff-add::before {
    background-color: var(--grvsc-line-diff-add-background-color, rgba(0, 255, 60, 0.2));
  }
  
  .grvsc-line-diff-del::before {
    background-color: var(--grvsc-line-diff-del-background-color, rgba(255, 0, 20, 0.2));
  }
  
  .grvsc-line-number {
    padding: 0 2px;
    text-align: right;
    opacity: 0.7;
  }
  
  .default-dark {
    background-color: #1E1E1E;
    color: #D4D4D4;
  }
  .default-dark .mtk1 { color: #D4D4D4; }
  .default-dark .grvsc-line-highlighted::before {
    background-color: var(--grvsc-line-highlighted-background-color, rgba(255, 255, 255, 0.1));
    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, rgba(255, 255, 255, 0.5));
  }
&lt;/style&gt;</content:encoded></item><item><title><![CDATA[git-my]]></title><description><![CDATA[Git doesn’t track who created branches. This makes it difficult to keep track of
your own branches when you have a lot of them checked out…]]></description><link>https://www.davidosomething.com/git-my/</link><guid isPermaLink="false">https://www.davidosomething.com/git-my/</guid><pubDate>Sun, 29 Mar 2015 22:39:39 GMT</pubDate><content:encoded>&lt;p&gt;Git doesn’t track who created branches. This makes it difficult to keep track of
your own branches when you have a lot of them checked out locally.&lt;/p&gt;
&lt;p&gt;To remedy this, I wrote a shell script that gets all the remote git branches and
filters them out based on the last committer. It then lists the ones where you
were the last committer.&lt;/p&gt;
&lt;p&gt;You can find the script here:&lt;br&gt;
&lt;a href=&quot;https://github.com/davidosomething/git-my&quot;&gt;https://github.com/davidosomething/git-my&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here’s a screenshot of it in action:&lt;br&gt;
&lt;img src=&quot;https://raw.githubusercontent.com/davidosomething/git-my/docs/screenshot.png&quot; alt=&quot;Screenshot of git-my&quot;&gt;&lt;/p&gt;
&lt;style class=&quot;grvsc-styles&quot;&gt;
  .grvsc-container {
    overflow: auto;
    position: relative;
    -webkit-overflow-scrolling: touch;
    padding-top: 1rem;
    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));
    padding-bottom: 1rem;
    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));
    border-radius: 8px;
    border-radius: var(--grvsc-border-radius, 8px);
    font-feature-settings: normal;
    line-height: 1.4;
  }
  
  .grvsc-code {
    display: table;
  }
  
  .grvsc-line {
    display: table-row;
    box-sizing: border-box;
    width: 100%;
    position: relative;
  }
  
  .grvsc-line &gt; * {
    position: relative;
  }
  
  .grvsc-gutter-pad {
    display: table-cell;
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  .grvsc-gutter {
    display: table-cell;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter::before {
    content: attr(data-content);
  }
  
  .grvsc-source {
    display: table-cell;
    padding-left: 1.5rem;
    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));
    padding-right: 1.5rem;
    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));
  }
  
  .grvsc-source:empty::after {
    content: &apos; &apos;;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter + .grvsc-source {
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  /* Line transformer styles */
  
  .grvsc-has-line-highlighting &gt; .grvsc-code &gt; .grvsc-line::before {
    content: &apos; &apos;;
    position: absolute;
    width: 100%;
  }
  
  .grvsc-line-diff-add::before {
    background-color: var(--grvsc-line-diff-add-background-color, rgba(0, 255, 60, 0.2));
  }
  
  .grvsc-line-diff-del::before {
    background-color: var(--grvsc-line-diff-del-background-color, rgba(255, 0, 20, 0.2));
  }
  
  .grvsc-line-number {
    padding: 0 2px;
    text-align: right;
    opacity: 0.7;
  }
  
&lt;/style&gt;</content:encoded></item><item><title><![CDATA[Linux on the Lenovo Thinkpad W510 – Part 3]]></title><description><![CDATA[The NVidia drivers after 343.22 no longer support the NVidia Quadro FX 880M GPU
for the ThinkPad W510 so I had to switch to legacy drivers…]]></description><link>https://www.davidosomething.com/linux-lenovo-thinkpad-w510-part-3/</link><guid isPermaLink="false">https://www.davidosomething.com/linux-lenovo-thinkpad-w510-part-3/</guid><pubDate>Thu, 30 Oct 2014 21:45:11 GMT</pubDate><content:encoded>&lt;p&gt;The NVidia drivers after 343.22 no longer support the NVidia Quadro FX 880M GPU
for the ThinkPad W510 so I had to switch to legacy drivers (340-xx).&lt;/p&gt;
&lt;p&gt;To get everything working again, I make some changes to my kernel mode settings
and my xorg.conf. In &lt;var&gt;/boot/syslinux/syslinux.cfg&lt;/var&gt; and
&lt;var&gt;/etc/xorg.conf.d/20-nvidia.conf&lt;/var&gt; I am now using this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;20-nvidia.conf&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;conf&quot; data-index=&quot;0&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;Section &lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;quot;Monitor&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    Identifier     &lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;quot;Monitor0&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    VendorName     &lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;quot;Unknown&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    ModelName      &lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;quot;Unknown&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    HorizSync       28.0 - 33.0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    VertRefresh     43.0 - 72.0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    Option         &lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;quot;DPMS&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;EndSection&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;Section &lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;quot;Device&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  Identifier &lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;quot;Nvidia Card&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  Driver &lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;quot;nvidia&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  VendorName &lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;quot;NVIDIA Corporation&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  BoardName &lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;quot;Quadro FX 880M:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk8&quot;&gt;  #Option &amp;quot;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;NoLogo&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk8&quot;&gt;  Option &amp;quot;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;RegistryDwords&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span class=&quot;mtk4&quot;&gt;EnableBrightnessControl&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;=1&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk8&quot;&gt;EndSection&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk8&quot;&gt;Section &amp;quot;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;Screen&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk8&quot;&gt;    Identifier     &amp;quot;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;Screen0&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk8&quot;&gt;    Device         &amp;quot;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;Device0&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk8&quot;&gt;    Monitor        &amp;quot;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;Monitor0&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk8&quot;&gt;    DefaultDepth    24&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk8&quot;&gt;    SubSection     &amp;quot;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;Display&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk8&quot;&gt;        Depth       24&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk8&quot;&gt;    EndSubSection&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk8&quot;&gt;EndSection&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;syslinux.cfg&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;conf&quot; data-index=&quot;1&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;LABEL archnvidia&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    MENU LABEL Arch Linux (NVidia)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    LINUX ../vmlinuz-linux&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    APPEND &lt;/span&gt;&lt;span class=&quot;mtk4&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;=/dev/sda1 rw nomodeset &lt;/span&gt;&lt;span class=&quot;mtk4&quot;&gt;nouveau.modeset&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;=0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    INITRD ../initramfs-linux.img&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And in the &lt;var&gt;syslinux.cfg&lt;/var&gt; the line &lt;code&gt;DEFAULT arch&lt;/code&gt; is now
&lt;code&gt;DEFAULT archnvidia&lt;/code&gt; to default to the new kernel settings.&lt;/p&gt;
&lt;style class=&quot;grvsc-styles&quot;&gt;
  .grvsc-container {
    overflow: auto;
    position: relative;
    -webkit-overflow-scrolling: touch;
    padding-top: 1rem;
    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));
    padding-bottom: 1rem;
    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));
    border-radius: 8px;
    border-radius: var(--grvsc-border-radius, 8px);
    font-feature-settings: normal;
    line-height: 1.4;
  }
  
  .grvsc-code {
    display: table;
  }
  
  .grvsc-line {
    display: table-row;
    box-sizing: border-box;
    width: 100%;
    position: relative;
  }
  
  .grvsc-line &gt; * {
    position: relative;
  }
  
  .grvsc-gutter-pad {
    display: table-cell;
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  .grvsc-gutter {
    display: table-cell;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter::before {
    content: attr(data-content);
  }
  
  .grvsc-source {
    display: table-cell;
    padding-left: 1.5rem;
    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));
    padding-right: 1.5rem;
    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));
  }
  
  .grvsc-source:empty::after {
    content: &apos; &apos;;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter + .grvsc-source {
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  /* Line transformer styles */
  
  .grvsc-has-line-highlighting &gt; .grvsc-code &gt; .grvsc-line::before {
    content: &apos; &apos;;
    position: absolute;
    width: 100%;
  }
  
  .grvsc-line-diff-add::before {
    background-color: var(--grvsc-line-diff-add-background-color, rgba(0, 255, 60, 0.2));
  }
  
  .grvsc-line-diff-del::before {
    background-color: var(--grvsc-line-diff-del-background-color, rgba(255, 0, 20, 0.2));
  }
  
  .grvsc-line-number {
    padding: 0 2px;
    text-align: right;
    opacity: 0.7;
  }
  
  .default-dark {
    background-color: #1E1E1E;
    color: #D4D4D4;
  }
  .default-dark .mtk1 { color: #D4D4D4; }
  .default-dark .mtk8 { color: #CE9178; }
  .default-dark .mtk4 { color: #569CD6; }
  .default-dark .grvsc-line-highlighted::before {
    background-color: var(--grvsc-line-highlighted-background-color, rgba(255, 255, 255, 0.1));
    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, rgba(255, 255, 255, 0.5));
  }
&lt;/style&gt;</content:encoded></item><item><title><![CDATA[How I Work (2014)]]></title><description><![CDATA[Creating a website is just not as simple as it used to be. In order to do things
right, I need all kinds of tools: compilers, linters…]]></description><link>https://www.davidosomething.com/how-i-work/</link><guid isPermaLink="false">https://www.davidosomething.com/how-i-work/</guid><pubDate>Wed, 11 Jun 2014 21:35:24 GMT</pubDate><content:encoded>&lt;p&gt;Creating a website is just not as simple as it used to be. In order to do things
right, I need all kinds of tools: compilers, linters, package managers,
optimizers and minifiers, etc. Aside from that I need to consider things like
portability, organization, and maintainability.&lt;/p&gt;
&lt;p&gt;I just started a new job so I’ve had some time to think about the cleanest
way to get everything installed and organized. I follow some basic rules to keep
my environments clean. Here are the principles I follow and the reasoning behind
them:&lt;/p&gt;
&lt;h2 id=&quot;install-as-many-of-the-dependencies-as-possible-in-the-userspace&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#install-as-many-of-the-dependencies-as-possible-in-the-userspace&quot; aria-label=&quot;install as many of the dependencies as possible in the userspace permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Install as many of the dependencies as possible in the userspace.&lt;/h2&gt;
&lt;p&gt;That is, don’t run npm or bower or others as root / with sudo. This is
important because I might be deploying to a shared host or I might run into file
permissions problems if my files/binaries are owned or run as root.&lt;/p&gt;
&lt;p&gt;Furthermore, if something happens to an executable npm package — like
grunt gets hacked so that it deletes the filesystem — I don’t want
to run it as root.&lt;/p&gt;
&lt;p&gt;On OSX, homebrew is pretty much the only thing I need to install with sudo.&lt;/p&gt;
&lt;h2 id=&quot;dont-use-system-or-system-package-manager-binaries&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#dont-use-system-or-system-package-manager-binaries&quot; aria-label=&quot;dont use system or system package manager binaries permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Don’t use system or system package manager binaries.&lt;/h2&gt;
&lt;p&gt;The versions of Ruby and PHP that comes with OSX are outdated. The ones in the
apt sources or pacman may be outdated, but more than likely they don’t
match the ones on my server environment.&lt;/p&gt;
&lt;p&gt;To get around using the system/system packaged tools, use environment tools like
&lt;a href=&quot;https://github.com/creationix/nvm&quot;&gt;nvm&lt;/a&gt; for node (my
choice because it’s usually already on CentOS hosts),
&lt;a href=&quot;https://github.com/postmodern/chruby&quot;&gt;chruby&lt;/a&gt; for ruby,
&lt;a href=&quot;https://github.com/phpenv/phpenv&quot;&gt;phpenv&lt;/a&gt; for php, and
&lt;a href=&quot;http://virtualenv.readthedocs.org/en/latest/&quot;&gt;virtualenv&lt;/a&gt; for python.
You may need to install these with sudo so they’re available globally.&lt;/p&gt;
&lt;p&gt;There are alternatives for each besides the ones I listed, but the important
part is once they’re installed I can use them to install the version
I need. Also, they install their respective binaries in the userspace (so I can
use npm, gem, composer, and pip without sudo), which ties back into the previous
rule.&lt;/p&gt;
&lt;h2 id=&quot;everything-external-needs-to-be-easily-upgradable&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#everything-external-needs-to-be-easily-upgradable&quot; aria-label=&quot;everything external needs to be easily upgradable permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Everything external needs to be easily upgradable&lt;/h2&gt;
&lt;p&gt;For instance, it should be trivial to upgrade JavaScript and CSS frameworks.
That should be as simple as doing a &lt;code&gt;bower update&lt;/code&gt; or &lt;code&gt;composer update&lt;/code&gt;, or jam
or npm or bundle, whichever you’re dealing with. The hard part should be
fixing the things that break after the upgrade.&lt;/p&gt;
&lt;p&gt;Another big thing to know: you can specify almost ANYTHING (URLs to individual
files, git repositories) as a dependency in bower, bundler, composer, and npm.
If you didn’t write it, consider using a package manager to manage it.
Whether or not you keep it in version control, it makes it easier to find the
original copy.&lt;/p&gt;
&lt;h2 id=&quot;only-commit-clean-code&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#only-commit-clean-code&quot; aria-label=&quot;only commit clean code permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Only commit clean code&lt;/h2&gt;
&lt;p&gt;To ensure this, there are linters for every language. I don’t make a big
deal out of committing code that doesn’t do what it’s supposed to
(sometimes I commit code just to save it — I can squash the commit later
before issuing a pull request), but if the indentation is wrong it will be a lot
harder to fix.&lt;/p&gt;
&lt;p&gt;Adding a lint task to a pre-commit hook is a good idea. So is running the lint
tasks through some filewatcher like &lt;code&gt;grunt watch&lt;/code&gt;. Neither is mandatory if
you’re using an editor with built in linting (e.g. Vim with Syntastic or
Sublime/Atom/Brackets with the right plugins) and you’re good about
clearing the errors/warnings before you save and commit.&lt;/p&gt;
&lt;p&gt;I also run the linter during the build phase on deploy and fail builds on poor
code.&lt;/p&gt;
&lt;h2 id=&quot;dont-run-sites-off-your-system&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#dont-run-sites-off-your-system&quot; aria-label=&quot;dont run sites off your system permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Don’t run sites off your system&lt;/h2&gt;
&lt;p&gt;Welcome to the new world. I use vagrant for everything now, and that’s
considered old-school (because it’s slow and memory intensive). The new
school way is to run dev servers (even local ones) off of docker. Docker makes
creating new servers as cheap as making git branches. On my Linux box I actually
plan on running docker with &lt;a href=&quot;https://github.com/progrium/dokku&quot;&gt;dokku&lt;/a&gt; through
a VirtualBox anyway, just so I can limit memory and CPU usage more closely.&lt;/p&gt;
&lt;p&gt;Again, this is a way to ensure my dev environment mirrors the production server
as closely as possible. It also keeps my system lean — I can shut down the
VM when I’m not doing dev work and I’ll reclaim all the memory in
one command: &lt;code&gt;vagrant suspend&lt;/code&gt;. This beats having to stop the nginx, apache,
php-fpm, unicorn, etc. processes one-by-one (or writing a shell script to do
it). Finally, committing a Vagrantfile or dockerfile with my repo means any
other developer can get a working version of the project up and running easily.&lt;/p&gt;
&lt;h2 id=&quot;create-a-developer-bootstrap-script&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#create-a-developer-bootstrap-script&quot; aria-label=&quot;create a developer bootstrap script permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Create a developer bootstrap script&lt;/h2&gt;
&lt;p&gt;It’s simple, it should get a developer up-and-running. Here’s an
example:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;bash&quot; data-index=&quot;0&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;composer install  &lt;/span&gt;&lt;span class=&quot;mtk3&quot;&gt;# gets framework/plugins/etc.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;bundle install    &lt;/span&gt;&lt;span class=&quot;mtk3&quot;&gt;# gets sass/compass&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;npm install       &lt;/span&gt;&lt;span class=&quot;mtk3&quot;&gt;# gets grunt and plugins, jshint, etc.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;vagrant up&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;vagrant up&lt;/code&gt; command runs the provisioner (chef, puppet, or docker) and
triggers a build (run your grunt/gulp/npm/etc. tasks). There’s tools to
get a provisioner setup and repos examples on GitHub so you don’t really
have to learn those devops DSLs. I prefer Chef for its structure, though.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://puphpet.com/&quot;&gt;PuPHPet&lt;/a&gt; or &lt;a href=&quot;http://www.rove.io/&quot;&gt;rove.io&lt;/a&gt; for
custom setups, or search GitHub for stacks (even in ansible or salt if
that’s your thing).&lt;/p&gt;
&lt;h2 id=&quot;branch-and-test-the-branches&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#branch-and-test-the-branches&quot; aria-label=&quot;branch and test the branches permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Branch and test the branches&lt;/h2&gt;
&lt;p&gt;With my site running through a VM or docker I can easily stage branches locally.
A separate shallow git clone can be used if I wanted two instances running side
by side. I just change the VM’s port for the branch clone.&lt;/p&gt;
&lt;p&gt;I run a local DNS to map my local dev sites, so that’s one challenging
thing to manage. In order to remedy that I will eventually set up dokku or
a PaaS-like platform such as
&lt;a href=&quot;http://cosmos.layervault.com/divergence.html&quot;&gt;LayerVault’s Divergence&lt;/a&gt;.
These would allow me to reach my branches at dev subdomains like
&lt;code&gt;newfeature.mysite.dev&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;directory-structure&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#directory-structure&quot; aria-label=&quot;directory structure permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Directory structure&lt;/h2&gt;
&lt;p&gt;The directory structure I typically use now is something like the below for
a WordPress site. Note that &lt;strong&gt;anything that can be retrieved or generated is
typically not kept in version control&lt;/strong&gt; (e.g. sqldumps, bower components,
node_modules, compiled css, composer packages, etc.).&lt;/p&gt;
&lt;p&gt;This is not a rule — some servers don’t allow you to run binaries so
your options are either commit the dependencies or upload them from a separate
server as part of the deploy script. It’s sometimes advisable to do the
latter if you don’t want to be dependent on a dependency archive
(packagist/npm/rubygems might be down and you still need to be able to build
a mission critical app).&lt;/p&gt;
&lt;h3 id=&quot;example-for-a-wordpress-site&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#example-for-a-wordpress-site&quot; aria-label=&quot;example for a wordpress site permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Example for a WordPress site&lt;/h3&gt;
&lt;p&gt;This is what I use for single-server WordPress sites. For multi-server, or when
other kinds of scaling are involved, I’d break it up even more.&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;markdown&quot; data-index=&quot;1&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; .git/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; assets/  -- PSDs and stuff (versioned separately or symlinked to dropbox)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; sqldump/ -- backups (generated on deploy and kept in S3, glacier, dropbox,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;etc.)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; www/ -- work from here&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; config/ -- capistrano, chef cookbooks, etc.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; log/ -- I put all server logs (error.log, cachegrind, etc) here&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; migrations/ -- custom sql migrations if this were a custom app&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; node_modules/ -- if using any node modules not part of theme&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; public/ -- this is the webroot&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; config/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; content/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; themes/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; mytheme/ -- for redistributable themes, I sometimes keep these in&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;              a separate repository and use composer to pull it into&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;              a main project as a dependency, or as a git subtree&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; node_modules/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; build/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; components/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; fonts/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; img/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; js/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; sass/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;                    &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; common/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;                        &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; mixins, variables, extends, fonts, icons&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;                    &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; layouts/  -- grid, nav, things that modify sets of modules&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;                    &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; modules/  -- media unit, post unit, header, footer&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;                    &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; pages/    -- page specific&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;                    &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; vendor/   -- 3rd party grids, h5bp, copied css from components/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; lib/ -- server side&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; release/ -- compiled build ends up here&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;                    &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; css/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; tests/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; .agignore -- because I use the_silver_searcher&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; .bowerrc -- set build/components as the components dir&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; .gitignore&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; .jshintrc -- for portability, set here instead of in gruntfile&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; .sass-lint.yml -- ditto above&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; Gruntfile.js&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; bower.json&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; config.rb -- compass config&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; package.json&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;                &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; style.css&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; uploads/ -- usually a symlink to shared folder between releases&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; plugins/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; wp/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; Capfile -- I use capistrano and script the build there&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; Gemfile&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; Gemfile.lock -- sometimes in version control even though it is generated&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; Vagrantfile&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; composer.json&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; composer.lock -- sometimes versioned&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; package.json&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; wp-cli.yml&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; .gitignore&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; README.md&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk16&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; TODO.md&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;style class=&quot;grvsc-styles&quot;&gt;
  .grvsc-container {
    overflow: auto;
    position: relative;
    -webkit-overflow-scrolling: touch;
    padding-top: 1rem;
    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));
    padding-bottom: 1rem;
    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));
    border-radius: 8px;
    border-radius: var(--grvsc-border-radius, 8px);
    font-feature-settings: normal;
    line-height: 1.4;
  }
  
  .grvsc-code {
    display: table;
  }
  
  .grvsc-line {
    display: table-row;
    box-sizing: border-box;
    width: 100%;
    position: relative;
  }
  
  .grvsc-line &gt; * {
    position: relative;
  }
  
  .grvsc-gutter-pad {
    display: table-cell;
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  .grvsc-gutter {
    display: table-cell;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter::before {
    content: attr(data-content);
  }
  
  .grvsc-source {
    display: table-cell;
    padding-left: 1.5rem;
    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));
    padding-right: 1.5rem;
    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));
  }
  
  .grvsc-source:empty::after {
    content: &apos; &apos;;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter + .grvsc-source {
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  /* Line transformer styles */
  
  .grvsc-has-line-highlighting &gt; .grvsc-code &gt; .grvsc-line::before {
    content: &apos; &apos;;
    position: absolute;
    width: 100%;
  }
  
  .grvsc-line-diff-add::before {
    background-color: var(--grvsc-line-diff-add-background-color, rgba(0, 255, 60, 0.2));
  }
  
  .grvsc-line-diff-del::before {
    background-color: var(--grvsc-line-diff-del-background-color, rgba(255, 0, 20, 0.2));
  }
  
  .grvsc-line-number {
    padding: 0 2px;
    text-align: right;
    opacity: 0.7;
  }
  
  .default-dark {
    background-color: #1E1E1E;
    color: #D4D4D4;
  }
  .default-dark .mtk1 { color: #D4D4D4; }
  .default-dark .mtk3 { color: #6A9955; }
  .default-dark .mtk16 { color: #6796E6; }
  .default-dark .grvsc-line-highlighted::before {
    background-color: var(--grvsc-line-highlighted-background-color, rgba(255, 255, 255, 0.1));
    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, rgba(255, 255, 255, 0.5));
  }
&lt;/style&gt;</content:encoded></item><item><title><![CDATA[Linux on the Lenovo ThinkPad W510 – Part 2]]></title><description><![CDATA[I’m leaving Linux Mint 16 behind. The RC for Linux Mint 17 is out so maybe that
will fix some things, but the main problem I’ve had is with…]]></description><link>https://www.davidosomething.com/linux-lenovo-thinkpad-w510-part-2/</link><guid isPermaLink="false">https://www.davidosomething.com/linux-lenovo-thinkpad-w510-part-2/</guid><pubDate>Thu, 29 May 2014 18:25:31 GMT</pubDate><content:encoded>&lt;p&gt;I’m leaving Linux Mint 16 behind. The RC for Linux Mint 17 is out so maybe that
will fix some things, but the main problem I’ve had is with installing packages.
Apt just doesn’t cut it, especially when I think back to when I was using
ArchLinux. So I’m going back to Arch and the next post will be about that.&lt;/p&gt;
&lt;p&gt;Apt’s greatest downfall is that as you add PPAs and when you start needing
multiple architectures, the dependency chain breaks and is almost impossible to
fix.&lt;/p&gt;
&lt;h3 id=&quot;hardware-upgrades&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#hardware-upgrades&quot; aria-label=&quot;hardware upgrades permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Hardware Upgrades&lt;/h3&gt;
&lt;p&gt;Since I got the laptop, I’ve made some upgrades:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I’ve upgraded the RAM to 16GB.&lt;/li&gt;
&lt;li&gt;I’ve completely replaced the keyboard with a new one since I got a refurb. The
springy feeling is much better now.&lt;/li&gt;
&lt;li&gt;I took apart the casing and replaced the laptop display with a FHD one,
1920×1080. &lt;a href=&quot;http://www.ifixit.com/Guide/Upgrading+the+Lenovo+ThinkPad+T520+Display/9763&quot;&gt;This guide
helped.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;I replaced the optical drive with a HDD caddy from Lenovo and put a second
240GB SSD in there.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Who says a laptop isn’t upgradable? The screen in particular was super easy and
worthwhile.&lt;/p&gt;
&lt;h3 id=&quot;display-calibration&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#display-calibration&quot; aria-label=&quot;display calibration permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Display Calibration&lt;/h3&gt;
&lt;p&gt;One of the things I’ve yet to figure out is how to use the display calibrator.
The ThinkPad comes with a Huey Pro in the palm rest that is supposed to detect
the colors and calibrate the screen when the lid is closed. I’ve installed
&lt;a href=&quot;http://dispcalgui.hoech.net/&quot;&gt;DispCalGui&lt;/a&gt; but it goes straight to a gray screen
and I’m pretty sure the screen is turning off when I close the lid. The Huey Pro
is a detected device, though, so I’ll keep looking into it.&lt;/p&gt;
&lt;h3 id=&quot;software&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#software&quot; aria-label=&quot;software permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Software&lt;/h3&gt;
&lt;p&gt;The ThinkVantage button can be mapped using the program
&lt;a href=&quot;http://www.thinkwiki.org/wiki/Tpb&quot;&gt;tpb&lt;/a&gt;. I’m mapping it to open
a gnome-terminal. Can’t think of anything else I’d use it for.&lt;/p&gt;
&lt;style class=&quot;grvsc-styles&quot;&gt;
  .grvsc-container {
    overflow: auto;
    position: relative;
    -webkit-overflow-scrolling: touch;
    padding-top: 1rem;
    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));
    padding-bottom: 1rem;
    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));
    border-radius: 8px;
    border-radius: var(--grvsc-border-radius, 8px);
    font-feature-settings: normal;
    line-height: 1.4;
  }
  
  .grvsc-code {
    display: table;
  }
  
  .grvsc-line {
    display: table-row;
    box-sizing: border-box;
    width: 100%;
    position: relative;
  }
  
  .grvsc-line &gt; * {
    position: relative;
  }
  
  .grvsc-gutter-pad {
    display: table-cell;
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  .grvsc-gutter {
    display: table-cell;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter::before {
    content: attr(data-content);
  }
  
  .grvsc-source {
    display: table-cell;
    padding-left: 1.5rem;
    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));
    padding-right: 1.5rem;
    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));
  }
  
  .grvsc-source:empty::after {
    content: &apos; &apos;;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter + .grvsc-source {
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  /* Line transformer styles */
  
  .grvsc-has-line-highlighting &gt; .grvsc-code &gt; .grvsc-line::before {
    content: &apos; &apos;;
    position: absolute;
    width: 100%;
  }
  
  .grvsc-line-diff-add::before {
    background-color: var(--grvsc-line-diff-add-background-color, rgba(0, 255, 60, 0.2));
  }
  
  .grvsc-line-diff-del::before {
    background-color: var(--grvsc-line-diff-del-background-color, rgba(255, 0, 20, 0.2));
  }
  
  .grvsc-line-number {
    padding: 0 2px;
    text-align: right;
    opacity: 0.7;
  }
  
&lt;/style&gt;</content:encoded></item><item><title><![CDATA[Linux on the Lenovo ThinkPad W510]]></title><description><![CDATA[I bought a crappy PC laptop as a backup since my MacBook’s been failing. I’ve
gone full Linux on it since I spend most of the day in a…]]></description><link>https://www.davidosomething.com/linux-lenovo-thinkpad-w510/</link><guid isPermaLink="false">https://www.davidosomething.com/linux-lenovo-thinkpad-w510/</guid><pubDate>Thu, 01 May 2014 22:15:13 GMT</pubDate><content:encoded>&lt;p&gt;I bought a crappy PC laptop as a backup since my MacBook’s been failing. I’ve
gone full Linux on it since I spend most of the day in a terminal and browser,
so except for Photoshop I’m comfortable. I’ll probably buy a new MacBook when
they release 2014 Pro Retina ones. Until then, I’ll document my experience here.&lt;/p&gt;
&lt;p&gt;First off, I’m running &lt;a href=&quot;http://www.linuxmint.com/&quot;&gt;Linux Mint 16 Petra with the Cinnamon Desktop
Environment&lt;/a&gt;. I’ve got to say, it’s really pretty in
comparison to Windows 7 that the laptop came with and Windows 8.1 that my
Shuttle PC is now running.&lt;/p&gt;
&lt;h2 id=&quot;fixes-ive-had-to-make&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#fixes-ive-had-to-make&quot; aria-label=&quot;fixes ive had to make permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Fixes I’ve had to make&lt;/h2&gt;
&lt;h3 id=&quot;brightness-controls&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#brightness-controls&quot; aria-label=&quot;brightness controls permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Brightness Controls&lt;/h3&gt;
&lt;p&gt;The brightness keys cause Linux to crash. Also, software controls like panel
widgets don’t work. Despite &lt;a href=&quot;http://www.thinkwiki.org/wiki/Category:W510&quot;&gt;it saying not to on
thinkwiki.org&lt;/a&gt;, the
&lt;var&gt;EnableBrightnessControl&lt;/var&gt; registry flag was the right way to enable
brightness controls. Switching to a virtual console, changing the brightness,
and switching back worked… except that Cinnamon DE crashed upon returning to it.&lt;/p&gt;
&lt;p&gt;Here’s what your &lt;var&gt;/etc/X11/xorg.conf&lt;/var&gt; file should look like:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;coffee&quot; data-index=&quot;0&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk11&quot;&gt;Section&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;quot;Device&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;Identifier&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;quot;Device0&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;Driver&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;quot;nvidia&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;VendorName&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;quot;NVIDIA Corporation&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;BoardName&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;quot;Quadro FX 880M&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;Option&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;quot;RegistryDwords&amp;quot;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;quot;EnableBrightnessControl=1&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;EndSection&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;keyboard-mapping&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#keyboard-mapping&quot; aria-label=&quot;keyboard mapping permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Keyboard Mapping&lt;/h3&gt;
&lt;p&gt;I don’t use Caps Lock. I always remap it to Control. To do this in Linux Mint
16, you need to go to the Regional &amp;#x26; Language settings, Keyboard Layouts, and
Options in there. Don’t change “Caps Lock key behavior” — change “Ctrl key
position” and add “Caps Lock as Ctrl” there. This is so your Caps Lock key
doesn’t have two KeySyms associated with it (if you’re familiar with
&lt;var&gt;.XModmap&lt;/var&gt; settings). Additionally you can add pressing both Shift keys
at once to toggle Caps Lock in the “Miscellaneous compatibility options.”&lt;/p&gt;
&lt;p&gt;The mdm display manager doesn’t run &lt;var&gt;.XModmap&lt;/var&gt; and it’ll take a lot
more effort than it’s worth to modify the XClient/.Xsession setup that Mint
provides, so I went with the gui setting in this case.&lt;/p&gt;
&lt;h3 id=&quot;suspend-mode&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#suspend-mode&quot; aria-label=&quot;suspend mode permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Suspend Mode&lt;/h3&gt;
&lt;p&gt;I use the proprietary nVidia graphics driver for full 3d support. There system
freezes when resuming from suspend. To fix that, add this line to the file
&lt;var&gt;/etc/pm/config.d/unload_modules&lt;/var&gt; (you may have to create it):&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;bash&quot; data-index=&quot;1&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;SUSPEND_MODULES=&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;$SUSPEND_MODULES&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt; nvidia&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;style class=&quot;grvsc-styles&quot;&gt;
  .grvsc-container {
    overflow: auto;
    position: relative;
    -webkit-overflow-scrolling: touch;
    padding-top: 1rem;
    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));
    padding-bottom: 1rem;
    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));
    border-radius: 8px;
    border-radius: var(--grvsc-border-radius, 8px);
    font-feature-settings: normal;
    line-height: 1.4;
  }
  
  .grvsc-code {
    display: table;
  }
  
  .grvsc-line {
    display: table-row;
    box-sizing: border-box;
    width: 100%;
    position: relative;
  }
  
  .grvsc-line &gt; * {
    position: relative;
  }
  
  .grvsc-gutter-pad {
    display: table-cell;
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  .grvsc-gutter {
    display: table-cell;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter::before {
    content: attr(data-content);
  }
  
  .grvsc-source {
    display: table-cell;
    padding-left: 1.5rem;
    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));
    padding-right: 1.5rem;
    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));
  }
  
  .grvsc-source:empty::after {
    content: &apos; &apos;;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter + .grvsc-source {
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  /* Line transformer styles */
  
  .grvsc-has-line-highlighting &gt; .grvsc-code &gt; .grvsc-line::before {
    content: &apos; &apos;;
    position: absolute;
    width: 100%;
  }
  
  .grvsc-line-diff-add::before {
    background-color: var(--grvsc-line-diff-add-background-color, rgba(0, 255, 60, 0.2));
  }
  
  .grvsc-line-diff-del::before {
    background-color: var(--grvsc-line-diff-del-background-color, rgba(255, 0, 20, 0.2));
  }
  
  .grvsc-line-number {
    padding: 0 2px;
    text-align: right;
    opacity: 0.7;
  }
  
  .default-dark {
    background-color: #1E1E1E;
    color: #D4D4D4;
  }
  .default-dark .mtk11 { color: #DCDCAA; }
  .default-dark .mtk1 { color: #D4D4D4; }
  .default-dark .mtk8 { color: #CE9178; }
  .default-dark .mtk12 { color: #9CDCFE; }
  .default-dark .grvsc-line-highlighted::before {
    background-color: var(--grvsc-line-highlighted-background-color, rgba(255, 255, 255, 0.1));
    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, rgba(255, 255, 255, 0.5));
  }
&lt;/style&gt;</content:encoded></item><item><title><![CDATA[grunt-toggl]]></title><description><![CDATA[Start using grunt-toggl today! See the docs and contribute to grunt-toggl on the GitHub repository here:
https://github.com/davidosomething…]]></description><link>https://www.davidosomething.com/grunt-toggl/</link><guid isPermaLink="false">https://www.davidosomething.com/grunt-toggl/</guid><pubDate>Tue, 29 Apr 2014 22:30:24 GMT</pubDate><content:encoded>&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 100px; &quot;&gt;
      &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/0a3fb5c839e129ef572d1b8e2614e5a9/7e516/grunt-toggl-logo.png&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 134%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAbCAIAAADzvTiPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAF0klEQVQ4y02Ud1BUVxTGz3tvd+kwQc3EGRsaNQOCYI2jIM2IIqAoCi5Il2JBqhRZinTRCdKyFhCVZVnZVZauQcfRTIA4RLGiK2JssbBIEVh8753kQWJy5/vjzp37m3Pu+b65gBNrcHj048AIIrIsS9M0w9B9799+ePc686Dfqxc9iDiu0bAsi4gfB0cGh0YnKXj9sjdfFJoeZJETYpoR632/6zYidty8HBvsnHLA02YhJT97vDArGhG7Hz7IiPXOCTVND7LIF+1+/bIXrjbJPR3mRm+AE7tJ6T4IctDr6vwlJyFwyQywMTOwX2xsOgWKsmPv3+kIdNCX7AFxMBmzAbwc57Y21sBkM4cifMqEUBhgJA6BdUunCx1n7nbUPuiuF++uG+yoFbZ18foVM8UhUBRkdEoIift2Tj4QWJZhERPjIqr8oVCoK7TWlx3g9YpBcwFYBSeNDFRFUB3B81ytX+Kj2xgOh+L2shzMQI+qO3L7gkxP6pCHjusKgxIvAS0FVkmMyzh+rBpGpcDWE3gBZCF8x8WG9uaGkc68GM/5T7ofwNlTJ8uCAa9RjAI0VaTkgEDspzVcSYzK4JMUmIuASnhzmji8TXvZPEMva70rqTy8SlWEQsVJMaged0dv+bqvAvqrQJlKKZIER3fzb2ZS2AjMJVCVkAWB2j9YGtiYGRSHaKkrCWyE9+UQvWXak+5HwE1r747K/XDQ+aujc02kM+b9aDYnyV3v11wqc6f2WjPDRbMMo1x1esQkNkF/OTEqpW6kQnSIB+czIibtcXOzoK6Zmn9ycv2Ukjaw0k5m9t3qRQaWJkZbV+k3JPGxDvpPQr47uXONschD71YWxAa7cnBLbaX9Up148+lq63Vvc3LVJ06/O5TyYunKQMtpeQGC/nMEtsKbUgi20aqRnT+en5HoBmMSape1jlJ+HoLXz2iIgeyl37y1d/4zM/ull/eH3CNPrVYdtDEekgMtJ8rCtDdbESVFx96ph+N8rZ8VA9ZS99Jgl/10iBSuOSUEf5upHabmn3b4DIrSxlzcz5gsyPPXxlqga+D3Y1TEBp0ze2Yd8TT+LQ3wIqCUUoZA2PZV8OJ5z16f9Svng99y44qF8xpmLyj81iRyo8H7c8DKQVPNWXUnh1QXAFMFTA3x6giR7QIRvg69z1T/xFNRdWqfk0ASySsJ172UTA1VAzORrfELE5LB8HkYk8NIGaS6CMpOi3Ein8AwNMsyDGKi76r3+YANJNbBeM3/yAl9rgG6hnyaBdE7l9NcOBmGoTmrNGMjDIsJAWsfpsPnGnJIQnQXkYyc4zUyLt6PjlPDEoJVkKoMSPS3plkO4awa6O+LD3VVq9VJft8/yQCsJzpyeG05PKyFMRknVEJbDtWWRWEDocqEhF0r+vr740NdP6o/wI2faz1sZ+cfjhH5WAyIAevIol2CZ2Ku8oiUEyOH3hPcIdaRgydA5GOenxHrYTvr+mUFnBPnKSQ/FeYmuFlSzbFwOY4qChJgM7BKwDpO3KYZioO1WuKoljjYbEUWZMcqJOKzpZlwqUp8LCMKETvbr5cXZ21auyjOjadMEEgi+V+kTBDEb+Y5W5uWFWZ0tl9HxIKsmIuVpfD6RU/AluUdbTcQ8anqcbr31NZUsj6R35TMuyzi1JTMq0/kX00j07ynPH3yCBFvtd8MdF/28rmKm3ZrQ7Wvi2V5aWZCTMyZvVBxQMdpif4xfy1sBmyBgkAtpyX65RE6Z/dDfHRUhTjP19XqSl0lN+0Jj/GPnkc+G8z8bfl5fkbt2QLhar1WEW/yG7qWwhOu1mvP5h8NMAqw4/tsNHvew9VnGIarPD6uQcS7XbeTPaeE2YI0jEA5QSuIyXjQCgIVRHU4EW4Hoh3GXXc6vyAw+X0zNI2ID+7dTY8WbrefU7ANutOhv4BTdzoUbIPtdnPSIr0e3Ov6cvk/ePKImXjC0EBfWUlulJdV1CbjyE3GUZ6Wp4uzBz72TbZK/0v+Df8FURBjnWzOHM4AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source srcset=&quot;/static/0a3fb5c839e129ef572d1b8e2614e5a9/114f5/grunt-toggl-logo.webp 100w&quot; sizes=&quot;(max-width: 100px) 100vw, 100px&quot; type=&quot;image/webp&quot;&gt;
          &lt;source srcset=&quot;/static/0a3fb5c839e129ef572d1b8e2614e5a9/7e516/grunt-toggl-logo.png 100w&quot; sizes=&quot;(max-width: 100px) 100vw, 100px&quot; type=&quot;image/png&quot;&gt;
          &lt;img class=&quot;gatsby-resp-image-image&quot; src=&quot;/static/0a3fb5c839e129ef572d1b8e2614e5a9/7e516/grunt-toggl-logo.png&quot; alt=&quot;grunt-toggl logo&quot; title=&quot;grunt-toggl logo&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;
&lt;h2 id=&quot;start-using-grunt-toggl-today&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#start-using-grunt-toggl-today&quot; aria-label=&quot;start using grunt toggl today permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Start using grunt-toggl today!&lt;/h2&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;bash&quot; data-index=&quot;0&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;npm install --save-dev grunt-toggl&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;See the docs and contribute to grunt-toggl on the GitHub repository here:
&lt;a href=&quot;https://github.com/davidosomething/grunt-toggl&quot; title=&quot;grunt-toggl on GitHub&quot;&gt;https://github.com/davidosomething/grunt-toggl&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;some-background&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#some-background&quot; aria-label=&quot;some background permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Some background&lt;/h2&gt;
&lt;p&gt;I work for many clients and on multiple projects at a time, so it’s important to
keep track of my billable hours. My tool of choice for time tracking is
&lt;a href=&quot;https://www.toggl.com/&quot; title=&quot;Toggl&quot;&gt;Toggl&lt;/a&gt;. Check it out if you’re not already
a user — it’s got apps for every device and OS and a great reporting dashboard.&lt;/p&gt;
&lt;p&gt;Sometimes I forget to start a Toggl timer when I dive into the fun part of web
development. But one thing I pretty much always do at the start of a web project
is start &lt;a href=&quot;http://gruntjs.com/&quot; title=&quot;Grunt: The JavaScript Task Runner&quot;&gt;grunt&lt;/a&gt;. So it
makes sense to have something to tie the two together. For that reason, I’ve
created a Grunt plugin that automatically starts a Toggl timer. It’s available
now &lt;a href=&quot;https://www.npmjs.org/package/grunt-toggl&quot; title=&quot;grunt-toggl on NPM&quot;&gt;on npm&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Basically the plugin creates a new asynchronous Grunt task. The task uses the
&lt;a href=&quot;https://github.com/mikeal/request&quot;&gt;Request&lt;/a&gt; library to make an HTTP request to
the &lt;a href=&quot;https://github.com/toggl/toggl_api_docs&quot; title=&quot;Toggl API&quot;&gt;Toggl API&lt;/a&gt;. There are
helper arguments in the task that to find your Workspace and Project IDs, too.
Anyway, this is my second Grunt plugin and the first one to use &lt;a href=&quot;https://travis-ci.org/&quot; title=&quot;TravisCI&quot;&gt;Travis CI for
continuous integration&lt;/a&gt;. Let me know if you
use it!&lt;/p&gt;
&lt;style class=&quot;grvsc-styles&quot;&gt;
  .grvsc-container {
    overflow: auto;
    position: relative;
    -webkit-overflow-scrolling: touch;
    padding-top: 1rem;
    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));
    padding-bottom: 1rem;
    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));
    border-radius: 8px;
    border-radius: var(--grvsc-border-radius, 8px);
    font-feature-settings: normal;
    line-height: 1.4;
  }
  
  .grvsc-code {
    display: table;
  }
  
  .grvsc-line {
    display: table-row;
    box-sizing: border-box;
    width: 100%;
    position: relative;
  }
  
  .grvsc-line &gt; * {
    position: relative;
  }
  
  .grvsc-gutter-pad {
    display: table-cell;
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  .grvsc-gutter {
    display: table-cell;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter::before {
    content: attr(data-content);
  }
  
  .grvsc-source {
    display: table-cell;
    padding-left: 1.5rem;
    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));
    padding-right: 1.5rem;
    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));
  }
  
  .grvsc-source:empty::after {
    content: &apos; &apos;;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter + .grvsc-source {
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  /* Line transformer styles */
  
  .grvsc-has-line-highlighting &gt; .grvsc-code &gt; .grvsc-line::before {
    content: &apos; &apos;;
    position: absolute;
    width: 100%;
  }
  
  .grvsc-line-diff-add::before {
    background-color: var(--grvsc-line-diff-add-background-color, rgba(0, 255, 60, 0.2));
  }
  
  .grvsc-line-diff-del::before {
    background-color: var(--grvsc-line-diff-del-background-color, rgba(255, 0, 20, 0.2));
  }
  
  .grvsc-line-number {
    padding: 0 2px;
    text-align: right;
    opacity: 0.7;
  }
  
  .default-dark {
    background-color: #1E1E1E;
    color: #D4D4D4;
  }
  .default-dark .mtk1 { color: #D4D4D4; }
  .default-dark .grvsc-line-highlighted::before {
    background-color: var(--grvsc-line-highlighted-background-color, rgba(255, 255, 255, 0.1));
    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, rgba(255, 255, 255, 0.5));
  }
&lt;/style&gt;</content:encoded></item><item><title><![CDATA[First week developing on a Mac]]></title><description><![CDATA[The following is a whining session about developing on OSX. It’s not all bad. I had been using an old (2004) DELL machine at work with…]]></description><link>https://www.davidosomething.com/first-week-developing-on-a-mac/</link><guid isPermaLink="false">https://www.davidosomething.com/first-week-developing-on-a-mac/</guid><pubDate>Mon, 20 Jun 2011 19:59:45 GMT</pubDate><content:encoded>&lt;p&gt;The following is a whining session about developing on OSX. It’s not all bad.&lt;/p&gt;
&lt;p&gt;I had been using an old (2004) DELL machine at work with Windows XP. Needless to
say, the machine was pagefaulting and had a bunch of problems with its RAM. So
they finally got me a new computer to work on — a 24″ iMac with an i3 processor.
Not exactly a beast, but it’s a big upgrade.&lt;/p&gt;
&lt;p&gt;I was using Notepad++ on my PC and I am ridiculously fast on it. Maybe it’s
a sad thing, but I’ve never seen anyone move lines and refactor and reorganize
code at the speed I can on a PC. That speed, along with file management in
Explorer and on the commandline, were the two things I used to benchmark my
effectiveness on a PC.&lt;/p&gt;
&lt;h2 id=&quot;finder-sucks&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#finder-sucks&quot; aria-label=&quot;finder sucks permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Finder sucks.&lt;/h2&gt;
&lt;p&gt;Immediately, the crappiest part of OSX is the Finder. Granted, it’s pretty, but
you can’t do simple things like cut files for moving without some 3rd party
software or AppleScripting. At this point, I have most of the Finder keyboard
shortcuts down (window management, opening programs, creating folders) and can
do everything without a mouse.&lt;/p&gt;
&lt;h2 id=&quot;textmate-is-nice-but-macvim-is-free&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#textmate-is-nice-but-macvim-is-free&quot; aria-label=&quot;textmate is nice but macvim is free permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;TextMate is nice, but MacVim is free.&lt;/h2&gt;
&lt;p&gt;Next point — all the good software requires a license. I hear Mac developers all
love using TextMate or Coda. I used the trials for each of those up, and
TextMate is the winner in that category. Coda is like many programs in one, but
not robust enough in any single aspect that I would use it. SublimeEdit, which
I experimented on PC for a bit is similar to TextMate, but still requires too
much work to get it going. Smultron and TextWrangler are just okay but they lack
features like transposing lines of text and column editing. I decided to learn
VIM instead (abandoning my emacs roots since aquamacs was hideous) and I’ve
gotten pretty fast at it. IMO on a Mac — VIM is still the way to go in terms of
non-IDE editors. If I can get a TextMate license I might go that route, but it’s
a good idea to learn VIM too since I’m in terminals often and emacs isn’t on
every server. I’ll be looking forward to the development of Bespin and Kod for
the future.&lt;/p&gt;
&lt;h2 id=&quot;i-want-transmit&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#i-want-transmit&quot; aria-label=&quot;i want transmit permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;I want Transmit.&lt;/h2&gt;
&lt;p&gt;FTP on a mac is a nightmare. This is in part due to the Finder design. I had
been using FileZilla on Windows, and it is available on OSX as well, but there
are quirks here and there (like a missing bookmarks dropdown). Transmit was
lovely, especially the bookmarks screen. I would use that as well if I can
convince the company to get a license. I went through Interarchy, Cyberduck (so
slow), FileZilla OSX, Fetch, Forklift, and even Finder’s native FTP to decide on
Transmit. With the trial expired, I’ve effectively forsaken FTP clients and am
using ANT to do all my uploading (which won’t last long since it’s a waste of
time to write a build script to up/download some one-off projects). Cyberduck,
for its ability to name bookmarks (which Finder cannot) and property as a native
OSX app (which Filezilla is not), is my emergency client.&lt;/p&gt;
&lt;h2 id=&quot;made-for-ides&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#made-for-ides&quot; aria-label=&quot;made for ides permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Made for IDEs?&lt;/h2&gt;
&lt;p&gt;Perhaps I will try the all-IDE route for my next project — Eclipse, Dreamweaver,
Aptana, Coda seem to have a lot of features build in like SVN and FTP. I’ve used
them before, but that was in the 2GB of RAM/2Ghz CPU days, when it was a pain to
load or keep the RAM-hogging IDEs open.&lt;/p&gt;
&lt;h2 id=&quot;remote-computing-on-a-mac&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#remote-computing-on-a-mac&quot; aria-label=&quot;remote computing on a mac permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Remote computing on a Mac?&lt;/h2&gt;
&lt;p&gt;OSX VNC clients all suck (I’m using the built-in CMD-K one, ChickenoftheVNC is
outdated and slow, and Jollysfast doesn’t render everything correctly). Maybe
I can get an NX server going instead. The Remote Desktop client is alright.&lt;/p&gt;
&lt;h2 id=&quot;e-mail-is-nice&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#e-mail-is-nice&quot; aria-label=&quot;e mail is nice permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;E-mail is nice.&lt;/h2&gt;
&lt;p&gt;I’m using Entourage as an Outlook replacement. It lacks the ability to traverse
through Active Directory groups (displaying users and recursing). I’m sure
Outlook 2011 can do this, so this is only a budget limitation. Sparrow and
mail.app look nice, but I actually like the web client for gmail.&lt;/p&gt;
&lt;h2 id=&quot;interactive-version-control-is-pretty-but-not-functional&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#interactive-version-control-is-pretty-but-not-functional&quot; aria-label=&quot;interactive version control is pretty but not functional permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Interactive version control is pretty but not functional.&lt;/h2&gt;
&lt;p&gt;I miss the TortoiseGit shell extensions. I have a license for Versions
(Cornerstone is pretty much the same, after using the trial) and it’s just not
as easy as right clicking to commit. I think there’s a shell extension for SVN
out there but not for Hg and git. I guess it’s time I switched everything over
to git and commandline it anyway. I’m not even going to try Tower for git since
it’s probably like Versions. If it ain’t integrated with Finder, it ain’t worth
it.&lt;/p&gt;
&lt;h2 id=&quot;its-a-unix-system-i-know-this&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#its-a-unix-system-i-know-this&quot; aria-label=&quot;its a unix system i know this permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;It’s a UNIX system. I know this.&lt;/h2&gt;
&lt;p&gt;What I’ve actually liked so far is that OSX has its own terminal and is POSIX
compliant. Its UNIXness is great, and with DTerm and iTerm 2 (both free
programs) it’s easy to do commandline things (i.e., version control or “touch
file.txt” since there’s no context-menu to create a blank file). The AppStore is
cool, but I hear Win8 will get one, too. I’m a fan of MacPorts (haven’t tried
Homebrew because I already have things going in /usr/local/).&lt;/p&gt;
&lt;h2 id=&quot;beachball-of-doom-unhappy-mac-face-grey-screen-of-death-shit-happens&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#beachball-of-doom-unhappy-mac-face-grey-screen-of-death-shit-happens&quot; aria-label=&quot;beachball of doom unhappy mac face grey screen of death shit happens permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Beachball of doom, unhappy mac face, grey screen of death, shit happens!&lt;/h2&gt;
&lt;p&gt;Finally, programs still crash ALL THE TIME. I have to force quit things every
now and then, too. It’s the software’s fault, of course, but anyone who says
Macs don’t crash is probably just browsing the internet all day or crunching
numbers.&lt;/p&gt;
&lt;style class=&quot;grvsc-styles&quot;&gt;
  .grvsc-container {
    overflow: auto;
    position: relative;
    -webkit-overflow-scrolling: touch;
    padding-top: 1rem;
    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));
    padding-bottom: 1rem;
    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));
    border-radius: 8px;
    border-radius: var(--grvsc-border-radius, 8px);
    font-feature-settings: normal;
    line-height: 1.4;
  }
  
  .grvsc-code {
    display: table;
  }
  
  .grvsc-line {
    display: table-row;
    box-sizing: border-box;
    width: 100%;
    position: relative;
  }
  
  .grvsc-line &gt; * {
    position: relative;
  }
  
  .grvsc-gutter-pad {
    display: table-cell;
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  .grvsc-gutter {
    display: table-cell;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter::before {
    content: attr(data-content);
  }
  
  .grvsc-source {
    display: table-cell;
    padding-left: 1.5rem;
    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));
    padding-right: 1.5rem;
    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));
  }
  
  .grvsc-source:empty::after {
    content: &apos; &apos;;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter + .grvsc-source {
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  /* Line transformer styles */
  
  .grvsc-has-line-highlighting &gt; .grvsc-code &gt; .grvsc-line::before {
    content: &apos; &apos;;
    position: absolute;
    width: 100%;
  }
  
  .grvsc-line-diff-add::before {
    background-color: var(--grvsc-line-diff-add-background-color, rgba(0, 255, 60, 0.2));
  }
  
  .grvsc-line-diff-del::before {
    background-color: var(--grvsc-line-diff-del-background-color, rgba(255, 0, 20, 0.2));
  }
  
  .grvsc-line-number {
    padding: 0 2px;
    text-align: right;
    opacity: 0.7;
  }
  
&lt;/style&gt;</content:encoded></item><item><title><![CDATA[Shuttle PC - new harddrive, Clonezilla & Windows 7]]></title><description><![CDATA[I bought a new harddrive
on sale after Cyber Monday to replace the 250 GB harddrive in my Shuttle. It’s
a bare drive, which means it doesn’t…]]></description><link>https://www.davidosomething.com/shuttle-pc-new-harddrive-clonezilla-windows-7/</link><guid isPermaLink="false">https://www.davidosomething.com/shuttle-pc-new-harddrive-clonezilla-windows-7/</guid><pubDate>Fri, 03 Dec 2010 23:12:44 GMT</pubDate><content:encoded>&lt;p&gt;I bought a &lt;a href=&quot;http://www.newegg.com/Product/Product.aspx?Item=N82E16822145304&quot;&gt;new harddrive&lt;/a&gt;
on sale after Cyber Monday to replace the 250 GB harddrive in my Shuttle. It’s
a bare drive, which means it doesn’t come with a SATA cable or box. Now I’ve got
a total of 2 TB of storage with 1 TB already full.&lt;/p&gt;
&lt;p&gt;I used my super-difficult-to-open Lacie case (pried it open with scissors) to
house and connect the bare drive while I formatted it. This was a time when
I really wished I had an eSata dock or enclosure.&lt;/p&gt;
&lt;p&gt;I did a full format rather than quick; the difference is that a full format
attempts to write empty bytes to each sector and does a &lt;kbd&gt;chkdsk /r&lt;/kbd&gt; at
the same time to fix any bad sectors. Knowing that UPS didn’t damage my drive,
I felt safer using it as my new primary/boot drive. The full format took about
8 hours D:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://clonezilla.org/&quot;&gt;Clonezilla&lt;/a&gt; was used to image the old harddrive to the
new one. I did a device to device image of the entire disk (as opposed to
a single partition), which was faster but not necessarily safer than going from
the old disk to image, image to new disk. The master boot record and Windows
system partition were also preserved in this manner, so I didn’t need to boot
from a Windows install/repair CD. I swapped the drives, moving the 250 GB into
the Lacie case and the 1 TB into the Shuttle.&lt;/p&gt;
&lt;p&gt;The system started perfectly, although some new Hitachi driver had to be
installed upon booting. I extended the 250 GB partition to occupy the additional
space using the Windows Disk Management tool (right click on My Computer -&gt;
Manage). After a final reboot, I’ve got an additional 750 GB to play with.&lt;/p&gt;
&lt;style class=&quot;grvsc-styles&quot;&gt;
  .grvsc-container {
    overflow: auto;
    position: relative;
    -webkit-overflow-scrolling: touch;
    padding-top: 1rem;
    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));
    padding-bottom: 1rem;
    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));
    border-radius: 8px;
    border-radius: var(--grvsc-border-radius, 8px);
    font-feature-settings: normal;
    line-height: 1.4;
  }
  
  .grvsc-code {
    display: table;
  }
  
  .grvsc-line {
    display: table-row;
    box-sizing: border-box;
    width: 100%;
    position: relative;
  }
  
  .grvsc-line &gt; * {
    position: relative;
  }
  
  .grvsc-gutter-pad {
    display: table-cell;
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  .grvsc-gutter {
    display: table-cell;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter::before {
    content: attr(data-content);
  }
  
  .grvsc-source {
    display: table-cell;
    padding-left: 1.5rem;
    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));
    padding-right: 1.5rem;
    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));
  }
  
  .grvsc-source:empty::after {
    content: &apos; &apos;;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter + .grvsc-source {
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  /* Line transformer styles */
  
  .grvsc-has-line-highlighting &gt; .grvsc-code &gt; .grvsc-line::before {
    content: &apos; &apos;;
    position: absolute;
    width: 100%;
  }
  
  .grvsc-line-diff-add::before {
    background-color: var(--grvsc-line-diff-add-background-color, rgba(0, 255, 60, 0.2));
  }
  
  .grvsc-line-diff-del::before {
    background-color: var(--grvsc-line-diff-del-background-color, rgba(255, 0, 20, 0.2));
  }
  
  .grvsc-line-number {
    padding: 0 2px;
    text-align: right;
    opacity: 0.7;
  }
  
&lt;/style&gt;</content:encoded></item><item><title><![CDATA[My Development Setup]]></title><description><![CDATA[Although I primarily develop on a Windows PC, I still consider Linux (also Unix
and OSX) the most powerful and practical environment for…]]></description><link>https://www.davidosomething.com/my-development-setup/</link><guid isPermaLink="false">https://www.davidosomething.com/my-development-setup/</guid><pubDate>Mon, 29 Nov 2010 20:35:48 GMT</pubDate><content:encoded>&lt;p&gt;Although I primarily develop on a Windows PC, I still consider Linux (also Unix
and OSX) the most powerful and practical environment for setting up web and
database servers, DNS, and version control repositories (as a master on DVCS).
A few of the benefits include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Using SSH to connect to a Linux commandline is faster compared to RDP’ing or
VNC’ing into a Windows machine (also saves battery life on smartphones).
Cygwin is a slow alternative.&lt;/li&gt;
&lt;li&gt;Package management for easy (and frequent) upgrades.&lt;/li&gt;
&lt;li&gt;More robustly integrated file permissions between the file system and web
server (that is, IIS doesn’t use NTFS file permissions, but instead Windows
account permissions).&lt;/li&gt;
&lt;li&gt;File paths and naming make more sense on *nix than Windows. For instance,
&lt;samp&gt;.htaccess&lt;/samp&gt; is a system file, not an unnamed file with the
htaccess extension.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-setup&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-setup&quot; aria-label=&quot;the setup permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The setup&lt;/h2&gt;
&lt;p&gt;For my personal set up, I’ve currently got a VM running on my media center PC
with the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OpenSSH on port 22&lt;/li&gt;
&lt;li&gt;Apache Server 2.2, listening on port 80 for incoming web traffic&lt;/li&gt;
&lt;li&gt;Apache Tomcat, listening on port 8080 for incoming web traffic&lt;/li&gt;
&lt;li&gt;vsFTPd on port 21&lt;/li&gt;
&lt;li&gt;awstats for Apache log file analysis&lt;/li&gt;
&lt;li&gt;PHP 5&lt;/li&gt;
&lt;li&gt;Railo for Adobe Coldfusion&lt;/li&gt;
&lt;li&gt;MySQL&lt;/li&gt;
&lt;li&gt;Git – to get node.js and other source&lt;/li&gt;
&lt;li&gt;Mercurial – for my own version control&lt;/li&gt;
&lt;li&gt;node.js as a daemon&lt;/li&gt;
&lt;li&gt;MongoDB (for Hummingbird and anything else)&lt;/li&gt;
&lt;li&gt;Hummingbird through node.js server, listening on port 8000 for &lt;strong&gt;live&lt;/strong&gt;
analytics… just to play with&lt;/li&gt;
&lt;li&gt;Icinga (Nagios fork) for service monitoring&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It’s accessible via RDP using VirtualBox’s VRDP on port 4000. That means I can
access it using a Remote Desktop client like the one that comes with Windows.
With that I can access an X-Windows environment (xinit, or desktops like Gnome,
KDE, XFCE) without having to do X11 forwarding to the local computer (such as
through XMing or Cygwin/X). For the record, RDP is faster than X11 forwarding
but doesn’t allow for seamless integration.&lt;/p&gt;
&lt;h2 id=&quot;here-are-the-steps-i-took-to-set-up-my-vm&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#here-are-the-steps-i-took-to-set-up-my-vm&quot; aria-label=&quot;here are the steps i took to set up my vm permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Here are the steps I took to set up my VM&lt;/h2&gt;
&lt;h3 id=&quot;setting-up-the-host-computer&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#setting-up-the-host-computer&quot; aria-label=&quot;setting up the host computer permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Setting up the host computer&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Allow Wake-on-LAN
&lt;ol&gt;
&lt;li&gt;Enable BIOS setting&lt;/li&gt;
&lt;li&gt;Enable NIC card setting in Windows Device Manager&lt;/li&gt;
&lt;li&gt;Set up router port forwarding&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Install TightVNC Server
&lt;ol&gt;
&lt;li&gt;Run as service&lt;/li&gt;
&lt;li&gt;Forward ports on router: 5800 for java client, 5900 for vnc clients&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;setting-up-the-virtual-machine&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#setting-up-the-virtual-machine&quot; aria-label=&quot;setting up the virtual machine permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Setting up the Virtual Machine&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Install Ubuntu Server Edition into new VirtualBox virtual machine
&lt;ol&gt;
&lt;li&gt;Use default LAMP settings&lt;/li&gt;
&lt;li&gt;Install OpenSSH&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Configure VRDP on Port 4000 instead of port 3389. This way, RDPing into
3389 allows you to access the host, 4000 the VM. Forward the ports to the
computer with the router.&lt;/li&gt;
&lt;li&gt;Create a shared drive to interact with the host computer, follow this:
&lt;a href=&quot;http://ipggi.wordpress.com/2010/03/11/virtualbox-shared-folders-with-ubuntu-server-guest/&quot;&gt;http://ipggi.wordpress.com/2010/03/11/virtualbox-shared-folders-with-ubuntu-server-guest/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Since the machine runs headless most of the time, the VM is opened using
VBoxHeadlessTray: &lt;a href=&quot;http://www.toptensoftware.com/VBoxHeadlessTray/&quot;&gt;http://www.toptensoftware.com/VBoxHeadlessTray/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Install the following tools:
&lt;ul&gt;
&lt;li&gt;emacs (or whatever you want for text editing)&lt;/li&gt;
&lt;li&gt;curl&lt;/li&gt;
&lt;li&gt;wget&lt;/li&gt;
&lt;li&gt;unzip&lt;/li&gt;
&lt;li&gt;elinks (or whatever you want)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;setting-up-lamp&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#setting-up-lamp&quot; aria-label=&quot;setting up lamp permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Setting up LAMP&lt;/h3&gt;
&lt;p&gt;There’s so many tutorials on this, it’s ridiculously easy. Also, the default
config is not bad for development purposes.&lt;/p&gt;
&lt;h3 id=&quot;setting-up-phpmyadmin&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#setting-up-phpmyadmin&quot; aria-label=&quot;setting up phpmyadmin permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Setting up phpMyAdmin&lt;/h3&gt;
&lt;p&gt;You can basically just let the aptitude installer do everything. The instance
will be accessible at &lt;code&gt;http://localhost/phpmyadmin&lt;/code&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;kbd&gt;sudo apt-get install phpmyadmin&lt;/kbd&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;setting-up-awstats&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#setting-up-awstats&quot; aria-label=&quot;setting up awstats permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Setting up awstats&lt;/h3&gt;
&lt;p&gt;Follow &lt;a href=&quot;http://maestric.com/doc/ubuntu/awstats&quot;&gt;http://maestric.com/doc/ubuntu/awstats&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;setting-up-the-file-system-and-vsftpd&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#setting-up-the-file-system-and-vsftpd&quot; aria-label=&quot;setting up the file system and vsftpd permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Setting up the file system and vsftpd&lt;/h3&gt;
&lt;p&gt;Regular install, then edit the config file in /etc/ and change some permissions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Add default user to group www-data (apache default group): &lt;kbd&gt;sudo usermod
-a -G www-data username&lt;/kbd&gt;&lt;/li&gt;
&lt;li&gt;chmod /var/www, allowing group read and write&lt;/li&gt;
&lt;li&gt;Allow owner and group and write using local_umask = 002&lt;/li&gt;
&lt;li&gt;Set the default FTP path to /var/www&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;setting-up-mercurial&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#setting-up-mercurial&quot; aria-label=&quot;setting up mercurial permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Setting up Mercurial&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Follow this to get apt-add-repository &lt;a href=&quot;https://help.ubuntu.com/community/Repositories/CommandLine#Adding%20Launchpad%20PPA%20Repositories&quot;&gt;https://help.ubuntu.com/community/Repositories/CommandLine#Adding%20Launchpad%20PPA%20Repositories&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Then, follow this to add the mercurial repository and install it
&lt;a href=&quot;http://icephoenix.us/linuxunix/installing-mercurial-1-5-or-1-6-on-ubuntu-lucid-lynx-10-04/&quot;&gt;http://icephoenix.us/linuxunix/installing-mercurial-1-5-or-1-6-on-ubuntu-lucid-lynx-10-04/&lt;/a&gt;.
TortoiseHg is not needed since we’re doing everything from the commandline.&lt;/li&gt;
&lt;li&gt;I didn’t want to use bitbucket, so I installed hg cgi server (hg serve only
allows one unsecured connection at a time) to create my own web based
repository:
&lt;ol&gt;
&lt;li&gt;Get the mercurial source tar.gz using wget or elinks&lt;/li&gt;
&lt;li&gt;Copy hgweb.cgi and all the folders from /templates/ to
/var/hg (chmod -R g+w www-data:www-data)&lt;/li&gt;
&lt;li&gt;Edit hgweb.cgi, set:
&lt;code&gt;config = &quot;/var/hg/hgweb.config&quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Put the repo paths/collections on the drive that is shared with the host
(this way the files aren’t stored in the virtual hard disk–you can back
them up easily). I mounted my share drive at &lt;samp&gt;/mnt/share&lt;/samp&gt; and
created the &lt;var&gt;repos&lt;/var&gt; folder in there. Because the share is on
a windows host, the permissions are always 777 chowned to root:root&lt;/li&gt;
&lt;li&gt;More help here:
&lt;a href=&quot;http://mercurial.selenic.com/wiki/HgWebDirStepByStep#Directory_Structure&quot;&gt;http://mercurial.selenic.com/wiki/HgWebDirStepByStep#Directory_Structure&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;I had some existing local repositories on my Windows development PC that
I wanted centralized onto this computer so I cloned them:
&lt;ol&gt;
&lt;li&gt;Use hg serve on the development PC (can be done through TortoiseHg!)&lt;/li&gt;
&lt;li&gt;From the VM, hg clone the existing repos (use the development PC’s IP as
the source URL)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Currently the repositories are all unsecured, so to secure them:
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Use apache to password protect repository (no native security in hg, use basic or digest auth. SSH can be used, too, but then why bother with hgweb?)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Under directory directive of main.conf in /etc/apache/hg/&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;apache&quot; data-index=&quot;0&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk17&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;mtk4&quot;&gt;Location&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; /hg&lt;/span&gt;&lt;span class=&quot;mtk17&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  AuthType Basic&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  AuthName &amp;quot;Mercurial repositories&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  AuthUserFile /var/htpasswd/hg&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  Require valid-user&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk17&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;mtk4&quot;&gt;Location&lt;/span&gt;&lt;span class=&quot;mtk17&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;See more on Apache security here:
&lt;a href=&quot;http://httpd.apache.org/docs/2.0/howto/auth.html&quot;&gt;http://httpd.apache.org/docs/2.0/howto/auth.html&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Allow push using http by following the troubleshooting instructions here:
&lt;a href=&quot;http://mercurial.selenic.com/wiki/PublishingRepositories#Troubleshooting&quot;&gt;http://mercurial.selenic.com/wiki/PublishingRepositories#Troubleshooting&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;setting-up-railo-for-coldfusion&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#setting-up-railo-for-coldfusion&quot; aria-label=&quot;setting up railo for coldfusion permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Setting up Railo for ColdFusion&lt;/h3&gt;
&lt;p&gt;The only thing to note here is that Ubuntu no longer uses
&lt;var&gt;sun-java6-jdk&lt;/var&gt;. Instead use &lt;var&gt;openjdk-6-jdk&lt;/var&gt; or
&lt;var&gt;default-jdk&lt;/var&gt; (same thing).&lt;/p&gt;
&lt;h3 id=&quot;notes-on-setting-up-mongodb&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#notes-on-setting-up-mongodb&quot; aria-label=&quot;notes on setting up mongodb permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Notes on setting up MongoDB&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;kbd&gt;sudo apt-get install mongodb-stable&lt;/kbd&gt; (not mongodb, they’re
different).&lt;/li&gt;
&lt;li&gt;Set up for PHP/Apache using php’s PECL (need php-dev for phpize and php-pear
for pecl)&lt;/li&gt;
&lt;li&gt;If mongod won’t start, make sure the default dbpath isn’t locked.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;setting-up-nodejs&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#setting-up-nodejs&quot; aria-label=&quot;setting up nodejs permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Setting up node.js&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Set up a la &lt;a href=&quot;http://www.codediesel.com/linux/installing-node-js-on-ubuntu-10-04/&quot;&gt;http://www.codediesel.com/linux/installing-node-js-on-ubuntu-10-04/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;After cloning the git repo, check out a stable tag:
&lt;ul&gt;
&lt;li&gt;To list tags: &lt;kbd&gt;git tag -l&lt;/kbd&gt;&lt;/li&gt;
&lt;li&gt;To checkout a tag: &lt;kbd&gt;git checkout v0.2.4&lt;/kbd&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Node.js can be set up to run as a daemon following this: &lt;a href=&quot;http://howtonode.org/deploying-node-upstart-monit&quot;&gt;http://howtonode.org/deploying-node-upstart-monit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;See the related post on how to install npm safely (link at bottom).&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;hummingbird&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#hummingbird&quot; aria-label=&quot;hummingbird permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Hummingbird&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Requires STABLE version of node.js&lt;/li&gt;
&lt;li&gt;Install via
&lt;a href=&quot;https://github.com/mnutt/hummingbird/blob/master/README.md&quot;&gt;https://github.com/mnutt/hummingbird/blob/master/README.md&lt;/a&gt;
– the instructions on the Hummingbird site website are outdated.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;icinga&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#icinga&quot; aria-label=&quot;icinga permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Icinga&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;kbd&gt;sudo apt-get install icinga&lt;/kbd&gt;&lt;/li&gt;
&lt;li&gt;Use NO CONFIG for postfix when it comes to it. You’ll have to set this up
later if you want e-mail notifications.&lt;/li&gt;
&lt;li&gt;The instance will be available at &lt;code&gt;http://localhost/icinga&lt;/code&gt; – username is
icingaadmin&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;final-router-configuration&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#final-router-configuration&quot; aria-label=&quot;final router configuration permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Final router configuration&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Bridging network connections gives the VM its own network IP. This changes
the host’s network IP to a new IP so any previous port forwarding or virtual
servers will have to point to the new IP.
&lt;ol&gt;
&lt;li&gt;Select host and VirtualBox connection&lt;/li&gt;
&lt;li&gt;Bridge connections&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Router: Port forwarding
&lt;ol&gt;
&lt;li&gt;Finding your IP addresses:
&lt;ol&gt;
&lt;li&gt;From the host machine, go to whatismyip.com for the router / external IP.&lt;/li&gt;
&lt;li&gt;From the host machine, run cmd &gt; ipconfig for the bridged network IP.&lt;/li&gt;
&lt;li&gt;From the VM, type ifconfig for the VM’s network IP.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Final port forwarding configuration:
&lt;ul&gt;
&lt;li&gt;21 to VM for FTP&lt;/li&gt;
&lt;li&gt;22 to VM for SSH&lt;/li&gt;
&lt;li&gt;80 to VM for HTTP&lt;/li&gt;
&lt;li&gt;443 to VM for HTTPS&lt;/li&gt;
&lt;li&gt;3389 to Host PC for RDP&lt;/li&gt;
&lt;li&gt;4000 to VM for RDP&lt;/li&gt;
&lt;li&gt;5800 to Host PC for VNC&lt;/li&gt;
&lt;li&gt;5900 to Host PC for VNC&lt;/li&gt;
&lt;li&gt;8000-8888 to VM for node.js, Hummingbird, Tomcat and Railo&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;DynDNS setup should be done via router, otherwise forward all to Host
machine and use DynDNS updater software on host machine, have host
machine forward to VM.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;From this point on I was able to access my VM and all of the forwarded ports
using the DynDNS address. It’s really convenient to be able to VNC onto the host
machine if something needs changing, SSH into the VM to do updates or set up
virtual hosts, and do an Hg push to this address as a master repository. Getting
all the puzzle pieces working together and having a good setup has really
improved my workflow.&lt;/p&gt;
&lt;style class=&quot;grvsc-styles&quot;&gt;
  .grvsc-container {
    overflow: auto;
    position: relative;
    -webkit-overflow-scrolling: touch;
    padding-top: 1rem;
    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));
    padding-bottom: 1rem;
    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));
    border-radius: 8px;
    border-radius: var(--grvsc-border-radius, 8px);
    font-feature-settings: normal;
    line-height: 1.4;
  }
  
  .grvsc-code {
    display: table;
  }
  
  .grvsc-line {
    display: table-row;
    box-sizing: border-box;
    width: 100%;
    position: relative;
  }
  
  .grvsc-line &gt; * {
    position: relative;
  }
  
  .grvsc-gutter-pad {
    display: table-cell;
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  .grvsc-gutter {
    display: table-cell;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter::before {
    content: attr(data-content);
  }
  
  .grvsc-source {
    display: table-cell;
    padding-left: 1.5rem;
    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));
    padding-right: 1.5rem;
    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));
  }
  
  .grvsc-source:empty::after {
    content: &apos; &apos;;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter + .grvsc-source {
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  /* Line transformer styles */
  
  .grvsc-has-line-highlighting &gt; .grvsc-code &gt; .grvsc-line::before {
    content: &apos; &apos;;
    position: absolute;
    width: 100%;
  }
  
  .grvsc-line-diff-add::before {
    background-color: var(--grvsc-line-diff-add-background-color, rgba(0, 255, 60, 0.2));
  }
  
  .grvsc-line-diff-del::before {
    background-color: var(--grvsc-line-diff-del-background-color, rgba(255, 0, 20, 0.2));
  }
  
  .grvsc-line-number {
    padding: 0 2px;
    text-align: right;
    opacity: 0.7;
  }
  
  .default-dark {
    background-color: #1E1E1E;
    color: #D4D4D4;
  }
  .default-dark .mtk17 { color: #808080; }
  .default-dark .mtk4 { color: #569CD6; }
  .default-dark .mtk1 { color: #D4D4D4; }
  .default-dark .grvsc-line-highlighted::before {
    background-color: var(--grvsc-line-highlighted-background-color, rgba(255, 255, 255, 0.1));
    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, rgba(255, 255, 255, 0.5));
  }
&lt;/style&gt;</content:encoded></item><item><title><![CDATA[Shuttle PC - Part 2]]></title><description><![CDATA[I didn’t read the parts compatibility guide online before buying the RAM and
graphics cards so the Shuttle wasn’t working up until last week…]]></description><link>https://www.davidosomething.com/shuttle-pc-part-2/</link><guid isPermaLink="false">https://www.davidosomething.com/shuttle-pc-part-2/</guid><pubDate>Thu, 28 Oct 2010 15:08:45 GMT</pubDate><content:encoded>&lt;p&gt;I didn’t read the parts compatibility guide online before buying the RAM and
graphics cards so the Shuttle wasn’t working up until last week. Since
I couldn’t see anything for lack of graphics and I don’t have another DDR3
compatible machine lying around, I couldn’t test the parts. Shuttle PCs don’t
beep on POST so I couldn’t even tell if the motherboard and CPU worked (power
and fans worked though). The only way to proceed would be to buy a new
compatible graphics card and RAM.&lt;/p&gt;
&lt;p&gt;It turns out the GT 240 wasn’t compatible. I bought a (much faster) Radeon 5770,
which is running perfectly fine on the 300W power supply. I’ve got a 500W power
supply coming in, too, since I’ve put so much stuff into this little box
already, might as well make sure none of it gets fried or dies from insufficient
power. I also got two 2GB sticks of Transcend DDR3, which I don’t need but might
was well keep. The G.Skill Ripjaws sticks work fine, so now I’ve got a whopping
total of 12GB in the Shuttle.&lt;/p&gt;
&lt;p&gt;Finally, I needed more space so I took apart my Lacie external HDD and plugged
it in the Shuttle. Getting that Neil Poulton screwless case apart was a pain in
the ass and I almost broke it! There’s now 300 GB out of 1.25 TB available.
Definitely going to have to get a bigger HDD, then I’ll put the 250GB HDD into
the Lacie case. It took some fiddling to figure out which SATA plugs to use…
apparently you can’t boot from all of the SATA connections (only the first two).
I’m using 3 out of 4 SATA connections now, and I don’t see where there’s room to
use the last one (eSATA via PCI card?).&lt;/p&gt;
&lt;style class=&quot;grvsc-styles&quot;&gt;
  .grvsc-container {
    overflow: auto;
    position: relative;
    -webkit-overflow-scrolling: touch;
    padding-top: 1rem;
    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));
    padding-bottom: 1rem;
    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));
    border-radius: 8px;
    border-radius: var(--grvsc-border-radius, 8px);
    font-feature-settings: normal;
    line-height: 1.4;
  }
  
  .grvsc-code {
    display: table;
  }
  
  .grvsc-line {
    display: table-row;
    box-sizing: border-box;
    width: 100%;
    position: relative;
  }
  
  .grvsc-line &gt; * {
    position: relative;
  }
  
  .grvsc-gutter-pad {
    display: table-cell;
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  .grvsc-gutter {
    display: table-cell;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter::before {
    content: attr(data-content);
  }
  
  .grvsc-source {
    display: table-cell;
    padding-left: 1.5rem;
    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));
    padding-right: 1.5rem;
    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));
  }
  
  .grvsc-source:empty::after {
    content: &apos; &apos;;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter + .grvsc-source {
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  /* Line transformer styles */
  
  .grvsc-has-line-highlighting &gt; .grvsc-code &gt; .grvsc-line::before {
    content: &apos; &apos;;
    position: absolute;
    width: 100%;
  }
  
  .grvsc-line-diff-add::before {
    background-color: var(--grvsc-line-diff-add-background-color, rgba(0, 255, 60, 0.2));
  }
  
  .grvsc-line-diff-del::before {
    background-color: var(--grvsc-line-diff-del-background-color, rgba(255, 0, 20, 0.2));
  }
  
  .grvsc-line-number {
    padding: 0 2px;
    text-align: right;
    opacity: 0.7;
  }
  
&lt;/style&gt;</content:encoded></item><item><title><![CDATA[Putting together my new Shuttle PC]]></title><description><![CDATA[Feeling a bit prodigious, I bought a Shuttle PC the other day (SH55). It totally
looks like a toaster, but it’s cool. It’s going to be an…]]></description><link>https://www.davidosomething.com/putting-together-my-new-shuttle-pc/</link><guid isPermaLink="false">https://www.davidosomething.com/putting-together-my-new-shuttle-pc/</guid><pubDate>Wed, 20 Oct 2010 12:12:16 GMT</pubDate><content:encoded>&lt;p&gt;Feeling a bit prodigious, I bought a Shuttle PC the other day (SH55). It totally
looks like a toaster, but it’s cool. It’s going to be an always-on HTPC for the
living room.&lt;/p&gt;
&lt;p&gt;I am completely out of the consumer PC hardware loop and ended up getting the
i7-860 (1156) instead of an i5. The major, major difference for these two would
be the availability of integrated graphics on the i5, vs two extra cores on the
i7. Wish I had gotten the i5, since then I would be able to play with the PC
immediately using the integrated graphics.&lt;/p&gt;
&lt;p&gt;As it is now, I’m waiting for an EVGA GeForce GT 240 video card. The DirectX 11
compatible cards are too expensive for now. Also, it’s a single slot card that
is suitable for the Shuttle stock 300W power supply, so it should be quiet and
cool compared to some of the monstrosities out there. This card is just enough
since the PC is going to be using the TV as its monitor, with a native 1920
x 1200 resolution.&lt;/p&gt;
&lt;p&gt;I got two sticks of 4GB G.Skill Ripjaws DDR3 1333, total of 8GB. Combined with
the graphics card, this machine should be able to run Photoshop CS5 swimmingly
as well. In the end its way better than any machine I have now. I’m using the
HDD and optical drive from my old PC. The harddrive uses SATA revision 1, so it
will probably be the biggest bottleneck for the system.&lt;/p&gt;
&lt;p&gt;There’s a lot of room for upgrade in the system: new GFX card (maybe a full size
one if I change the power supply), two more DIMM slots, and another 3.5 inch HDD
(hello SSD!), so this machine should be good for many years.&lt;/p&gt;
&lt;style class=&quot;grvsc-styles&quot;&gt;
  .grvsc-container {
    overflow: auto;
    position: relative;
    -webkit-overflow-scrolling: touch;
    padding-top: 1rem;
    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));
    padding-bottom: 1rem;
    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));
    border-radius: 8px;
    border-radius: var(--grvsc-border-radius, 8px);
    font-feature-settings: normal;
    line-height: 1.4;
  }
  
  .grvsc-code {
    display: table;
  }
  
  .grvsc-line {
    display: table-row;
    box-sizing: border-box;
    width: 100%;
    position: relative;
  }
  
  .grvsc-line &gt; * {
    position: relative;
  }
  
  .grvsc-gutter-pad {
    display: table-cell;
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  .grvsc-gutter {
    display: table-cell;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter::before {
    content: attr(data-content);
  }
  
  .grvsc-source {
    display: table-cell;
    padding-left: 1.5rem;
    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));
    padding-right: 1.5rem;
    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));
  }
  
  .grvsc-source:empty::after {
    content: &apos; &apos;;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter + .grvsc-source {
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  /* Line transformer styles */
  
  .grvsc-has-line-highlighting &gt; .grvsc-code &gt; .grvsc-line::before {
    content: &apos; &apos;;
    position: absolute;
    width: 100%;
  }
  
  .grvsc-line-diff-add::before {
    background-color: var(--grvsc-line-diff-add-background-color, rgba(0, 255, 60, 0.2));
  }
  
  .grvsc-line-diff-del::before {
    background-color: var(--grvsc-line-diff-del-background-color, rgba(255, 0, 20, 0.2));
  }
  
  .grvsc-line-number {
    padding: 0 2px;
    text-align: right;
    opacity: 0.7;
  }
  
&lt;/style&gt;</content:encoded></item><item><title><![CDATA[An Event Apart DC 2010]]></title><description><![CDATA[So I just got back from the Washington, DC iteration of An Event Apart. I feel
that if you follow all the speakers’ blogs and read Smashing…]]></description><link>https://www.davidosomething.com/takeaways-from-an-event-apart-dc-2010/</link><guid isPermaLink="false">https://www.davidosomething.com/takeaways-from-an-event-apart-dc-2010/</guid><pubDate>Mon, 20 Sep 2010 11:02:26 GMT</pubDate><content:encoded>&lt;p&gt;So I just got back from the Washington, DC iteration of An Event Apart. I feel
that if you follow all the speakers’ blogs and read Smashing Magazine’s content
(or nontent, as it is), they’re really just saying the same thing. The real
experience is paying to see these pioneers and policy-makers speak live and
network with them (they are easily approachable at the conference or at the
after parties).&lt;/p&gt;
&lt;p&gt;The key message this year has been to &lt;em&gt;stop trying to make your site look the
same in every browser&lt;/em&gt;. You can approach this either through &lt;a href=&quot;http://www.alistapart.com/articles/understandingprogressiveenhancement/&quot;&gt;Progressive
Enhancement&lt;/a&gt;
or graceful degradation (neither of which are new topics).
Other messages included:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CSS3 and HTML5 are already usable if you design with progressive enhancement in mind&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.lukew.com/ff/entry.asp?933&quot;&gt;Mobile-first design&lt;/a&gt; is a great process to address design&lt;/li&gt;
&lt;li&gt;A slew of CSS3 animation and style demos to show how easy it is to spice up a website&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;An Event Apart’s audience seemed to be made up of mostly designers and
developers, which I don’t think is the right crowd since the speakers end up
preaching to the choir. &lt;strong&gt;The audience should be made up of clients—that is,
anyone who wants a website.&lt;/strong&gt; If you want or have a website, this is where you
would go to find out what you should be getting. Clients (i.e., corporations
with people who think they know a thing or two about “the internets” and “the
twitter” and how “they need a Facebook page”) are the ones asking for useless
and backwards things like IE6 and 7 compatibility. That’s like asking for AC on
a horse and carriage.&lt;/p&gt;
&lt;style class=&quot;grvsc-styles&quot;&gt;
  .grvsc-container {
    overflow: auto;
    position: relative;
    -webkit-overflow-scrolling: touch;
    padding-top: 1rem;
    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));
    padding-bottom: 1rem;
    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));
    border-radius: 8px;
    border-radius: var(--grvsc-border-radius, 8px);
    font-feature-settings: normal;
    line-height: 1.4;
  }
  
  .grvsc-code {
    display: table;
  }
  
  .grvsc-line {
    display: table-row;
    box-sizing: border-box;
    width: 100%;
    position: relative;
  }
  
  .grvsc-line &gt; * {
    position: relative;
  }
  
  .grvsc-gutter-pad {
    display: table-cell;
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  .grvsc-gutter {
    display: table-cell;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter::before {
    content: attr(data-content);
  }
  
  .grvsc-source {
    display: table-cell;
    padding-left: 1.5rem;
    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));
    padding-right: 1.5rem;
    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));
  }
  
  .grvsc-source:empty::after {
    content: &apos; &apos;;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter + .grvsc-source {
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  /* Line transformer styles */
  
  .grvsc-has-line-highlighting &gt; .grvsc-code &gt; .grvsc-line::before {
    content: &apos; &apos;;
    position: absolute;
    width: 100%;
  }
  
  .grvsc-line-diff-add::before {
    background-color: var(--grvsc-line-diff-add-background-color, rgba(0, 255, 60, 0.2));
  }
  
  .grvsc-line-diff-del::before {
    background-color: var(--grvsc-line-diff-del-background-color, rgba(255, 0, 20, 0.2));
  }
  
  .grvsc-line-number {
    padding: 0 2px;
    text-align: right;
    opacity: 0.7;
  }
  
&lt;/style&gt;</content:encoded></item><item><title><![CDATA[Honda Metropolitan in Boston]]></title><description><![CDATA[The Honda Metropolitan is a 49cc gas-powered scooter. Because of its small size
and vehicle classification, it is a very convenient mode of…]]></description><link>https://www.davidosomething.com/honda-metropolitan-in-boston/</link><guid isPermaLink="false">https://www.davidosomething.com/honda-metropolitan-in-boston/</guid><pubDate>Fri, 02 Apr 2010 13:58:46 GMT</pubDate><content:encoded>&lt;p&gt;The Honda Metropolitan is a 49cc gas-powered scooter. Because of its small size
and vehicle classification, it is a very convenient mode of transportation in
Boston, where the streets are crowded and parking is expensive.&lt;/p&gt;
&lt;p&gt;I did some research on the Honda Met to help out a new owner, and wanted to post
a compendium of all the information I found (a lot in some areas, not so much in
others). I’m not the expert, the members of
&lt;a href=&quot;http://www.urbanscootin.com/&quot;&gt;urbanscootin.com&lt;/a&gt; are, so massive props to them!
Some of these are specific to Boston/Massachusetts area, but others, such as
technical information, apply to most Honda Metropolitans.&lt;/p&gt;
&lt;h3 id=&quot;reviews&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#reviews&quot; aria-label=&quot;reviews permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Reviews&lt;/h3&gt;
&lt;p&gt;Some links to reviews:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://weblog.masukomi.org/2009/04/04/honda-metropolitan-scooter-review&quot;&gt;Honda Metropolitan Scooter [Review]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.hondapedia.org/2009/07/30/hondas-little-miracle-the-metropolitan-scooter/&quot;&gt;Honda’s Little Miracle – The Metropolitan Scooter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://flopsylacrosse.blogspot.com/2010/03/proud-owner-of-honda-metropolitan.html&quot;&gt;Proud Owner of a Honda Metropolitan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Alex Wrege’s blog – Archive for ‘Honda Metropolitan’ This guy’s scooter got
stolen :&amp;#x3C; lot’s of good reading, though&lt;/li&gt;
&lt;li&gt;A google search will turn up some more. I didn’t link to the ones on epinions
or big sites for that reason.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;metropolitan-i-or-ii&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#metropolitan-i-or-ii&quot; aria-label=&quot;metropolitan i or ii permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Metropolitan I or II?&lt;/h3&gt;
&lt;p&gt;Honda Metropolitan II’s were discontinued in 2005. A stock, unmodified Met II
will reach a maximum of 25 MPH. This is only useful to absolutely meet the new
moped/limited use vehicle law (see two sections down). Unless it’s an incredible
deal for Boston (i.e.,
&lt;a href=&quot;http://www.kbb.com/motorcycle/retail/2005/honda/chf50p-metropolitan-ii/70203&quot;&gt;$1085, the KBB value&lt;/a&gt;,
like new), just go for a regular Honda Metropolitan. If you’re experienced with
performance tuning you can try to remove the restrictor plate yourself.&lt;/p&gt;
&lt;h3 id=&quot;misc-information&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#misc-information&quot; aria-label=&quot;misc information permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Misc. Information&lt;/h3&gt;
&lt;p&gt;I don’t think people often mention that with a full tank of gas (the tank is
only 1.32 gallons), this thing weighs 176 pounds. While this is one of the
lighter scooters out there, it is still heavy for most people. Also, there are
only two places to lift it: the handlebars and the bar on the rear. If you think
a full jug of milk is heavy, you might not be able to lift the scooter off of
the kickstand, much less lift it up from a curb. This is light enough for one
strong thief to pick up and put in a truck, though. See the securing section for
how to avoid that.&lt;/p&gt;
&lt;p&gt;Also, there is almost no storage space on the scooter. You can get a basket and
a rear trunk, but that doesn’t help much. The seat compartment can only hold
a helmet and chain, most backpacks probably won’t fit.&lt;/p&gt;
&lt;h3 id=&quot;buying-a-honda-metropolitan&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#buying-a-honda-metropolitan&quot; aria-label=&quot;buying a honda metropolitan permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Buying a Honda Metropolitan&lt;/h3&gt;
&lt;p&gt;Before buying, you should read this article: &lt;a href=&quot;http://www.associatedcontent.com/article/13585/buying_a_50_cc_scooter_in_massachusetts.html?cat=27&quot;&gt;Buying a 50 CC Scooter in
Massachusetts&lt;/a&gt;.
This will help you decide whether or not you need a scooter and make you
a little more aware of what’s involved.&lt;/p&gt;
&lt;p&gt;Another factor to consider is that there may be a significant change coming to
the Honda Metropolitan in the form of Fuel Injectors for the 2010 or 2011
models; a patent was recently filed for integrating the injector into the
scooter
(&lt;a href=&quot;http://swdelaw.blogspot.com/2009/03/fuel-injection-coming-to-honda-scooters.html&quot;&gt;source&lt;/a&gt;).
So you may want to wait and get a brand new even more fuel efficient scooter.&lt;/p&gt;
&lt;p&gt;Since 2002, not much has changed in terms of the look and specifications. The
major difference between models is the carburetor, which has gone from 15 to 16
to 18mm. The seat height has been adjusted slightly as well, less than an inch
over the last 7 years. You can compare models here: &lt;a href=&quot;http://www.powersportsnetwork.com/enthusiasts/new_vehicle_compare.asp?vehicle1=89538&amp;#x26;year2=2002&amp;#x26;mfg2=1&amp;#x26;vehicle2=3718&amp;#x26;go=Go&quot;&gt;New Vehicle Compare at the
PowerSports
Network&lt;/a&gt;,
but you won’t find much.&lt;/p&gt;
&lt;p&gt;Finally, color does matter. These little scooters are full of personality, and
you might not want the hibiscus or checker pattern. They’re easy to paint, and
you can remove the cover and buy replacements, but for most models, here is
a listing of the colors you are limited to based on the year the vehicle was
released: &lt;a href=&quot;http://www.urbanscootin.com/forum/viewtopic.php?f=13&amp;#x26;t=4105&amp;#x26;start=15&quot;&gt;An Overview of Metropolitan Colors 2002
– present&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&quot;buying-from-an-official-honda-dealer&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#buying-from-an-official-honda-dealer&quot; aria-label=&quot;buying from an official honda dealer permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Buying from an Official Honda Dealer&lt;/h4&gt;
&lt;p&gt;While you can get a Vespa (Herb Chambers on Brighton Ave.) or Buddy (Scooters Go
Green) within the city limits, there is no place in the city of Boston to buy
a Honda Metropolitan. Luckily, the major dealerships in the nearby towns (e.g.
Parkway Cycle, GBM) deliver for free (at least, they did when I called). They
are also all official dealers so there is not much of a difference who you talk
to. Check the &lt;a href=&quot;http://powersports.honda.com/&quot;&gt;Honda Powersports site&lt;/a&gt; to find
the dealer nearest you.&lt;/p&gt;
&lt;p&gt;If you choose to work with a dealer, they should assist you in handling most
things such as finding insurance and registering the vehicle. If you are going
through official channels, your vehicle may be registered as a Limited Use
vehicle (read about the law later).&lt;/p&gt;
&lt;h4 id=&quot;buying-onlinethrough-craigslist&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#buying-onlinethrough-craigslist&quot; aria-label=&quot;buying onlinethrough craigslist permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Buying Online/through Craigslist&lt;/h4&gt;
&lt;p&gt;If you’re buying from someone online, save a copy of the ad they post. Because
the Honda Metropolitan is such a small vehicle, there may be some stolen
scooters on sale. Avoid these. I wouldn’t buy from anyone who didn’t provide
a phone number, and if they take cash only, find out why they won’t take a check
with a bill of sale. A check leaves a paper trace of the sale and is beneficial
for BOTH parties.&lt;/p&gt;
&lt;p&gt;Whatever the case, make sure the seller has the original documentation for the
bike. This includes the original bill of sale from a dealership, any
hand-drafted bills of sales in between, the original registration. If available,
the owner and service manuals are nice to have, and if the seller has a helmet,
lock, and cover, see if they can provide you with it as part of the sale.&lt;/p&gt;
&lt;p&gt;For your bill of sale, this site has a pretty standard one: &lt;a href=&quot;http://www.free-legal-document.com/motorcycle-bill-of-sale.html&quot;&gt;Free Motorcycle
Bill of Sale&lt;/a&gt;.
Just change motorcycle to Honda Metropolitan. The site also provides
a pre-purchase inspection checklist that applies to scooters: &lt;a href=&quot;http://www.free-legal-document.com/motorcycle-bill-of-sale.html&quot;&gt;Motorcycle Bill
of Sale&lt;/a&gt;
(inspection checklist).&lt;/p&gt;
&lt;p&gt;The odometer on a Honda Metropolitan only goes up to 9999 and then rolls over,
so the only way to tell if a scooter has 100 miles or 10100 miles is to inspect
it thoroughly!&lt;/p&gt;
&lt;h3 id=&quot;that-stupid-law&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#that-stupid-law&quot; aria-label=&quot;that stupid law permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;That Stupid Law&lt;/h3&gt;
&lt;p&gt;All of this information can also be found here: &lt;a href=&quot;http://www.dannysscootershop.com/145510.html&quot;&gt;Laws in
MA&lt;/a&gt;, the registration form (you’ll
eventually get to it), and in the
&lt;a href=&quot;http://www.urbanscootin.com/&quot;&gt;urbanscootin.com&lt;/a&gt; forums (register if you are
going to enter the MA scooter world).&lt;/p&gt;
&lt;p&gt;A law was passed in 2009 that creates a new category for scooters in between
a motorcycle and a moped. The in-between vehicles are considered “Limited Use”
motorized bicycles, and are not allowed to have top speeds above 30 MPH among
other conditions. For the Honda Metropolitan, this is the only condition under
which it fails.&lt;/p&gt;
&lt;h4 id=&quot;insurance&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#insurance&quot; aria-label=&quot;insurance permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Insurance&lt;/h4&gt;
&lt;p&gt;Scooter insurance supposedly costs around $100 according to some people on the
&lt;a href=&quot;http://www.urbanscootin.com/&quot;&gt;urbanscootin.com&lt;/a&gt; forums. I couldn’t find
insurance for less than $400 (Progressive and Metlife), and my company insurance
provider (Progressive) does not have Scooter coverage in MA (yet, but it does in
other states) so it would fall under Motorcycle insurance. Insurance is not
a bad idea if you live in, say, Roxbury, where your scooter will probably get
stolen. Only a properly registered scooter can be insured, so you have to
register as a Limited Use vehicle if you are getting insurance.&lt;/p&gt;
&lt;h4 id=&quot;parking&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#parking&quot; aria-label=&quot;parking permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Parking&lt;/h4&gt;
&lt;p&gt;Luckily the parking requirement is not currently enforced in Boston
(&lt;a href=&quot;http://www.dannysscootershop.com/145510.html&quot;&gt;source&lt;/a&gt;), but if a police
officer felt like it, they could. Don’t park anywhere stupid (e.g. fire hydrant,
driveway, exits, middle of the sidewalk).&lt;/p&gt;
&lt;h4 id=&quot;recommended-registration&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#recommended-registration&quot; aria-label=&quot;recommended registration permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Recommended Registration&lt;/h4&gt;
&lt;p&gt;If you are one to obey laws to the letter, plan to get insurance for the $2000
vehicle, or you have a Honda Metropolitan in good condition and plan on riding
it really fast (above 25 MPH), register as a LU vehicle and get insured.&lt;/p&gt;
&lt;p&gt;Otherwise, know that I am not advising you to disobey the law, but you should be
aware of these points:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A used Honda Metropolitan may not be able to reach the manufacturer advertised
top speed of 42 MPH. Some of them can barely go 30 MPH due to wear, and the
Metropolitan II is intentionally restricted to 25 MPH.&lt;/li&gt;
&lt;li&gt;If you have a cover, the model number is not visible without lifitng it.&lt;/li&gt;
&lt;li&gt;Traffic/police officers don’t carry a chart with scooter top speeds and model numbers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As long as you don’t ride above 25 MPH and get clocked or park somewhere that an
officer would check on your vehicle, you could get away with registering as
a moped.&lt;/p&gt;
&lt;h4 id=&quot;registering-a-scooter&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#registering-a-scooter&quot; aria-label=&quot;registering a scooter permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Registering a Scooter&lt;/h4&gt;
&lt;p&gt;I didn’t do this, so I don’t know any details other than you just bring
a completed RMV1 and some cash to the DMV, and you get a sticker (for moped
registrations). There is a DMV near the Boylston (Green line)/China Town (Orange
line) stop:&lt;/p&gt;
&lt;address&gt;630 Washington Street
Boston, MA 02111-1615
&lt;/address&gt;
&lt;h3 id=&quot;accessories&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#accessories&quot; aria-label=&quot;accessories permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Accessories&lt;/h3&gt;
&lt;p&gt;Now that you’ve purchased, (insured,) and registered your vehicle, you need some
accessories before you can ride it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DOT approved helmet – safety first. Price varies, maybe $40.&lt;/li&gt;
&lt;li&gt;A U-lock – this is to lock the bike to a chain to a pole. Get a good one,
13/14 mm diameter should fit most chains. A good lock also comes with an
anti-theft policy which can act as secondary insurance for your scooter. You
need to fill out the form and have the broken lock to claim the theft.
Kryptonite no longer uses the old style locks that can be picked with a Bic
pen, but make sure you get a really good one. Roughly $100.&lt;/li&gt;
&lt;li&gt;A strong chain – A lock is only as good as the chain. 5 feet is JUST enough to
go around the back wheel and a street sign. Some locks and chains come as
sets. The OnGuard chains are reputable. $50 – $150.&lt;/li&gt;
&lt;li&gt;A durable cover – This should not only protect from rain, but should be heavy
enough or have a cord that prevents the wind from blowing it off. Boston is
windy. Also, a heavy/banded cover may discourage officers from trying to find
a model number. Be careful with cheap covers, they may melt on a hot day and
in contact with the hot parts of the scooter. Roughly $40.&lt;/li&gt;
&lt;li&gt;A batter maintainer/float charger – The Deltran Battery Tender Jr. is the
recommended brand by urbanscootin.com. It is the same price as any other
brand, but has an ampere rating that is similar to the Honda Metropolitan’s
stock Yuasa battery. In other words, it’s the best. Get it for the
winter/times when you won’t ride it at least twice a week. No more than $30.
Here is the one you should get: &lt;a href=&quot;http://www.amazon.com/Battery-Tender-021-0123-Junior-Charger/dp/B000CITK8S/ref=sr_1_1?ie=UTF8&amp;#x26;s=automotive&amp;#x26;qid=1270232668&amp;#x26;sr=8-1&quot;&gt;Battery Tender 021-0123 Battery Tender Junior
12V Battery
Charger&lt;/a&gt;.
Read more about batteries in the maintenance section.&lt;/li&gt;
&lt;li&gt;The Honda Metropolitan Service manual – is optional, but if you got a scooter
that may not be in perfect condition or you want to take care of the scooter
yourself, you’ll want this. You can order it from &lt;a href=&quot;http://www.helminc.com/helm/Result.asp?session=22F94EB788EA4F3C9FD8CFA8D1003906&amp;#x26;Style=helm&amp;#x26;Mfg=AHC&amp;#x26;Make=AHC&amp;#x26;Model=SCOO&amp;#x26;Year=&amp;#x26;Category=&amp;#x26;Keyword=&amp;#x26;Module=&amp;#x26;selected_media=&quot;&gt;Helm
Incorporated&lt;/a&gt;,
do a search for the model (CHF50) to get the manuals you want. $20 – $60
depending on which ones you order.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Didn’t expect the extra costs, huh? That’s like $400 on top of the scooter.&lt;/p&gt;
&lt;h3 id=&quot;maintenance&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#maintenance&quot; aria-label=&quot;maintenance permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Maintenance&lt;/h3&gt;
&lt;p&gt;If you ride the scooter often (twice a week for at least five miles a time), use
a battery maintainer in the off-season, and change the oil every 1000 miles or
year, change the spark plug every 1500 miles, your scooter will be in top shape.&lt;/p&gt;
&lt;h4 id=&quot;securing-your-honda-metropolitan&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#securing-your-honda-metropolitan&quot; aria-label=&quot;securing your honda metropolitan permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Securing your Honda Metropolitan&lt;/h4&gt;
&lt;p&gt;The rear frame post is the most secure place to run the chain, but it is
difficult to get to. The next best place to run the chain is through the rear
tire itself. The platform of the scooter is another option if your chain is long
enough. A picture can be found in this thread on urbanscootin.com: &lt;a href=&quot;http://www.urbanscootin.com/forum/viewtopic.php?f=14&amp;#x26;t=10684&quot;&gt;Chain/Cable
Locks for
Scooters.&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Use the kickstand lock found under the seat when you put it down to prevent
someone from just running away with your scooter.&lt;/p&gt;
&lt;p&gt;Grip-Locks are a relatively new thing, and I’m not sure if they’re available in
the US, but you can try here: &lt;a href=&quot;http://www.grip-lock.com/&quot;&gt;GRIP-LOCK&lt;/a&gt; if you feel
you need the extra security.&lt;/p&gt;
&lt;h4 id=&quot;fueling&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#fueling&quot; aria-label=&quot;fueling permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Fueling&lt;/h4&gt;
&lt;p&gt;The carburetor mixes impure gasoline for you, and is designed to work with
regular gas. The owner’s manual recommends that you use only regular, 87 octane,
gasoline. You should follow this recommendation, unless a professional
recommends otherwise (in which case the reason would most likely be something
called “knocking,” which is when the fuel spontaneously ignites and damages the
engine). The gas cap is locked as a safety measure to a) prevent people from
putting sugar and other things in your gas tank, and b) prevent people from
stealing your single gallon of gas in these desperate, desperate times.&lt;/p&gt;
&lt;p&gt;Opening the gas cap can be tricky if you’ve never seen it done and don’t have
the manual. The gas cap is underneath a plastic cover where the floor board
meets the seat. Lift the cover using the tab, and you’ll see the metal cap. You
need your key to open the gas cap. Put the key in and turn it to the right to
unlock the cap. The entire metal cap can then be unscrewed by turning it to the
left. It is not attached to the vehicle like a car gas cap, so don’t lose it.
When you’re done putting in gas (and a shot of Sea Foam to clean the carburetor
if you need it), screw the gas cap back on and lock it. Close the plastic cover,
and you’re all set.&lt;/p&gt;
&lt;h4 id=&quot;oil-changes&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#oil-changes&quot; aria-label=&quot;oil changes permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Oil Changes&lt;/h4&gt;
&lt;p&gt;Regular maintenance includes changing the oil every 1000 miles or year,
whichever comes more often. Many of the posts on urbanscootin.com agree to use
a synthetic oil (but the effect is not much different from non-synthetic), such
as Amsoil Synthetic 10w40 or Castrol Syntec 10w40. Just make sure it’s 10w40
and NON energy conserving. Oil should cost around $9.00. Here are some guides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.urbanscootin.com/forum/viewtopic.php?f=2&amp;#x26;t=857&amp;#x26;start=15&quot;&gt;Oil changes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.urbanscootin.com/forum/viewtopic.php?f=15&amp;#x26;t=8074&quot;&gt;HONDA MET:Oil Change/Level Check, Screen Maintenance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=zNQ3myoYxdM&quot;&gt;YouTube – Oil Change (Honda Metropolitan)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.urbanscootin.com/forum/viewtopic.php?f=2&amp;#x26;t=13357&quot;&gt;Changing the Oil in the Honda Metropolitan—Step by Step&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;kickstarting&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#kickstarting&quot; aria-label=&quot;kickstarting permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Kickstarting&lt;/h4&gt;
&lt;p&gt;If your battery is getting old (4 years or so, if you maintained it well),
consider replacing it. Until then, you may have to kickstart your scooter. The
Honda Metropolitan has a kickstarter next to the kickstand. To use it, put the
scooter on the kickstand and turn it on. Then flip the kickstarter peg out and
push it down half way. There is a midway point that gives some resistance, once
you ease the kickstarter past that, give it a smooth push (should not get stuck
or jerk) all the way to the end. It takes about the same energy as pulling the
rip cord on a lawn mower. Don’t literally kick it or stomp on it. Just a strong,
fluid push from the midpoint to the end is all it takes.&lt;/p&gt;
&lt;h4 id=&quot;battery&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#battery&quot; aria-label=&quot;battery permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Battery&lt;/h4&gt;
&lt;p&gt;All Honda Metropolitans use a Yuasa AGM (which implies that it is sealed)
lead-acid battery, part number YTZ7S. The battery is 12 volts, 0.6 amps (600
mA). More technical specifications can be found here: &lt;a href=&quot;http://store.yuasabatteries.com/products/productdetail/YTZ7S/part_number=YUAM727ZS/1717.0.1.1.32856.48643.49118.48652.0&quot;&gt;Yuasa Battery, Inc.
YTZ7S&lt;/a&gt;.
This battery should last for about 5 years with active riding and a Battery
Tender during the off-season.&lt;/p&gt;
&lt;h4 id=&quot;battery-maintenance&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#battery-maintenance&quot; aria-label=&quot;battery maintenance permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Battery Maintenance&lt;/h4&gt;
&lt;p&gt;The Honda Metropolitan battery is a 0.6 A battery. Because of this, it requires
at least 0.6 amps to charge. An ampere is a measure of current, meaning that
higher ampere chargers will charge your batter faster. This is not exactly good,
because it also kills the battery faster. You wouldn’t use a $2 phone charger
from Chinatown on your new $300 iPhone would you?&lt;/p&gt;
&lt;p&gt;Some rules:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Don’t get a trickle charger. If you accidentally leave it on too long, it
will start to over charge and kill your battery.&lt;/li&gt;
&lt;li&gt;Don’t charge from a car if the car is on. This will just plain kill your
battery.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&quot;the-deltran-battery-tender-jr&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-deltran-battery-tender-jr&quot; aria-label=&quot;the deltran battery tender jr permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Deltran Battery Tender Jr&lt;/h5&gt;
&lt;p&gt;This is a float charger that delivers a current of 0.75 amps. This rating is
safe for the Honda Metropolitan battery. This battery maintainer is &lt;em&gt;the&lt;/em&gt;
Battery Tender, and is recommended for use. You connect the positive clip or
ring to the positive connector of your scooter’s battery, the negative clip to
a metal surface like the engine (the Honda Metropolitan is negatively grounded,
like most things), and then plug the Battery Tender into an outlet (never plug
it in to the outlet first, it has to check the battery to determine how much to
charge).&lt;/p&gt;
&lt;p&gt;Many people like to leave the wires connected and just disconnect the charger.
Leaving a wire attached is referred to as pigtailing.&lt;/p&gt;
&lt;h3 id=&quot;troubleshooting&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#troubleshooting&quot; aria-label=&quot;troubleshooting permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Troubleshooting&lt;/h3&gt;
&lt;p&gt;Most issues revolve around starting the Honda Met. Here’s what you should be
checking:&lt;/p&gt;
&lt;h4 id=&quot;battery-issues&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#battery-issues&quot; aria-label=&quot;battery issues permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Battery issues&lt;/h4&gt;
&lt;p&gt;If your scooter dies/stalls after starting, check your battery. You can use
a multimeter if you know how, or just take the battery out to an auto shop. They
supposedly check it for free. With batteries, you get what you pay for, and
Yuasa is a good brand. If your battery cannot hold a charge, you should replace
it with an aftermarket battery of the same type. Yuasa’s aftermarket brand is
Motocross and goes for about &lt;a href=&quot;http://www.batterystuff.com/batteries/motorcycle/YTZ7S.html&quot;&gt;$84 at Battery
Stuff&lt;/a&gt;. If you
decide to go with another brand, make sure it is an AGM battery (or at least
“sealed,” if not AGM, which will not last as long, chemically, without a battery
maintainer) and pre-filled/activated/charged YTZ7S.&lt;/p&gt;
&lt;p&gt;Here’s how to change the battery:
&lt;a href=&quot;http://www.ehow.com/how_5470736_change-battery-honda-metropolitan.html&quot;&gt;How to Change a Battery on a Honda Metropolitan&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can learn a lot about lead-acid batteries on the Battery Tender website:
&lt;a href=&quot;http://batterytender.com/resources/introduction-to-lead-acid-batteries.htm&quot;&gt;Introduction To Lead Acid Batteries&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&quot;spark-plug&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#spark-plug&quot; aria-label=&quot;spark plug permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Spark Plug&lt;/h4&gt;
&lt;p&gt;If it wasn’t the battery, it could be that the spark plug is dirty. You can take
it out with a socket wrench. If the head is black, you can replace it. If it’s
brown you can spray some special cleaner on it. Replacement just involves
getting a new spark plug (bring the old one to a car shop) and putting it in.
Here’s some reference material:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.urbanscootin.com/forum/viewtopic.php?f=2&amp;#x26;t=8050&amp;#x26;p=84598&quot;&gt;How To: Change Spark Plug, Cross-References&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=NY6CNbvwkKg&amp;#x26;feature=related&quot;&gt;YouTube – Spark Plug (Honda Metropolitan)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;carburetor&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#carburetor&quot; aria-label=&quot;carburetor permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Carburetor&lt;/h4&gt;
&lt;p&gt;Try draining the carburetor. Then run seafoam through your gas tank (with some
clean gas) and let it run. This will clean out your carburetor. If it still
doesn’t start, you may have to jet (remove and clean) your carburetor (or have
a professional do it for a fee). Here’s how to drain the carb:
&lt;a href=&quot;http://www.urbanscootin.com/forum/viewtopic.php?f=2&amp;#x26;t=11355&quot;&gt;How to Drain Carb?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here’s how to jet:
&lt;a href=&quot;http://www.urbanscootin.com/forum/viewtopic.php?f=15&amp;#x26;t=352&amp;#x26;sid=0ac01c6d023323825e0b5b93af5a5ba4&quot;&gt;Jetting the Carburator&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&quot;all-else&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#all-else&quot; aria-label=&quot;all else permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;All Else&lt;/h4&gt;
&lt;p&gt;The air filter works in a tight system with the spark plug and carburetor. I’d
check that next: &lt;a href=&quot;http://www.youtube.com/watch?v=Vya_lAublWA&amp;#x26;feature=related&quot;&gt;Replacing the Air
Filter&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The fuel pump is another obvious thing to check: &lt;a href=&quot;http://www.urbanscootin.com/forum/viewtopic.php?f=2&amp;#x26;p=93365&quot;&gt;Fuel Pump
Replacement&lt;/a&gt;, you
might even want to check it before the battery.&lt;/p&gt;
&lt;p&gt;If your scooter is old, it might be overheating so the coolant needs to be
replaced. Here’s some resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.urbanscootin.com/forum/viewtopic.php?f=2&amp;#x26;t=13898&quot;&gt;View of Coolant Bottle for Metropolitans&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=1fESFEjrGao&amp;#x26;feature=related&quot;&gt;YouTube – Coolant Change (Honda metropolitan)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For anything else, unless you’re a greasemonkey, find someone to do it for you.&lt;/p&gt;
&lt;h3 id=&quot;conclusion&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-label=&quot;conclusion permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;The Honda Metropolitan has been around for almost a decade now, with almost no
change in technology, so much of the information about it is pretty solid. If
you have any questions I recommend going to my primary source,
&lt;a href=&quot;http://www.urbanscootin.com/&quot;&gt;http://www.urbanscootin.com/&lt;/a&gt;. If you have any
corrections or suggestions for this article, post a comment and let me know.&lt;/p&gt;
&lt;style class=&quot;grvsc-styles&quot;&gt;
  .grvsc-container {
    overflow: auto;
    position: relative;
    -webkit-overflow-scrolling: touch;
    padding-top: 1rem;
    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));
    padding-bottom: 1rem;
    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));
    border-radius: 8px;
    border-radius: var(--grvsc-border-radius, 8px);
    font-feature-settings: normal;
    line-height: 1.4;
  }
  
  .grvsc-code {
    display: table;
  }
  
  .grvsc-line {
    display: table-row;
    box-sizing: border-box;
    width: 100%;
    position: relative;
  }
  
  .grvsc-line &gt; * {
    position: relative;
  }
  
  .grvsc-gutter-pad {
    display: table-cell;
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  .grvsc-gutter {
    display: table-cell;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter::before {
    content: attr(data-content);
  }
  
  .grvsc-source {
    display: table-cell;
    padding-left: 1.5rem;
    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));
    padding-right: 1.5rem;
    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));
  }
  
  .grvsc-source:empty::after {
    content: &apos; &apos;;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter + .grvsc-source {
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  /* Line transformer styles */
  
  .grvsc-has-line-highlighting &gt; .grvsc-code &gt; .grvsc-line::before {
    content: &apos; &apos;;
    position: absolute;
    width: 100%;
  }
  
  .grvsc-line-diff-add::before {
    background-color: var(--grvsc-line-diff-add-background-color, rgba(0, 255, 60, 0.2));
  }
  
  .grvsc-line-diff-del::before {
    background-color: var(--grvsc-line-diff-del-background-color, rgba(255, 0, 20, 0.2));
  }
  
  .grvsc-line-number {
    padding: 0 2px;
    text-align: right;
    opacity: 0.7;
  }
  
&lt;/style&gt;</content:encoded></item><item><title><![CDATA[Tips for Faster PSD to HTML Conversions]]></title><description><![CDATA[Ever wonder how those PSD to HTML services do the job with such a quick
turnaround, sometimes guaranteeing valid code in 24 hours on even…]]></description><link>https://www.davidosomething.com/tips-faster-psd-html-conversions/</link><guid isPermaLink="false">https://www.davidosomething.com/tips-faster-psd-html-conversions/</guid><pubDate>Sat, 27 Feb 2010 21:33:38 GMT</pubDate><content:encoded>&lt;p&gt;Ever wonder how those PSD to HTML services do the job with such a quick
turnaround, sometimes guaranteeing valid code in 24 hours on even the most
complex PSDs? The task is roughly 40% breaking up the PSD logically, 20% coding,
and 40% moving elements around until everything fits together. Here are some
tips I’ve learned from years of experience and trying to find new techniques in
those tutorials the web has too many of.&lt;/p&gt;
&lt;h3 id=&quot;photoshop-techniques&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#photoshop-techniques&quot; aria-label=&quot;photoshop techniques permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Photoshop Techniques&lt;/h3&gt;
&lt;p&gt;I usually start a conversion by preparing the assets. Working with the design
first (as opposed to starting with the framework) also gives me a better sense
of where everything goes.&lt;/p&gt;
&lt;h4 id=&quot;save-for-web&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#save-for-web&quot; aria-label=&quot;save for web permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Save for Web&lt;/h4&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 350px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/97f1e600c0540a51c9449cd842ebd386/70ebb/saveforweb-350x300.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 85.8108108108108%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAARABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAECBAX/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAAB6cpS7IXXYKA//8QAGhABAAIDAQAAAAAAAAAAAAAAAQAhAhAiE//aAAgBAQABBQLEpOqmJSdeDDf/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AR//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AR//xAAaEAACAgMAAAAAAAAAAAAAAAAAAREhIDJB/9oACAEBAAY/ArFBwtCg2w//xAAZEAEAAwEBAAAAAAAAAAAAAAABABFBECH/2gAIAQEAAT8hF824JQa3hVsnoijekxn/2gAMAwEAAgADAAAAEK/IAP/EABURAQEAAAAAAAAAAAAAAAAAABAB/9oACAEDAQE/ECn/xAAVEQEBAAAAAAAAAAAAAAAAAAARIP/aAAgBAgEBPxBj/8QAHhAAAgMAAQUAAAAAAAAAAAAAAAERITFRQXGRwdH/2gAIAQEAAT8QmlnwySZeycEQpouKKBzlu+y4KJChp/D+mkdJpdj/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/97f1e600c0540a51c9449cd842ebd386/cbe2e/saveforweb-350x300.webp 148w,
/static/97f1e600c0540a51c9449cd842ebd386/3084c/saveforweb-350x300.webp 295w,
/static/97f1e600c0540a51c9449cd842ebd386/a3432/saveforweb-350x300.webp 350w&quot;
              sizes=&quot;(max-width: 350px) 100vw, 350px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/97f1e600c0540a51c9449cd842ebd386/a80bd/saveforweb-350x300.jpg 148w,
/static/97f1e600c0540a51c9449cd842ebd386/1c91a/saveforweb-350x300.jpg 295w,
/static/97f1e600c0540a51c9449cd842ebd386/70ebb/saveforweb-350x300.jpg 350w&quot;
            sizes=&quot;(max-width: 350px) 100vw, 350px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/97f1e600c0540a51c9449cd842ebd386/70ebb/saveforweb-350x300.jpg&quot;
            alt=&quot;Save For Web Dialog&quot;
            title=&quot;Save For Web Dialog&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Alt+Ctrl+Shift+S, or on Macs, Cmd+Opt+Shift+S. This is the key combination
you’ll use to save every piece of the PSD you’re going to use for your design.
From the Save for Web window, you can choose the best filetype for the image
you’re saving based on quality and size.&lt;/p&gt;
&lt;h4 id=&quot;convert-to-smart-object&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#convert-to-smart-object&quot; aria-label=&quot;convert to smart object permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Convert to Smart Object&lt;/h4&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 199px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/1e7e5831e8186ed22466abd1aff7ddf7/3d64b/converttosmartobject.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 33.108108108108105%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAAAsTAAALEwEAmpwYAAABVElEQVQY002NbU+CUBiG+f9/omX2svXJtmriOJFCjtRSmQIlYWaKJ84Rzjuo1dCtde3afd/Pp0d7i6J78/7kqHJavTg/uazfNs6q1crx2c31rf/66nne2Nvj+3+OPW8ShgAAbbMpSJquEcKlCUYIwhXGOEtTzhhnVAgueDk4Y4KXMkp22407HGiY5XO4jtcsoRJRBdc8IXKFSYxIQhVM+TxGi4QkRMCUxZjGmC5Rhlnh9AYaL35Gfmg/dJpWBxitO9Butrq9p2HDaDfvbADaTrd/VdMBsM3m4wJmhwdEfXefXS1OVfiZBNEimC5Hk/nLO/SjeDIrcxzO/WgZfiI3mPa9KJiuZpB8fNEZzFZZ8dAZaEWxpVwIqYRUMs/LoQ6p1P7kUso8V3khlWJcMC4IZZvtbjB0NcdxGrpumqZe1w3DsG3b+k+rdai9lr3HsizHcWq12i+YjWtUbYPO1AAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/1e7e5831e8186ed22466abd1aff7ddf7/cbe2e/converttosmartobject.webp 148w,
/static/1e7e5831e8186ed22466abd1aff7ddf7/e739e/converttosmartobject.webp 199w&quot;
              sizes=&quot;(max-width: 199px) 100vw, 199px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/1e7e5831e8186ed22466abd1aff7ddf7/12f09/converttosmartobject.png 148w,
/static/1e7e5831e8186ed22466abd1aff7ddf7/3d64b/converttosmartobject.png 199w&quot;
            sizes=&quot;(max-width: 199px) 100vw, 199px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/1e7e5831e8186ed22466abd1aff7ddf7/3d64b/converttosmartobject.png&quot;
            alt=&quot;Convert to Smart Object&quot;
            title=&quot;Convert to Smart Object&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;For groups of layers (including text) that doesn’t use layer blending options
and aren’t affected by adjustment layers, select the layers and/or groups
involved and convert them to a Smart Object. A Smart Object is a temporary
vector object that you can modify as a separate file (a PSB file). The
modifications will appear in the original PSD. Double click on the smart object
in the layers menu to edit it as if it were a new image. From the Smart Object
edit window, you can Save for Web.&lt;/p&gt;
&lt;h4 id=&quot;selecting-layers&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#selecting-layers&quot; aria-label=&quot;selecting layers permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Selecting Layers&lt;/h4&gt;
&lt;p&gt;Ctrl+Click on the layer thumbnail to select the contents of the layer. This
beats using the wand tool or something to select the transparent pixels around
it. You can also do Ctrl-shift and Ctrl-Alt clicks on additional layer
thumbnails to add and subtract them from the selection.&lt;/p&gt;
&lt;h4 id=&quot;copy-merged&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#copy-merged&quot; aria-label=&quot;copy merged permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Copy merged&lt;/h4&gt;
&lt;p&gt;A godsend of a shortcut. Ctrl+(Macs: Command)+Shift+C. I use this for layers
that have blending options set or are affected by adjustment layers. After
you’ve copied it, do a Ctrl+(Macs: Command)+N and paste to the new file. Then
Save for Web.&lt;/p&gt;
&lt;h4 id=&quot;slicings-other-use&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#slicings-other-use&quot; aria-label=&quot;slicings other use permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Slicing’s other use&lt;/h4&gt;
&lt;p&gt;I feel that slicing is an outdated method to chop up a PSD because complex
designs will use overlays of all kinds. Slicing has other uses, though.
Sometimes I’ll slice the document and have Photoshop generate HTML for me.
I then open the generated document in Firefox and use Firebug to get the
computed sizes for block elements later on.&lt;/p&gt;
&lt;h4 id=&quot;actions&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#actions&quot; aria-label=&quot;actions permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Actions&lt;/h4&gt;
&lt;p&gt;Actions are so underused! These are macros that you can create simply by
recording what you do. You can create an action that does any of the things I’ve
listed above for you. For instance, next time you make a selection, start
recording an action as you Copy Merged -&gt; Create a New File -&gt; Paste -&gt; Save for
Web. Stop recording and save your action (you might have to delete the steps
after the Save for Web dialog appears). Next time you make a selection that
needs to be Copy Merged and saved into a new file, just run the action and save
as a new name! Here is a more in-depth &lt;a href=&quot;http://morris-photographics.com/photoshop/tutorials/actions.html&quot;&gt;tutorial on creating Photoshop
Actions&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&quot;text&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#text&quot; aria-label=&quot;text permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Text&lt;/h4&gt;
&lt;p&gt;Take note of the font-face and font-sizes in pixels used before you dive into
the HTML. It’s okay to use pixel font sizes these days, but if you’re old-school
like I am at least you can find the relative size now that you have them all.&lt;/p&gt;
&lt;h4 id=&quot;flattened-versions&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#flattened-versions&quot; aria-label=&quot;flattened versions permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Flattened Versions&lt;/h4&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 500px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/87a1297108b6d7e0412a9dc6edec7e7c/41099/invert.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 62.83783783783784%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIFAwT/xAAWAQEBAQAAAAAAAAAAAAAAAAAAAQL/2gAMAwEAAhADEAAAAU0n1xDrM3//xAAZEAADAQEBAAAAAAAAAAAAAAAAAgMBFBL/2gAIAQEAAQUC2OYLTyZVjrcjBbT5UP/EABURAQEAAAAAAAAAAAAAAAAAAAAR/9oACAEDAQE/AVf/xAAVEQEBAAAAAAAAAAAAAAAAAAAAEf/aAAgBAgEBPwFH/8QAGxAAAgMAAwAAAAAAAAAAAAAAAAECETEDIVH/2gAIAQEABj8C7oUVZpkSPJK7fhrP/8QAGhABAAMAAwAAAAAAAAAAAAAAAQARITFxkf/aAAgBAQABPyFA26dmHY4olDZXQfCLQTvUJf8A/9oADAMBAAIAAwAAABCQ7//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPxBMR//EABYRAAMAAAAAAAAAAAAAAAAAAAABEf/aAAgBAgEBPxAdOn//xAAcEAEAAwEAAwEAAAAAAAAAAAABABEhMVFxsdH/2gAIAQEAAT8QpNYLS2K9S+JRgXO12It08ZKcLmK/ssGpFAamZCCYjlJ+T//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/87a1297108b6d7e0412a9dc6edec7e7c/cbe2e/invert.webp 148w,
/static/87a1297108b6d7e0412a9dc6edec7e7c/3084c/invert.webp 295w,
/static/87a1297108b6d7e0412a9dc6edec7e7c/b0a15/invert.webp 500w&quot;
              sizes=&quot;(max-width: 500px) 100vw, 500px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/87a1297108b6d7e0412a9dc6edec7e7c/a80bd/invert.jpg 148w,
/static/87a1297108b6d7e0412a9dc6edec7e7c/1c91a/invert.jpg 295w,
/static/87a1297108b6d7e0412a9dc6edec7e7c/41099/invert.jpg 500w&quot;
            sizes=&quot;(max-width: 500px) 100vw, 500px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/87a1297108b6d7e0412a9dc6edec7e7c/41099/invert.jpg&quot;
            alt=&quot;Normal and inverted flattened designs&quot;
            title=&quot;Normal and inverted flattened designs&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Save a flattened version of the site. Print it out if you want. This will be
useful for reference by eye, and for working with the Pixel Perfect Firebug
extension. Finally, invert the colors of a flattened version and save it as
a new file. You’ll also want this for Pixel Perfect.&lt;/p&gt;
&lt;h3 id=&quot;creating-the-html-and-css&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#creating-the-html-and-css&quot; aria-label=&quot;creating the html and css permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Creating the HTML and CSS&lt;/h3&gt;
&lt;p&gt;This part should be simple—it just involves creating the &lt;code&gt;&amp;#x3C;div&gt;&lt;/code&gt;, &lt;code&gt;&amp;#x3C;span&gt;&lt;/code&gt;,
headers, and paragraphs you need. If you took note of the font information like
I told you to above, now is a good time to define it in your CSS. Besides
putting a body background color/image in, the font stack really helps everything
look like it’s nearing completion.&lt;/p&gt;
&lt;h4 id=&quot;frameworks-and-resets&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#frameworks-and-resets&quot; aria-label=&quot;frameworks and resets permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Frameworks and Resets&lt;/h4&gt;
&lt;p&gt;If you haven’t already formed your own, try adopting the popular ones (not if
you’re on a deadline, though). Fluency with pre- or self-built, HTML and CSS
frameworks means you already have the groundwork complete and only need to add
more block elements as needed. You shouldn’t waste any time finding a reset or
creating the same &lt;code&gt;&amp;#x3C;div id=&quot;wrapper&quot;&gt;&lt;/code&gt; you do for every layout.&lt;/p&gt;
&lt;h4 id=&quot;quickly-get-image-dimensions&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#quickly-get-image-dimensions&quot; aria-label=&quot;quickly get image dimensions permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Quickly get Image Dimensions&lt;/h4&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 350px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/5b750a6d792f591ea6a89113bac5a04d/70ebb/imagedimensions-350x300.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 85.8108108108108%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAARABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAECBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHszcSNjIsoX//EABgQAQEBAQEAAAAAAAAAAAAAAAEAEhEg/9oACAEBAAEFAuFkskR5/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPwEf/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPwEf/8QAFhAAAwAAAAAAAAAAAAAAAAAAADAx/9oACAEBAAY/AiI//8QAGxAAAgIDAQAAAAAAAAAAAAAAAAERMRAhUaH/2gAIAQEAAT8hnVeC4B8ESjaJaHYqz//aAAwDAQACAAMAAAAQfDfC/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAEREP/aAAgBAwEBPxCIi3//xAAXEQADAQAAAAAAAAAAAAAAAAAAAREQ/9oACAECAQE/EKyvf//EABwQAQEBAAIDAQAAAAAAAAAAAAERACFBEDFhof/aAAgBAQABPxCY/rESwXrBYcHzNMSzi4ADbTrUrjejz//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/5b750a6d792f591ea6a89113bac5a04d/cbe2e/imagedimensions-350x300.webp 148w,
/static/5b750a6d792f591ea6a89113bac5a04d/3084c/imagedimensions-350x300.webp 295w,
/static/5b750a6d792f591ea6a89113bac5a04d/a3432/imagedimensions-350x300.webp 350w&quot;
              sizes=&quot;(max-width: 350px) 100vw, 350px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/5b750a6d792f591ea6a89113bac5a04d/a80bd/imagedimensions-350x300.jpg 148w,
/static/5b750a6d792f591ea6a89113bac5a04d/1c91a/imagedimensions-350x300.jpg 295w,
/static/5b750a6d792f591ea6a89113bac5a04d/70ebb/imagedimensions-350x300.jpg 350w&quot;
            sizes=&quot;(max-width: 350px) 100vw, 350px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/5b750a6d792f591ea6a89113bac5a04d/70ebb/imagedimensions-350x300.jpg&quot;
            alt=&quot;Image Dimensions Column&quot;
            title=&quot;Image Dimensions Column&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;For Windows users, in Explorer you can add a Dimensions column to the detail
view. Right click on the column names and Dimensions should be one of the
options available.&lt;/p&gt;
&lt;h3 id=&quot;design-in-firefox&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#design-in-firefox&quot; aria-label=&quot;design in firefox permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Design in Firefox&lt;/h3&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 128px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/d810ccf3e642e0f074a024f1bbcb6aaf/750d2/firefox.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFjUlEQVQ4y1WUC1DVdRbHv7/f/3/v5R2JirwMF7auIwnkC8vKMSsfaKbGYNCWqGk0KNAImo/YIg2tcRZpFMd01dFaVrdwdRFRzM3HGmu6QKso7rKAkPcihCmQ9/7Pdwd19vGdOXPmzJn5zJnvzPcA91SEP70KFff6O3oJgLhjV0FAjdu7N2HOmZp5BfX1iwv+1pixouL0s6W5zuDEqwTGuuHujTe+2ATV2uwLUmNIKAAefghcAOxJBTD9Q4DE8E/LFoYfrf3Wca3bGnrbw8ReL/O72zintZ0JpzqaEnZ9vwGR9aEdP0bjlXHAhbOmJg2QNoCfB4PLgXemIRqJ82ODlh88Yn50ltjdyMhvauhb9w8vmn72RlQe81Zfnml92TqHFY0vseZy3PXa08gb5PQPrCzX6Gg17kGRbAee8gsKrcvChdQF6e74RRsYvXSrt6RohnfXB6PEb8fXYv+2XXC4RfK3LxS6gi32Kg/7QOnWbLukL7y92Bj2+98ZuHjOUPj0MRtefljPqUmx8UqOP1vy7Z62DQHCYnDU+4WCr+4ITrQSx1vos/mk7C2dLLwURd4ItnhH/cwesLVBfwfAH0a/hx8r7EnVKxpTbOxa5vD8tM7BW+sccrvQLjtz45m78k1JKPpMUNbAwQcaJKnkkOS+O5tfbx8p3X8Jp9y037VugUfKjUzvTxoIfwIDLqSZTe7MQHat8be63nWwI8dXflhqJytSpHNLqoxZtUmw9SLNzWc5bt9Fjig+LY9klUrB6knsOR/mZbfBa7W6mgSQ7bRP+/vLvuzKDrBuZvtIR5ZD2jP8pC9Tsa5suoTklQkKTjKk+Axjik9JXPFJmbjzzxy6tkqyVswSNgyy6Lax/ZJqGz/eiERqhG9GXbIvb75h97qX+MqNRb5snRcgX77wC9mcMpzO11ZywJpjElNYwdjCShldUs34jUclJnMLz/whRuj2EboMdv5L9+Qv0/HIjjXn/nOWSVe63XItcEhbhh//OtxHJgyaLHhii2DCNgYuOcSw1VUSu/44E9YdlKi8cr6UtYSs9xHpVMJbil3XVV/eYp2IpdF6ZuNsO39IsVmu+Q5pfs0h30QZrHoqROY+M5WJz78lqwqnyandTknPXSbRuZ8zJGOXvJk9m7xqE891ZdGl2fqddo1xGjGYEogx5yeafe0zDban2cWdGyzfJxlsnqLFswDkGsjtVabsT3+UqfPSZPAb22hO/kg2vj+KbNLS12B4eclg3T6jBrD59Ac58OBIXdvygsHmZMN7M38AO389UK6lRnB70mhZGPW0PB75KjFhPTFjGwNeLJCNHyTwzgmHeM4ZvHvO9PQdMrk3Xxfdj16SwsowtfZ8vGbTVNPTnu7gj0WhcuezYawtSJCc55+UCaNncOTjs2TGc89I5dYwshJyt0yx5yvD8uw2eHWT2RU1FHHPPon/KGxnmLpyfoTB+kmmx7XQj53vhcjdzSHCTQ+z9+MgdpUGiXe/KTwM6Ss32XPAZt1abfd2fmjj+l/ptQ+eg8Ifo5X+JEJhfKCa+kUYeo8MBKsfM7xnxxpyJdUu13N8pOVtU9pyTLres0lHsY+4P3FYrtft7Mizccdbxj4A9vt3qfuNLyrF0QoTg9Xs30ag+dBAcH8AuMcBqzwcVlWssqoilXUqHNblkZAbyYrNyw1vSYYuAeDXzxg2RKvQwHtAfY/MiQ/whp60KFQdLR2m+sp/qXk0RvGEU7EmSbN2isEzaZql83RT0nC9BlBDdsyH4YxQauUsjRFh+D+Z/gqxSuunAf0KgLVjg9WutBhVkRmvqxcn6uPTnfrA4AD1GwBLAT030E8/B+CRB1f9V/1TsuO+CQGAY6w//JVp+AMIAhACYNCDGgCooPGPGkHRIejf2+w2KNv/wP4NRQ7SPe8d3F4AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/d810ccf3e642e0f074a024f1bbcb6aaf/992e6/firefox.webp 128w&quot;
              sizes=&quot;(max-width: 128px) 100vw, 128px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/d810ccf3e642e0f074a024f1bbcb6aaf/750d2/firefox.png 128w&quot;
            sizes=&quot;(max-width: 128px) 100vw, 128px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/d810ccf3e642e0f074a024f1bbcb6aaf/750d2/firefox.png&quot;
            alt=&quot;Firefox&quot;
            title=&quot;Firefox&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The number of development tools in Firefox makes it the single, indisputably
best browser for web development. This is not to say it is the best at
rendering, or fastest browser (both of which are Opera 10.5 beta at the time of
this writing), but it is close enough and will make your job easier.&lt;/p&gt;
&lt;h4 id=&quot;html-validator&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#html-validator&quot; aria-label=&quot;html validator permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;HTML Validator&lt;/h4&gt;
&lt;p&gt;If you’re on a PC this instant validation cue on the bottom right of the browser
is incredibly helpful. Just make sure it’s always green. Double click it to see
the errors if it isn’t. If you’re on a Mac, you can use the shortcut provided in
the Web Developer extension for quick validation.&lt;/p&gt;
&lt;h4 id=&quot;web-developer&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#web-developer&quot; aria-label=&quot;web developer permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Web Developer&lt;/h4&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 402px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/60984601abae693b915dfe2397f3ee01/0ec92/webdeveloper.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 73.64864864864865%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAIAAABr+ngCAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB90lEQVQoz5WS3W6bMBzF/Za76cV2OalSumbhIyQNhhXIku4l9gTVpGmt0qQkxUAy6EjzTcBAEmyiPsREaatdZar009HxsWT/bR1gfn+3ujwKfxyRmw9vo/Me6Ncl/ark3FVIAN9AKJFlHRi/jgdXJfwgZIFI/Abxz2iu/2MtkrkAHJvVb8pDi48C2R3yI4vz7mt0q5GNeoitRrAMej+Ph/3TYCL4Y2FiV8KJsPIEgqV8sANgmazOAOqeWv3yelqPlg3HZB5+81OH34Uyib4cIj4naxE4iNE7JyODiVbivc26Fhf7MN87TKKQAAKjUxrq5T8ms/PhHks0hDSE6VokhwkgWdSA4wrzheSNG57X8MaN6Uxy3fpkJqW0TQ6QXZCNCmyT7XbLvdvydAYpbVHSSndNSltZ1s6ydmFetSCjrWx/QRIFjL2aafO2Vd1tv8axFida8kQcqzhU4kSLIjWJNYyVZJOHce7VMFLTRAFDmxsM2EG/YtlVdMeYFm+anGGwCOUhMlhdZyzE3vY+I8QhxN71GduuzhbyLlbAyOJMk7NHgr8+Lw5OEi3Eaj7CpomxEj1d9aIqxmqyae4fv+Vvtnqfri8/zl3+MZZpAIvfzsJXI2WhRHNghguFNIBpAPNuo+6Ja1SSpUhCKQ2eC/SveeYlLJZFw/4CQFaWGpFrBd0AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/60984601abae693b915dfe2397f3ee01/cbe2e/webdeveloper.webp 148w,
/static/60984601abae693b915dfe2397f3ee01/3084c/webdeveloper.webp 295w,
/static/60984601abae693b915dfe2397f3ee01/56632/webdeveloper.webp 402w&quot;
              sizes=&quot;(max-width: 402px) 100vw, 402px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/60984601abae693b915dfe2397f3ee01/12f09/webdeveloper.png 148w,
/static/60984601abae693b915dfe2397f3ee01/e4a3f/webdeveloper.png 295w,
/static/60984601abae693b915dfe2397f3ee01/0ec92/webdeveloper.png 402w&quot;
            sizes=&quot;(max-width: 402px) 100vw, 402px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/60984601abae693b915dfe2397f3ee01/0ec92/webdeveloper.png&quot;
            alt=&quot;Element information from Web Developer&quot;
            title=&quot;Element information from Web Developer&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The designer and framework you’re using and should have covered most things this
extension would be used to debug, but there are a few things left that it can
help with.&lt;/p&gt;
&lt;p&gt;One thing I do is test visited link status by going to Miscellaneous -&gt; Visited
Links to test the style of visited links.
I also do a Forms -&gt; Populate Form Fields to test form field fonts.&lt;/p&gt;
&lt;p&gt;Again, you can access a quick shortcut to HTML validation with this extension.
Use it for both regular and generated source validation. Validate your CSS as
well!&lt;/p&gt;
&lt;p&gt;Finally, Ctrl+(Macs: Command)+Shift+F will is a quick and lightweight
alternative to Firebug for finding out computed styles. Just hover over your
element. Press the keys again to finish.&lt;/p&gt;
&lt;h4 id=&quot;computed-sizes-with-firebug&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#computed-sizes-with-firebug&quot; aria-label=&quot;computed sizes with firebug permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Computed Sizes with Firebug&lt;/h4&gt;
&lt;p&gt;As I mentioned before in the Photoshop Slicing section, sometimes I’ll slice
the document and have Photoshop generate HTML for me. I then open the generated
document in Firefox and use &lt;a href=&quot;http://getfirebug.com/&quot;&gt;Firebug&lt;/a&gt; to get the
computed sizes for block level elements.&lt;/p&gt;
&lt;h4 id=&quot;in-place-css-editing-with-firebug-and-the-arrow-keys&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#in-place-css-editing-with-firebug-and-the-arrow-keys&quot; aria-label=&quot;in place css editing with firebug and the arrow keys permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;In Place CSS Editing with Firebug and the Arrow Keys&lt;/h4&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 424px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/d04a8511ba9d6474fefb83e32f8a23e2/1cfa9/firebug_css.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAIAAABr+ngCAAAACXBIWXMAAAsTAAALEwEAmpwYAAACeUlEQVQoz22S226cMBCGef+36FWv2tuqqtJUbapEDdlsAgsLy8EYYwPmYJvlsBzsCppWadVf/8VoNJ9nRmMtTVNKc0JImqbZJowTlCQEJx7ENRdNI7gQnK8WoinLyr+5AddXlv6omYap6w+O61oHa7/qyXGc/X5/tO1n07QsG0YxhBBjmCBICIxj4Oi37t3N4/1OAwAcTIvS0nVPhmEEQQjj2HFdz/NOp9WU5kmSGUbqutnTU2YYmWVXQVQfHE9r27aqS1zgJMVHy86yzHXcKIKCi7brpVRKqXlWZaHOZ1WVijFVl6o9q+eDrQkh+qGrmnqcJhjBCERhEPp+IDdOblqkHCc5jbJrZd/Ly7DGd/c7jTGGEAIxZJzlRZ7RjIs6Qdh147Js1fbEOKoYSkIkCBeSSghkWaiHvaH1/cDb+oidMAdRHuU8j5Pc9ysAGOf9smxz/08AJhrn/HIZur6b5+kyXsZpHIel76bX2LKsC3ed4lxxoYRQw6AiRDTGGSEkRglvBMlSSmkziEVOfTe157Hrpr6fWD363lwUCgAZI4kiWZYb3PcDO1cmNL00sBMb14kfE0QKzoe66jkb2OpuHMd/xn6Ba1EdgIULfAIAZzkIKhRXw3B5Xbosf1nJ33DJqH7aBzgkuA4Dah2SlFRtN/w51a+zbZKbV3rbmfF5WWa5jPP00mQrllLOa4uXT1KUqmlUTlVRq7pSbasAIlqKEMWkynOCUEUpisLQO5VrAFAUTePUcspoDgJB0j70WHzMXBNimEUQaac4d+PMhat9XH6+2+0s30+KNQnI/aP5/u2b79+ub/XdF93Ud7vbDx+vPr27+/H14QB+AlGlO8oOMclDAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/d04a8511ba9d6474fefb83e32f8a23e2/cbe2e/firebug_css.webp 148w,
/static/d04a8511ba9d6474fefb83e32f8a23e2/3084c/firebug_css.webp 295w,
/static/d04a8511ba9d6474fefb83e32f8a23e2/96b95/firebug_css.webp 424w&quot;
              sizes=&quot;(max-width: 424px) 100vw, 424px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/d04a8511ba9d6474fefb83e32f8a23e2/12f09/firebug_css.png 148w,
/static/d04a8511ba9d6474fefb83e32f8a23e2/e4a3f/firebug_css.png 295w,
/static/d04a8511ba9d6474fefb83e32f8a23e2/1cfa9/firebug_css.png 424w&quot;
            sizes=&quot;(max-width: 424px) 100vw, 424px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/d04a8511ba9d6474fefb83e32f8a23e2/1cfa9/firebug_css.png&quot;
            alt=&quot;Editing CSS in place with Firebug&quot;
            title=&quot;Editing CSS in place with Firebug&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;One of the best things about Firebug is the ability to edit CSS in place. From
either the HTML or CSS tab, you can add and edit rules and properties by
clicking on them. If you put the cursor on a numeric property you can use the up
and down arrow keys to increment and decrement the value (tip: use Shift+Arrow
to increment by 10). In this way, you can move and resize block elements and
change margins and paddings. Don’t forget to copy the final value into your CSS
document.&lt;/p&gt;
&lt;h4 id=&quot;pixel-perfect-and-inverted-overlays&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#pixel-perfect-and-inverted-overlays&quot; aria-label=&quot;pixel perfect and inverted overlays permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Pixel Perfect and Inverted Overlays&lt;/h4&gt;
&lt;p&gt;Firebug is much more useful with Pixel Perfect. This extension lets you place
elements on the browser screen and adjust their position and opacity. Drag the
overlaid image to reposition it. Use the panel to hide or adjust opacity.
I usually add a flattened version of the design and an inverted color flattened
version. With the inverted version, set the opacity to 0.5. If your block level
elements are in the correct place, the screen should turn gray. Anything that
doesn’t match up to the PSD exactly will be in color (this works similar to the
Photoshop “Difference” blending mode). You can use this with the Firebug
technique described earlier to quickly get everything in the exact pixel
location.&lt;/p&gt;
&lt;p&gt;Here’s an example of the inverted overlay on top of this post, one pixel off:
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 465px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/c5c755ee5d0690257790cccaa9cd65ae/9ff85/overlay_off-465x400.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 85.8108108108108%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAIAAABSJhvpAAAACXBIWXMAAAsTAAALEwEAmpwYAAACoklEQVQ4y4WQ204aURSG51m1MoKAWBOhszcv0FRkAMEXQY3QCxW1vWjiAcU5z+zDDHOe2YP3zUBrmtbY5MvOysr/7/WvxR0Jhb8YCLy4xx8BvgdKbbjdbtY6oNKBlTasiqAyEPiljD8SeO5Nc6fOd2FlH+7sN3dbzY8tWGvB2j7c+dLcbcPaAawdNHcO4M6b5kJnr9CF5RbYboOqCKr5fFhrg2oHlkW46uTNt83iXl70hGIXlrtgqwPKh0LxH+XGe+a8Bnn+nlAagM2V4VV2CIrvmzf6oNiDla5Q7AmlvlDsC5sDodADW32B3wfb/zcfwrIolNugmkcApS7YEpvbfWGzBapcv7Her68tWV9xWF872F3Va71GoSOUxAbfapS6Db5b3+jUC+KnUq/+4XOjzF2Ohlfjk+uvJ5PRcDI+XnFxNpyMhpdnw4uz4fn49GJ0MhmfTEbHv1hqzsdnnGrRmWpKGlJ1rFm2btmqiRUD6xZFdC7rWNaQRV1Js3REZQMRJ8BOQHJ87m4qPcuGoiNMPURdTF1EXITnmkEUDc0UQzUwsX1E8s6zbFrIoY6/glM1U1bNxWKRpuyVMIpVzbAQsRCZu16aMsYWhDiSYjiOG4SRH4RBEHHPsnVxfWvbc0woJo7nBVEc+0E4k1TTIlGUMJYlScpYpmnG/fTxYfr08Pj04/Zu+jjjHp/U09F1FEUIE0Idzw+iKPb9UJL1maRKsup5PmMZYxnCVJI1TdcN01KWuTjXDS1kp2kahnEcJ3GcpCmLokQ3iaqjIIxeJ1sIz55ljCnNY9qEOlyWZS8vL8utsuWb75wkaRCEvh8mSbK6AmMMU0+3HM20FY1qBnU9n0sSliTsz2v9Vmer75Z/sUWWPen25dX3b9c3N7fSzb0yVdBP4gTFfhC66NQAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/c5c755ee5d0690257790cccaa9cd65ae/cbe2e/overlay_off-465x400.webp 148w,
/static/c5c755ee5d0690257790cccaa9cd65ae/3084c/overlay_off-465x400.webp 295w,
/static/c5c755ee5d0690257790cccaa9cd65ae/51ce3/overlay_off-465x400.webp 465w&quot;
              sizes=&quot;(max-width: 465px) 100vw, 465px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/c5c755ee5d0690257790cccaa9cd65ae/12f09/overlay_off-465x400.png 148w,
/static/c5c755ee5d0690257790cccaa9cd65ae/e4a3f/overlay_off-465x400.png 295w,
/static/c5c755ee5d0690257790cccaa9cd65ae/9ff85/overlay_off-465x400.png 465w&quot;
            sizes=&quot;(max-width: 465px) 100vw, 465px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/c5c755ee5d0690257790cccaa9cd65ae/9ff85/overlay_off-465x400.png&quot;
            alt=&quot;Pixel Perfect inverted overlay, 1px off&quot;
            title=&quot;Pixel Perfect inverted overlay, 1px off&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;And here is the same overlay when the elements are in the exact positions (I
shifted the overlay, but for designing you should shift the elements):&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 465px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/2ab78cd4f4a42ad2046ab083a824adf7/9ff85/overlay_on-465x400.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 85.8108108108108%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAIAAABSJhvpAAAACXBIWXMAAAsTAAALEwEAmpwYAAABj0lEQVQ4y+2Py27bMBBF+emFkZ8qallxgTb2pkkTyTbFl/gURVLiQ8m+kB20i+6y6KoXB4MLzAzmDrjb3H0Y8H/5Xy5vPm0+DKiqelfv6/v9tqqr3f07Vb1d2W2ralvtqvdWfTV/xgAXEiGECWF9L4TkUjLOWd9zIbVWhDJMqNaGUMqlJJTacbTOXfHgpUUQMUyFtk4bpwanjJNmZFxhJiHmtNfaBmVGynWHe6HHwU3DuAIIIRjhZVlSSjmnnHNOaZpnjCkXknNh7ZhzLqUopbsOD4MNYfI++DABDNHx22EYrFJaaeOcjzFOIUAIOecxzqWUlFIphRD686VtmlPTnn48PjftBVza8/7zlylGKZUyxvkwxxiC77ruAiGE2DlfrhJSwQ4TyljPMV1zATc6xWXOZZrnGFOMMecS55kyhjAJIfy+zIU8nS9CKGMGpdeYYFmW17e321fXevs6heC99zHFfFUpRWpLe0WZQoQTJu3owDqYUv5Lt6g3n1J+XcqZqq/fjw+H48MTPDx3Dep/AZOd0RcU+4RiAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/2ab78cd4f4a42ad2046ab083a824adf7/cbe2e/overlay_on-465x400.webp 148w,
/static/2ab78cd4f4a42ad2046ab083a824adf7/3084c/overlay_on-465x400.webp 295w,
/static/2ab78cd4f4a42ad2046ab083a824adf7/51ce3/overlay_on-465x400.webp 465w&quot;
              sizes=&quot;(max-width: 465px) 100vw, 465px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/2ab78cd4f4a42ad2046ab083a824adf7/12f09/overlay_on-465x400.png 148w,
/static/2ab78cd4f4a42ad2046ab083a824adf7/e4a3f/overlay_on-465x400.png 295w,
/static/2ab78cd4f4a42ad2046ab083a824adf7/9ff85/overlay_on-465x400.png 465w&quot;
            sizes=&quot;(max-width: 465px) 100vw, 465px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/2ab78cd4f4a42ad2046ab083a824adf7/9ff85/overlay_on-465x400.png&quot;
            alt=&quot;Pixel Perfect inverted overlay, correct position&quot;
            title=&quot;Pixel Perfect inverted overlay, correct position&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Using Firefox and Firebug to do your design, you’re just moving blocks around
with the arrow keys. It’s WYSIWYG editing without the pitfalls!&lt;/p&gt;
&lt;h3 id=&quot;closing&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#closing&quot; aria-label=&quot;closing permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Closing&lt;/h3&gt;
&lt;p&gt;I’m not a fan of those rapid PSD to HTML shops only because I am wary of the
quality of work they produce. I’m sure there are a few good ones, but I still
prefer to do it myself. If you’ve got any tips or tricks of your own, leave me
a comment!&lt;/p&gt;
&lt;h3 id=&quot;references&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#references&quot; aria-label=&quot;references permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;References&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://getfirebug.com/&quot;&gt;Firebug&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pixel Perfect Firefox Extension&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://morris-photographics.com/photoshop/tutorials/actions.html&quot;&gt;Using Actions to Automate Tasks in Photoshop&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;style class=&quot;grvsc-styles&quot;&gt;
  .grvsc-container {
    overflow: auto;
    position: relative;
    -webkit-overflow-scrolling: touch;
    padding-top: 1rem;
    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));
    padding-bottom: 1rem;
    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));
    border-radius: 8px;
    border-radius: var(--grvsc-border-radius, 8px);
    font-feature-settings: normal;
    line-height: 1.4;
  }
  
  .grvsc-code {
    display: table;
  }
  
  .grvsc-line {
    display: table-row;
    box-sizing: border-box;
    width: 100%;
    position: relative;
  }
  
  .grvsc-line &gt; * {
    position: relative;
  }
  
  .grvsc-gutter-pad {
    display: table-cell;
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  .grvsc-gutter {
    display: table-cell;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter::before {
    content: attr(data-content);
  }
  
  .grvsc-source {
    display: table-cell;
    padding-left: 1.5rem;
    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));
    padding-right: 1.5rem;
    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));
  }
  
  .grvsc-source:empty::after {
    content: &apos; &apos;;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter + .grvsc-source {
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  /* Line transformer styles */
  
  .grvsc-has-line-highlighting &gt; .grvsc-code &gt; .grvsc-line::before {
    content: &apos; &apos;;
    position: absolute;
    width: 100%;
  }
  
  .grvsc-line-diff-add::before {
    background-color: var(--grvsc-line-diff-add-background-color, rgba(0, 255, 60, 0.2));
  }
  
  .grvsc-line-diff-del::before {
    background-color: var(--grvsc-line-diff-del-background-color, rgba(255, 0, 20, 0.2));
  }
  
  .grvsc-line-number {
    padding: 0 2px;
    text-align: right;
    opacity: 0.7;
  }
  
&lt;/style&gt;</content:encoded></item><item><title><![CDATA[jQRPG — An Old-School Style RPG in jQuery]]></title><description><![CDATA[JavaScript/jQuery and CSS
compatibility is finally at a decent state amongst major browsers (IE and ACID3
notwithstanding). At least…]]></description><link>https://www.davidosomething.com/jqrpg-an-old-school-style-rpg-in-jquery/</link><guid isPermaLink="false">https://www.davidosomething.com/jqrpg-an-old-school-style-rpg-in-jquery/</guid><pubDate>Fri, 19 Feb 2010 13:55:19 GMT</pubDate><content:encoded>&lt;p&gt;JavaScript/&lt;a href=&quot;http://docs.jquery.com/Browser_Compatibility&quot;&gt;jQuery&lt;/a&gt; and CSS
compatibility is finally at a decent state amongst major browsers (IE and ACID3
notwithstanding). At least, similar/the same DOM manipulation behavior can be
reproduced across those browsers. Not only that, but the JavaScript rendering
speed of engines other than Trident (IE’s) is &lt;a href=&quot;http://lifehacker.com/5457242/browser-speed-tests-firefox-36-chrome-4-opera-105-and-extensions&quot;&gt;quite
fast&lt;/a&gt;.
With these developments, it is actually possible to
&lt;a href=&quot;http://gamequery.onaluf.org/&quot;&gt;create&lt;/a&gt;
&lt;a href=&quot;http://jonraasch.com/blog/jquery-video-game-remake-tc-surf-designs&quot;&gt;playable&lt;/a&gt;
games (really, check those links out!).&lt;/p&gt;
&lt;h3 id=&quot;the-demo&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-demo&quot; aria-label=&quot;the demo permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Demo&lt;/h3&gt;
&lt;p&gt;In about 4 hours I’ve created a demo RPG here using jQuery, JavaScript, CSS, and
the &lt;a href=&quot;http://code.google.com/p/js-hotkeys/&quot;&gt;Javascript jQuery Hotkeys Plugin&lt;/a&gt;.
I’m surprised no one has created a complete, working one yet, as tile-based RPGs
are much easier to make than action games with collision detection.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 370px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/c0047d1936baec8a62c906adc0522494/1efb2/jqrpg.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 104.05405405405406%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAVCAIAAADJt1n/AAAACXBIWXMAAAsTAAALEwEAmpwYAAACcElEQVQ4y42Ta2/SUByHeaNcTruyWGWdpXp+h23AKPTGNjqYg7UFY6IvfDNY8Rua+BmcF8ZYNnVxmhjf+T0Mh1KzjJn98qQ5SfOc/6Vp4vLXn9OTT+PPxz+vvn45Pzk/G02ZjM7GHyej44uLsx+T0e93b89PP0zG779/G19dnsYk3gyHw3Aw5agfHvVnzzAcROewHw4Oh4PDcNA/GhwOw/6cqZIoR9nkqXAW5t+rcjki4fAYhqFPU6lW9eqi6FU9xjBqjmM7jp2weCRJIiQpisvp5FI6lZ6STEe5z8+cTDKTvJcURdE0TcuyErZtGYYpSUKr+aTd3kPFLhQpioCOKDpQiWA60zY0IpBarWbbvDKXxYar1gPku1QzwOpAD6gDBrAL+BGsx7RnGpGuy1lJ3HJVzSu0XtHeC6q6YD7gcnMT6AIB4IH5TGstkrddlfrMeU7dl1TzwDygDOwAG/POd8G6N2TTMJckEa5aCJjWgXbA297klTtAA2hyv87bvimLkvjYVVnAmIeCD+xzYXZweNsdoA0W3CKrXIY3nS3eENq8vsdn9hfNvECOr9jnO/eBvSl3qxzLbb7wgE/euGVhi+WAT17mtwSgAajP1IVy3s2v9dYKPrsmt/hH6oLuwGyg1WV2SxNvysrWitJUVndX6QGN8ChtUbpGaZFSk67vU91Ho5nPLgnVWLZMiwhEM552Xne2e1uPSrJcnLMhywVZhiyvy3JJlksPZbZMRGLUjLlsWal0SivRpt8s2UVRIelcJhOzEkFyGWGFpB4kU5nUNVlRFEEgaZIRBLL832Sz2VwuF/2SM9lxnLpTrzt3zcz6CxlP8zkLDY6XAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/c0047d1936baec8a62c906adc0522494/cbe2e/jqrpg.webp 148w,
/static/c0047d1936baec8a62c906adc0522494/3084c/jqrpg.webp 295w,
/static/c0047d1936baec8a62c906adc0522494/9e982/jqrpg.webp 370w&quot;
              sizes=&quot;(max-width: 370px) 100vw, 370px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/c0047d1936baec8a62c906adc0522494/12f09/jqrpg.png 148w,
/static/c0047d1936baec8a62c906adc0522494/e4a3f/jqrpg.png 295w,
/static/c0047d1936baec8a62c906adc0522494/1efb2/jqrpg.png 370w&quot;
            sizes=&quot;(max-width: 370px) 100vw, 370px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/c0047d1936baec8a62c906adc0522494/1efb2/jqrpg.png&quot;
            alt=&quot;jQRPG Screenshot&quot;
            title=&quot;jQRPG Screenshot&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;If anyone is interested, I might continue building this, adding in turn-based
menu battles (oh boy!), a shop system, and AJAX saving and loading with an HTML5
backend. &lt;strong&gt;Leave a comment!&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;outro&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#outro&quot; aria-label=&quot;outro permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Outro&lt;/h3&gt;
&lt;p&gt;Not that I’m against Flash (looking at you, Apple), but JavaScript is much
easier to learn and there is much potential in using it for things other than
special effects and Web Applications. We’ve already recreated all the basic
elements used in the Nintendo games of yore using CSS and jQuery; e.g., sprite
animation (with many techniques) and
&lt;a href=&quot;http://stephband.info/jparallax/&quot;&gt;parallax&lt;/a&gt;
&lt;a href=&quot;http://dev.jonraasch.com/scrolling-parallax/examples/scrolling-parallax&quot;&gt;scrolling&lt;/a&gt;.
Combined with the super fance sliding, fading, easing, and opacity animations we
are already afforded, the browser is a feature rich playground for game
developers. Hopefully we’ll see more techniques emerge, and with them more
games. I am looking forward to jQuery being the new QBASIC.&lt;/p&gt;
&lt;h3 id=&quot;references&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#references&quot; aria-label=&quot;references permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;References&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://docs.jquery.com/Browser_Compatibility&quot;&gt;jQuery Browser Compatibility&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Acid Browser Tests&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://gamequery.onaluf.org/&quot;&gt;gameQuery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://jonraasch.com/blog/jquery-video-game-remake-tc-surf-designs&quot;&gt;jQuery Video Game Remake: T&amp;#x26;C Surf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/js-hotkeys/&quot;&gt;Javascript jQuery Hotkeys Plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;JQuery Sprite Animation Plugin&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://stephband.info/jparallax/&quot;&gt;jParallax&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://dev.jonraasch.com/scrolling-parallax/examples/scrolling-parallax&quot;&gt;Scrolling Parallax jQuery Plugin&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;style class=&quot;grvsc-styles&quot;&gt;
  .grvsc-container {
    overflow: auto;
    position: relative;
    -webkit-overflow-scrolling: touch;
    padding-top: 1rem;
    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));
    padding-bottom: 1rem;
    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));
    border-radius: 8px;
    border-radius: var(--grvsc-border-radius, 8px);
    font-feature-settings: normal;
    line-height: 1.4;
  }
  
  .grvsc-code {
    display: table;
  }
  
  .grvsc-line {
    display: table-row;
    box-sizing: border-box;
    width: 100%;
    position: relative;
  }
  
  .grvsc-line &gt; * {
    position: relative;
  }
  
  .grvsc-gutter-pad {
    display: table-cell;
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  .grvsc-gutter {
    display: table-cell;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter::before {
    content: attr(data-content);
  }
  
  .grvsc-source {
    display: table-cell;
    padding-left: 1.5rem;
    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));
    padding-right: 1.5rem;
    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));
  }
  
  .grvsc-source:empty::after {
    content: &apos; &apos;;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter + .grvsc-source {
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  /* Line transformer styles */
  
  .grvsc-has-line-highlighting &gt; .grvsc-code &gt; .grvsc-line::before {
    content: &apos; &apos;;
    position: absolute;
    width: 100%;
  }
  
  .grvsc-line-diff-add::before {
    background-color: var(--grvsc-line-diff-add-background-color, rgba(0, 255, 60, 0.2));
  }
  
  .grvsc-line-diff-del::before {
    background-color: var(--grvsc-line-diff-del-background-color, rgba(255, 0, 20, 0.2));
  }
  
  .grvsc-line-number {
    padding: 0 2px;
    text-align: right;
    opacity: 0.7;
  }
  
&lt;/style&gt;</content:encoded></item><item><title><![CDATA[Understanding @font-face and Typography]]></title><description><![CDATA[davidosomething.com currently uses the @font-face CSS rule to load and define
fonts. The key point is that fonts, and not typefaces, are…]]></description><link>https://www.davidosomething.com/understanding-font-face-and-typography/</link><guid isPermaLink="false">https://www.davidosomething.com/understanding-font-face-and-typography/</guid><pubDate>Thu, 04 Feb 2010 12:58:10 GMT</pubDate><content:encoded>&lt;p&gt;davidosomething.com currently uses the @font-face CSS rule to load and define
&lt;strong&gt;fonts&lt;/strong&gt;. The key point is that fonts, and not typefaces, are defined. A font
is “any variant in a typeface’s size and style” (&lt;cite&gt;&lt;a href=&quot;http://jontangerine.com/log/2008/08/typeface--font&quot;&gt;Jon
Tan&lt;/a&gt;&lt;/cite&gt;).&lt;/p&gt;
&lt;p&gt;A key element missing from many @font-face resources online (e.g., tutorials,
and CSS generators like &lt;a href=&quot;http://www.fontsquirrel.com/&quot;&gt;Font Squirrel&lt;/a&gt;) is the
definition of weight and style in the @font-face rule. These two properties are
vital when you want to properly use a typeface. Many professional typefaces come
in multiple files, splitting a typeface into bold, light, italics, oblique, and
combinations of those. The font Aurulent used on davidosomething.com is one
example, coming in four styles:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 454px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/ff028d985cad97708d451a498b9b4e1b/b3c1d/aurulent.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 58.10810810810811%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB30lEQVQoz43Ry7KiMBAGYN7/gVychRbi3UEIqJDAcFFAQAJCkISMcKaEGbczX2Xxd1cWXd2C53lhGEZhFEVREARhGCZx7HkeqevvfxGqsiSElIOiKKqqIoRkGW4o5Zz/GlBKGWNjoJQ2TcMY67pOUFXVQmi/3yOETqeTqqoQIl3Xfwwcx0EIiaKoqqpt26vVSpZlAICu64fDQcAY53mOh1eWZZreizxvW962bdd1/V+fUcfc933btkIcxxjj2+2WJMmYsyy7XC5Zlj0eD9/3HcdJkiQIAt/34zj2fT+Kouv1GgSBoGkahFDTdNv+aZrm8Xh0HQdCOH7Vdd0wjOv16rru+Xx2Xde2bU3TrIHAGOOcv/fB/+yj5fz7/wiKopzP5+12CwCAEAIAVEUxDGM+n2+3W0VRJEn6+vo6Ho+yLI/NzWaz2+2Wy6WAEEIQGoZhWZbnuqZpIoSqqkrTNM9zQkgcx2maFkXx3ivGY34+n6ZpCjUhjLGqqpqmeT5rMpSc86Zp6gGl9PV6McYIIXVdM8YopWVZcs4FURR3u910Ol2tVgAASZpLkgQAmM1m84EkSZZlybI8mUwWi4Usy+v1WhTF99h4PE6W4SzLcYExvt/vj7Icj/nRDfq+f71en+ZvmSCKD7ue2FkAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/ff028d985cad97708d451a498b9b4e1b/cbe2e/aurulent.webp 148w,
/static/ff028d985cad97708d451a498b9b4e1b/3084c/aurulent.webp 295w,
/static/ff028d985cad97708d451a498b9b4e1b/44d9f/aurulent.webp 454w&quot;
              sizes=&quot;(max-width: 454px) 100vw, 454px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/ff028d985cad97708d451a498b9b4e1b/12f09/aurulent.png 148w,
/static/ff028d985cad97708d451a498b9b4e1b/e4a3f/aurulent.png 295w,
/static/ff028d985cad97708d451a498b9b4e1b/b3c1d/aurulent.png 454w&quot;
            sizes=&quot;(max-width: 454px) 100vw, 454px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/ff028d985cad97708d451a498b9b4e1b/b3c1d/aurulent.png&quot;
            alt=&quot;Aurulent Sans Typeface&quot;
            title=&quot;Aurulent Sans Typeface&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.fontsquirrel.com/fonts/Aurulent-Sans&quot;&gt;Aurulent Sans on Font Squirrel&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;h3 id=&quot;a-demonstration-of-the-problem&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#a-demonstration-of-the-problem&quot; aria-label=&quot;a demonstration of the problem permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;A Demonstration of the Problem&lt;/h3&gt;
&lt;p&gt;Let’s take a look at what happens when you use this very typical CSS rule:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;css&quot; data-index=&quot;0&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk6&quot;&gt;strong&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;font-weight&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk7&quot;&gt;700&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;; }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;with this HTML sample:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;html&quot; data-index=&quot;1&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk17&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;mtk4&quot;&gt;strong&lt;/span&gt;&lt;span class=&quot;mtk17&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;Hello world!&lt;/span&gt;&lt;span class=&quot;mtk17&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;mtk4&quot;&gt;strong&lt;/span&gt;&lt;span class=&quot;mtk17&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The CSS generated by Font Squirrel for Aurulent Sans (not to pick on them, others may do the same) looks like this:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;css&quot; data-index=&quot;2&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk3&quot;&gt;/*&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk3&quot;&gt; * This CSS file has been generated by fontsquirrel.com and is based on the work of Paul Irish.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk3&quot;&gt; *&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk3&quot;&gt; */&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk3&quot;&gt;/*&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk3&quot;&gt; *&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk3&quot;&gt; * The fonts included are copyrighted by the vendor listed below.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk3&quot;&gt; *&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk3&quot;&gt; * @vendor:     Stephen G. Hartke&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk3&quot;&gt; * @licenseurl: http://www.fontsquirrel.com/license/Aurulent-Sans&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk3&quot;&gt; *&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk3&quot;&gt; *&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk3&quot;&gt; */&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk15&quot;&gt;@font-face&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;AurulentSansRegular&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;AurulentSans-Regular.eot&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;local&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;Aurulent Sans Regular&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;), &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;local&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;AurulentSans-Regular&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;), &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;AurulentSans-Regular.ttf&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;truetype&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk15&quot;&gt;@font-face&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;AurulentSansItalic&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;AurulentSans-Italic.eot&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;local&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;Aurulent Sans Italic&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;), &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;local&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;AurulentSans-Italic&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;), &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;AurulentSans-Italic.ttf&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;truetype&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk15&quot;&gt;@font-face&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;AurulentSansBold&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;AurulentSans-Bold.eot&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;local&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;Aurulent Sans Bold&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;), &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;local&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;AurulentSans-Bold&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;), &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;AurulentSans-Bold.ttf&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;truetype&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk15&quot;&gt;@font-face&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;AurulentSansBoldItalic&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;AurulentSans-BoldItalic.eot&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;local&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;Aurulent Sans BoldItalic&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;), &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;local&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;AurulentSans-BoldItalic&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;), &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;AurulentSans-BoldItalic.ttf&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;truetype&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Properly defined, though, it should really look like this:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;css&quot; data-index=&quot;3&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk15&quot;&gt;@font-face&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;Aurulent Sans&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk3&quot;&gt;/* font-style/font-weight are normal/normal (400) when not specified */&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;AurulentSans-Regular.eot&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;local&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;Aurulent Sans Regular&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;), &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;local&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;AurulentSans-Regular&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;), &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;AurulentSans-Regular.ttf&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;truetype&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk15&quot;&gt;@font-face&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;Aurulent Sans&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;font-style&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;italic&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;; &lt;/span&gt;&lt;span class=&quot;mtk3&quot;&gt;/* not oblique! */&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;AurulentSans-Italic.eot&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;local&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;Aurulent Sans Italic&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;), &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;local&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;AurulentSans-Italic&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;), &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;AurulentSans-Italic.ttf&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;truetype&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk15&quot;&gt;@font-face&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;Aurulent Sans&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;font-weight&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;bold&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;; &lt;/span&gt;&lt;span class=&quot;mtk3&quot;&gt;/* or 700, but for semantics sake */&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;AurulentSans-Bold.eot&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;local&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;Aurulent Sans Bold&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;), &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;local&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;AurulentSans-Bold&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;), &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;AurulentSans-Bold.ttf&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;truetype&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk15&quot;&gt;@font-face&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;Aurulent Sans&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;font-style&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;italic&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;font-weight&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;bold&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;AurulentSans-BoldItalic.eot&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;local&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;Aurulent Sans BoldItalic&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;), &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;local&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;AurulentSans-BoldItalic&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;), &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;AurulentSans-BoldItalic.ttf&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;truetype&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In some browsers, such as Google Chrome 4 and 5.0beta (and probably other WebKit
browsers but I am too lazy to test), the normal weight is used.&lt;/p&gt;
&lt;p&gt;Mozilla Firefox 3.6 does a thing called faux bold, which uses math (devil’s
magic!) to stretch the font and make it appear bold. The result is the top
sample, while the true bold Aurulent Sans is on the bottom:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 145px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/e427fae5c64208f0825d1e78b78074a1/0af15/aurulent_bold.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 65.51724137931035%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsTAAALEwEAmpwYAAABwUlEQVQoz41SW08aQRjd32bSB/9E00rrU60BCcHalPDSAooRtamJj7WatDFNo6EVjImJLDGYXUBYXUAxVVuLQAvshZndb6bZHQgYaOPJPMzMdz0nh6NdEBsAwO4AQCgBME3TBAATgCXQPnB0ABgbVuEA7CZWm14xsUeV5PzW1pev32LHmfRiZGHz87ZcLP2uVxM8n+R5QcwIR4cfP23GYzvLi0vl6wrbjmN7iil+fWPtpXd6ZWV1LhzyuKcjy++uLi9GH4w8fPQkGAgFgrMf1t47na7wfOT6V71T3F3JMAwDoTbGWNd1XdNUTaeEaGoTobaiKBghjHGj0dD09j8535WEdM9wcD2poSOmfRmSav0SCtALc/S/6E8dMpnFqpUbWS78+Hmjq61odLt4doGxgRBWFUXXlGZL0ZQ/Qjp9Vizs7O6pNm1CKQdgUkqT+zGP2z0x8WzK7Z2Z8Uw6XZG3q1ImNe54/OKV3+fzvwm+DodDTx1jz72+aq3WUZtNrtduz8/LUj6XzeZOTiRRFHOSjLTWXjyWzUmCIBZLpavv5YNEIn9aQNi4F+d+uegA+TtqW+4jzIIWKCG2s9mLedPsd+5f2n3Fh4ksw8wAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/e427fae5c64208f0825d1e78b78074a1/aa41e/aurulent_bold.webp 145w&quot;
              sizes=&quot;(max-width: 145px) 100vw, 145px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/e427fae5c64208f0825d1e78b78074a1/0af15/aurulent_bold.png 145w&quot;
            sizes=&quot;(max-width: 145px) 100vw, 145px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/e427fae5c64208f0825d1e78b78074a1/0af15/aurulent_bold.png&quot;
            alt=&quot;Aurulent bold and faux bold&quot;
            title=&quot;Aurulent bold and faux bold&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The difference is pretty clear in the letters e, w, and r. If you care enough
about typography to be using @font-face, the top rendering should be considered
blasphemous. Using the handcoded CSS with styles and weights in place, the true
bold is used.&lt;/p&gt;
&lt;h3 id=&quot;font-family--typeface--font-face&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#font-family--typeface--font-face&quot; aria-label=&quot;font family  typeface  font face permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Font-family != Typeface != “font-face”&lt;/h3&gt;
&lt;p&gt;Once again:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A typeface is the collective design for a type family (e.g., the Garamond family).&lt;/li&gt;
&lt;li&gt;A font is a typeface variant (e.g., Garamond Bold 12pt).&lt;/li&gt;
&lt;li&gt;A font-face is your CSS font definition for a typeface, but may contain
a fallback font in another typeface (&lt;cite&gt;&lt;a href=&quot;http://hacks.mozilla.org/2009/06/beautiful-fonts-with-font-face/&quot;&gt;see
here&lt;/a&gt;&lt;/cite&gt;)
(e.g., &lt;code&gt;src: url(&apos;garamond.otf&apos;), local(&apos;Times New Roman&apos;);&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;A font-family is a collection defined by font-faces. The members of a font-
family are declared in each @font-face tag, counterintuitively. &lt;em&gt;A font-family
does not have to consist of one typeface!&lt;/em&gt; An example is the following:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CSS:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;css&quot; data-index=&quot;4&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk15&quot;&gt;@font-face&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;VerdaTica&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;local&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;Helvetica&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk15&quot;&gt;@font-face&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;VerdaTica&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;font-style&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;italic&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk11&quot;&gt;local&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;&amp;#39;Verdana&amp;#39;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk1&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk6&quot;&gt;em&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;font-style&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;italic&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;; }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk6&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;mtk12&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;: VerdaTica, &lt;/span&gt;&lt;span class=&quot;mtk8&quot;&gt;Sans-serif&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;; }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;HTML:&lt;/p&gt;
&lt;pre class=&quot;grvsc-container default-dark&quot; data-language=&quot;html&quot; data-index=&quot;5&quot;&gt;&lt;code class=&quot;grvsc-code&quot;&gt;&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk17&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;mtk4&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;mtk17&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;I&amp;#39;m in Helvetica!&lt;/span&gt;&lt;span class=&quot;mtk17&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;mtk4&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;mtk17&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk17&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;mtk4&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;mtk17&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;I&amp;#39;m in italic Verdana!&lt;/span&gt;&lt;span class=&quot;mtk17&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;mtk4&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;mtk17&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;grvsc-line&quot;&gt;&lt;span class=&quot;grvsc-source&quot;&gt;&lt;span class=&quot;mtk17&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;mtk4&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;mtk17&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;mtk1&quot;&gt;We&amp;#39;re different font-faces (i.e. fonts, and also different typefaces) in the same font-family!&lt;/span&gt;&lt;span class=&quot;mtk17&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;mtk4&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;mtk17&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;final-remarks&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#final-remarks&quot; aria-label=&quot;final remarks permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Final Remarks&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&quot;http://www.w3.org/&quot;&gt;&lt;abbr title=&quot;World Wide Web Consortium&quot;&gt;w3c&lt;/abbr&gt;&lt;/a&gt; is
redefining typography. What’s next, @char-face to let us define our own
ampersands? @scar-face to let us define our own font texture overlay? (see what
I did there)?&lt;/p&gt;
&lt;h3 id=&quot;cited&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#cited&quot; aria-label=&quot;cited permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Cited&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Typeface != Font &lt;a href=&quot;http://jontangerine.com/log/2008/08/typeface%E2%80%93font&quot;&gt;http://jontangerine.com/log/2008/08/typeface–font&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Font Squirrel | Free Font Aurulent Sans by Stephen G. Hartke &lt;a href=&quot;http://www.fontsquirrel.com/fonts/Aurulent-Sans&quot;&gt;http://www.fontsquirrel.com/fonts/Aurulent-Sans&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;beautiful fonts with @font-face &lt;a href=&quot;http://hacks.mozilla.org/2009/06/beautiful-fonts-with-font-face/&quot;&gt;http://hacks.mozilla.org/2009/06/beautiful-fonts-with-font-face/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;style class=&quot;grvsc-styles&quot;&gt;
  .grvsc-container {
    overflow: auto;
    position: relative;
    -webkit-overflow-scrolling: touch;
    padding-top: 1rem;
    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));
    padding-bottom: 1rem;
    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));
    border-radius: 8px;
    border-radius: var(--grvsc-border-radius, 8px);
    font-feature-settings: normal;
    line-height: 1.4;
  }
  
  .grvsc-code {
    display: table;
  }
  
  .grvsc-line {
    display: table-row;
    box-sizing: border-box;
    width: 100%;
    position: relative;
  }
  
  .grvsc-line &gt; * {
    position: relative;
  }
  
  .grvsc-gutter-pad {
    display: table-cell;
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  .grvsc-gutter {
    display: table-cell;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter::before {
    content: attr(data-content);
  }
  
  .grvsc-source {
    display: table-cell;
    padding-left: 1.5rem;
    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));
    padding-right: 1.5rem;
    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));
  }
  
  .grvsc-source:empty::after {
    content: &apos; &apos;;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter + .grvsc-source {
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  /* Line transformer styles */
  
  .grvsc-has-line-highlighting &gt; .grvsc-code &gt; .grvsc-line::before {
    content: &apos; &apos;;
    position: absolute;
    width: 100%;
  }
  
  .grvsc-line-diff-add::before {
    background-color: var(--grvsc-line-diff-add-background-color, rgba(0, 255, 60, 0.2));
  }
  
  .grvsc-line-diff-del::before {
    background-color: var(--grvsc-line-diff-del-background-color, rgba(255, 0, 20, 0.2));
  }
  
  .grvsc-line-number {
    padding: 0 2px;
    text-align: right;
    opacity: 0.7;
  }
  
  .default-dark {
    background-color: #1E1E1E;
    color: #D4D4D4;
  }
  .default-dark .mtk6 { color: #D7BA7D; }
  .default-dark .mtk1 { color: #D4D4D4; }
  .default-dark .mtk12 { color: #9CDCFE; }
  .default-dark .mtk7 { color: #B5CEA8; }
  .default-dark .mtk17 { color: #808080; }
  .default-dark .mtk4 { color: #569CD6; }
  .default-dark .mtk3 { color: #6A9955; }
  .default-dark .mtk15 { color: #C586C0; }
  .default-dark .mtk8 { color: #CE9178; }
  .default-dark .mtk11 { color: #DCDCAA; }
  .default-dark .grvsc-line-highlighted::before {
    background-color: var(--grvsc-line-highlighted-background-color, rgba(255, 255, 255, 0.1));
    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, rgba(255, 255, 255, 0.5));
  }
&lt;/style&gt;</content:encoded></item><item><title><![CDATA[Using Notepad++ for Web Development]]></title><description><![CDATA[I like real IDEs for console and application programming, but for web
development I’ve always felt most comfortable using a text editor…]]></description><link>https://www.davidosomething.com/using-notepad-for-web-development/</link><guid isPermaLink="false">https://www.davidosomething.com/using-notepad-for-web-development/</guid><pubDate>Tue, 02 Feb 2010 09:27:01 GMT</pubDate><content:encoded>&lt;p&gt;I like real IDEs for console and application programming, but for web
development I’ve always felt most comfortable using a text editor. Notepad++ is
my editor of choice because it is fast and feature rich.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 350px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/0a613f61d630952f5cbf8accf50785da/13ae7/npp-350x238.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 68.24324324324324%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAIAAACgpqunAAAACXBIWXMAAAsTAAALEwEAmpwYAAAClklEQVQoz02R25KbRhRF+f9vSB78npp47AFJnlRe4jjjmUhISB5hgbjTTd+7oRHiJlLYFZf3+zpnnbMNy1qZ5vLtvfnwsLSsxXK5ME3rt7v7+3fm6sMf5uLRWv353lzd391Zy8fF8tFafHj33vr97cMvv74xwuh8Om690zGMouDsZdE5DsMkBZgwIUqlalU2UmpOuSobwuTrqxMHPqX849+fjO56ic6HstTX6zVOUkIqVChGtBLXUraV6ivV6bLXZV9VAyGygLBUqmvbz59fjHHo0uCg66bv+zTNCFZxAnNAikJgrBASBRKEloLVWo+Ml33fTd+y338xxqGN/J2QVdNc4jjhvAaAIsQhZEXBsgzlOcFYKnnV1ch41XXt7XabpslxDsZt6NNw1m6aZoZZnQMKCwYAo7QS/MJZrWTzTXuGf2x29gdjGvvgqy1lOQxDFCeYiNkZiRxQSiopr0JepGy4qKVqf9beOXuj1jVGkFAmpErTDGB6hjnmCosyJwwQzrhmQlNeybLlohJCqLKqL4293RuM8e+Thr4P4ywIwfEYQMAZraSYbS96vOix0eOlvhEi8hwCiApEHedoRFHSzunba5ukWZqR0yn2vMT30ywjEHIIGASsABwAnqSgQBhhQhjb74/GNE3jOH+v7+aqsgy7buAeA8+Lz35yOsVJjPKUpHGBcQkhhhBBRAj9H77dxhnuuzhOkhQdXP/VDVwvOp0T14v8MPOC9KsfhxlKcwhAAQuMMHWcV2O6fT956ocegIIqBRRBFadaAUVRxYmWuJJYC6Ql4YJxyYVSpXZd3/j08a/dzrHt3WazfX5Zbzbbl+f109Pz0z/P6/XW3mxt27E3zvrf7W73Zb3erje7jb3bH46mtfoPuj7xSIMl1BsAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/0a613f61d630952f5cbf8accf50785da/cbe2e/npp-350x238.webp 148w,
/static/0a613f61d630952f5cbf8accf50785da/3084c/npp-350x238.webp 295w,
/static/0a613f61d630952f5cbf8accf50785da/a3432/npp-350x238.webp 350w&quot;
              sizes=&quot;(max-width: 350px) 100vw, 350px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/0a613f61d630952f5cbf8accf50785da/12f09/npp-350x238.png 148w,
/static/0a613f61d630952f5cbf8accf50785da/e4a3f/npp-350x238.png 295w,
/static/0a613f61d630952f5cbf8accf50785da/13ae7/npp-350x238.png 350w&quot;
            sizes=&quot;(max-width: 350px) 100vw, 350px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/0a613f61d630952f5cbf8accf50785da/13ae7/npp-350x238.png&quot;
            alt=&quot;Notepad++ screenshot&quot;
            title=&quot;Notepad++ screenshot&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;editor-settings&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#editor-settings&quot; aria-label=&quot;editor settings permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Editor Settings&lt;/h3&gt;
&lt;p&gt;Go to Settings -&gt; Preferences to change the default settings for NP++.&lt;/p&gt;
&lt;p&gt;I turn on Multi-Editing Settings, which allows you to make multiple selections
and edit them at the same time. Basically, this gives you multiple cursors that
output the same text. I switch the Folder Margin Style to Circle tree, just as
a preference. I also turn on the vertical edge, setting it to Line mode at 80
columns. There are plenty of other things to switch around if you just poke
around in there. Next, I go to Settings -&gt; Style Configurator and change my
global font settings.&lt;/p&gt;
&lt;h3 id=&quot;useful-plugins&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#useful-plugins&quot; aria-label=&quot;useful plugins permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Useful Plugins&lt;/h3&gt;
&lt;p&gt;The default interface of NP++ is perfectly fine for web development, but with
a few changes, it becomes much more powerful. One of the best things you can do
is enable the Explorer plugin. Plugins can be added by going to the Plugins
dropdown menu and using the Plugin Manager. Several plugins come installed by
default. I typically add to the defaults: Compare, Explorer, MultiClipboard,
Subversion, WebEdit, and XML Tools. Here are some tips regarding plugins:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Enable the Explorer and MultiClipboard plugins in their respective menus in
the Plugins menu. Check the settings for these plugins to see what they can do.&lt;/li&gt;
&lt;li&gt;If you use Subversion, the Compare plugin can do quick checks against the
base. Or, with any of the Tortoise versioning tools and the Explorer plugin,
you never need to leave NP++ to do your version control.&lt;/li&gt;
&lt;li&gt;Turn on the Console Dialog if you need to do anything from the command line.
It even has special variables you can use (type ‘help’). If you type &lt;code&gt;cmd&lt;/code&gt;
from the console, you get a standard DOS prompt.&lt;/li&gt;
&lt;li&gt;WebEdit gives you buttons that turn NP++ to a web editor with code wrapping.
Use it by highlighting some text and clicking a button. The text will
automatically be wrapped in tags. Read the instructions in
Notepad++pluginsdocWebEditWebEdit.txt to learn how to add more.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;keyboard-shortcuts&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#keyboard-shortcuts&quot; aria-label=&quot;keyboard shortcuts permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Keyboard Shortcuts&lt;/h3&gt;
&lt;p&gt;There are a few gems I’ve really come to love: Ctrl-D to duplicate a line and
Ctrl-(Shift)-U to toggle case. I also add Ctrl-; as short date format (I always
liked that combination from Excel). The TextFX shortcuts are good things to map.
You can add keyboard shortcuts through Settings -&gt; Shortcut Mapper.&lt;/p&gt;
&lt;style class=&quot;grvsc-styles&quot;&gt;
  .grvsc-container {
    overflow: auto;
    position: relative;
    -webkit-overflow-scrolling: touch;
    padding-top: 1rem;
    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));
    padding-bottom: 1rem;
    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));
    border-radius: 8px;
    border-radius: var(--grvsc-border-radius, 8px);
    font-feature-settings: normal;
    line-height: 1.4;
  }
  
  .grvsc-code {
    display: table;
  }
  
  .grvsc-line {
    display: table-row;
    box-sizing: border-box;
    width: 100%;
    position: relative;
  }
  
  .grvsc-line &gt; * {
    position: relative;
  }
  
  .grvsc-gutter-pad {
    display: table-cell;
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  .grvsc-gutter {
    display: table-cell;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter::before {
    content: attr(data-content);
  }
  
  .grvsc-source {
    display: table-cell;
    padding-left: 1.5rem;
    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));
    padding-right: 1.5rem;
    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));
  }
  
  .grvsc-source:empty::after {
    content: &apos; &apos;;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
  }
  
  .grvsc-gutter + .grvsc-source {
    padding-left: 0.75rem;
    padding-left: calc(var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem)) / 2);
  }
  
  /* Line transformer styles */
  
  .grvsc-has-line-highlighting &gt; .grvsc-code &gt; .grvsc-line::before {
    content: &apos; &apos;;
    position: absolute;
    width: 100%;
  }
  
  .grvsc-line-diff-add::before {
    background-color: var(--grvsc-line-diff-add-background-color, rgba(0, 255, 60, 0.2));
  }
  
  .grvsc-line-diff-del::before {
    background-color: var(--grvsc-line-diff-del-background-color, rgba(255, 0, 20, 0.2));
  }
  
  .grvsc-line-number {
    padding: 0 2px;
    text-align: right;
    opacity: 0.7;
  }
  
&lt;/style&gt;</content:encoded></item></channel></rss>