<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Seichy\&#39;s Missing Bit</title>
    <link>https://martianwabbit.com</link>
    <description>A blog on programing, electronics, plotters and cats.</description>
    <pubDate>Wed, 16 Sep 2026 18:12:03 +0000</pubDate>
    <lastBuildDate>Wed, 16 Sep 2026 18:12:03 +0000</lastBuildDate>
    <item>
      <title>Leica CL</title>
      <link>https://martianwabbit.com/2026/01/19/leica-cl.html</link>
      <description>&lt;p&gt;Last year I got back into analog photography. As more and more of my devices&#xA;seem to randomly turn on me, dumber devices have become surprisingly comforting.&#xA;I&#39;ve acquired a lot of analog cameras in the past year, as I try to find one&#xA;that gets me. I wanna talk about these devices, and this Leica Cl is one of&#xA;them.&lt;/p&gt;&#xA;&lt;p&gt;{% image leica-cl.jpg &amp;quot;A picture of my Leica Cl&amp;quot; %}&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The Leica CL is a 35mm compact rangefinder camera with interchangeable lenses&#xA;in the Leica M-mount. It was developed in collaboration with Minolta who&#xA;manufactured it. It first appeared in April 1973 and was released in the&#xA;Japanese market in November 1973 as the Leitz Minolta CL. Both the Leica CL&#xA;and Leitz Minolta CL were manufactured in a new Minolta factory in Osaka.&lt;/p&gt;&#xA;&lt;p&gt;– &lt;a href=&#34;https://en.wikipedia.org/wiki/Leica_CL&#34;&gt;Wikipedia&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;I am a sucker for old devices and ones with a good story behind them doubly so.&#xA;The Leica CL is pretty close to being the perfect camera for me, it&#39;s a really&#xA;compact and light camera, with terrific lens options and a great ecosystem&#xA;around it. I particularly value its size, as it makes it a great everyday&#xA;camera, I usually use a compact flash with it, it&#39;s a pretty great package and&#xA;pretty comparable to my favorite digital camera, the Fuji X100v.&lt;/p&gt;&#xA;&lt;p&gt;It can use most M-mount lenses and was originally sold with the Leitz&#xA;Summicron-C 40mm f:2 and the Leitz Elmar-C 90mm f:4. Both are really compact&#xA;lenses with great build quality. I haven&#39;t used the 90mm much, I really like the&#xA;40mm lens and well, I am a creature of habit.&lt;/p&gt;&#xA;&lt;p&gt;I got quite lucky and got a full set, with both of it&#39;s original lenses in&#xA;like-new condition for 900 euros. A fair price, I believe.&lt;/p&gt;&#xA;&lt;p&gt;Here&#39;s a couple of my favorite pictures from the past couple of months, all&#xA;taken with the Summicron-c 40mm F2:&lt;/p&gt;&#xA;&lt;p&gt;{% image leica-cl_fuji-200_19.jpg &amp;quot;A picture of a water tower&amp;quot; %}&lt;/p&gt;&#xA;&lt;p&gt;{% image leica-cl-portra-800_14.jpg &amp;quot;A picture of a snowy hill&amp;quot; %}&lt;/p&gt;&#xA;&lt;p&gt;{% image leica-cl-portra-800_27.jpg &amp;quot;A picture of a carousel at night&amp;quot; %}&lt;/p&gt;&#xA;&lt;h2&gt;Additional Documents&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;/files/2026-01-19-leica-cl/leica_cl-manual.pdf&#34;&gt;User Manual&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;/files/2026-01-19-leica-cl/leica_cl-service-manual.pdf&#34;&gt;Service Manual&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      <pubDate>Mon, 19 Jan 2026 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Restoring my Adana H.S. 2 6 x 4 Letterpress</title>
      <link>https://martianwabbit.com/2025/04/11/restoring-my-adana-6-x-4-letterpress.html</link>
      <description>&lt;p&gt;I&#39;ve been meaning to get a small Adana Letterpress forever. I saw one a couple&#xA;of years ago, and I could never get over it. Because of that, I&#39;ve had an eBay&#xA;search setup for years, waiting for the day the perfect specimen showed up. It&#xA;finally did.&lt;/p&gt;&#xA;&lt;p&gt;{% image 0cb403efbaf0a160f49093243152676e.jpg &amp;quot;My letterpress, in bright red with a little rust&amp;quot; %}&lt;/p&gt;&#xA;&lt;p&gt;The Adana Agency was founded in 1922 by Donald Aspinwall in Twickenham. I find&#xA;it extremely fascinating how it always seemed to be directed towards the hobby&#xA;printer. The machines are reliable and easy to maintain. They have no bearings,&#xA;most moving parts are metal on metal with only oil to ease their movement. They&#xA;are still fairly popular and there&#39;s a decent amount of information online on&#xA;how to take care of them. In 1987 the company was purchased by Caslon who still&#xA;provides some parts for these machines today.&lt;/p&gt;&#xA;&lt;p&gt;{% image fed822d2d79da6930b5832c60320a70b.jpg &amp;quot;An old advert for the Adana with the phrase &#39;Print it yourself&#39; in big bold letters.&amp;quot; %}&lt;/p&gt;&#xA;&lt;p&gt;I got myself a small 6×4 model. The High Speed 2, as it seemed to be called, is&#xA;a nicely sized machine. It is perfect for postcards and other small prints, it&#39;s&#xA;also a tiny, lightweight machine which is perfect for my tiny, lightweight&#xA;apartment.&lt;/p&gt;&#xA;&lt;p&gt;It was in good shape, had some corrosion, but all pieces seemed to move and most&#xA;importantly, be there. I wanted to get it done over a weekend, so I had to plan&#xA;accordingly.&lt;/p&gt;&#xA;&lt;p&gt;{% image 7db76ae2155d57f837cb7508007def58.jpg &amp;quot;Another angle for the letterpress, showcasing how rusty it is.&amp;quot; %}&lt;/p&gt;&#xA;&lt;p&gt;I started work early on Saturday, disassembling the entire machine and sorting&#xA;the pieces that were rusty and the ones that were only dirty. This took quite&#xA;long, a lot of nuts were rusty enough that removing them was challenging. I used&#xA;a lot of bike chain oil (I like using it in lieu of penetrating oil) and waited,&#xA;eventually most of them gave in and could be unscrewed. Luckily, the nuts that&#xA;couldn&#39;t be removed didn&#39;t really prevent the rest of the machine from being&#xA;disassembled. By the end of the day, I had all my pieces ready for cleaning.&lt;/p&gt;&#xA;&lt;p&gt;{% image b7efc500d8f519d14c462bab5208d7d4.jpg &amp;quot;All the pieces laid out on the table before being cleaned&amp;quot; %}&lt;/p&gt;&#xA;&lt;p&gt;On Sunday, everything that was rusty went into a bucket with Evaporust. I was&#xA;doing most of this in my living room, so Evaporust was the only real&#xA;rust-removing solution I&#39;d be able to use safely. Everything was left in the&#xA;solution and I checked it every 30 minutes, removing the pieces as they became&#xA;rust-free. I didn&#39;t want to leave anything longer than what was absolutely&#xA;needed because I worried about things like springs become brittle.&lt;/p&gt;&#xA;&lt;p&gt;By the end of the day I had cleaned everything and I left all pieces out to air&#xA;dry. I couldn&#39;t finish the project on time, so I had to do a couple of final&#xA;things on Monday before final assembly. All moving parts that had rust removed&#xA;received a spray of WD-40. This should prevent them from rusting right away.&#xA;They would get some bike chain oil once the machine was assembled as well. I&#xA;built a small plywood platform to mount the machine on, once it was fully&#xA;assembled.&lt;/p&gt;&#xA;&lt;p&gt;{% image 87e10e434908233f946a732e283bcfea.jpg &amp;quot;All the pieces laid out on the table after being cleaned&amp;quot; %}&lt;/p&gt;&#xA;&lt;p&gt;Assembly was nice and quick, most pieces only fit in one way, and it&#39;s not hard&#xA;to figure out&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. Once done I oiled all moving parts and filled in the small&#xA;oil ports that cover the machine. I did this a couple of times until everything&#xA;felt well oiled and no squeaks remained.&lt;/p&gt;&#xA;&lt;p&gt;{% image 4a03e316d66cf9c67f9a1cf24781d120.jpg &amp;quot;The press put back together&amp;quot; %}&lt;/p&gt;&#xA;&lt;p&gt;I proceeded to mount it on the board I had prepared, oil everything again and 3d&#xA;printed a couple of holders for rollers and the ink disk. Finally, I was ready&#xA;for a test run.&lt;/p&gt;&#xA;&lt;p&gt;{% image 58e653a16f67719fb38ea9e29905ee27.jpg &amp;quot;The final press, mounted on a plywood board with a 3d printed block on the chase&amp;quot; %}&lt;/p&gt;&#xA;&lt;p&gt;I don&#39;t have type. I also don&#39;t think I want to have type. I would love to have&#xA;type, but I am generally speaking, scared of lead. If I managed to find non-lead&#xA;alternative to type I&#39;ll use that. In the meantime, I am experimenting with 3D&#xA;printing, my first attempt went well enough, and I think with a couple of small&#xA;improvements it&#39;ll be good enough for the kind of things I want to print.&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;That&#39;s a lie. Oddly enough, I did put the roller arms backwards the first&#xA;time, making it so everything looked like it worked but without a spinning&#xA;ink disk. This took a bit to figure out, it wasn&#39;t until I checked&#xA;everything again that I caught it.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
      <pubDate>Fri, 11 Apr 2025 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Bookbinding Adhesives</title>
      <link>https://martianwabbit.com/2025/01/14/bookbinding-adhesives.html</link>
      <description>&lt;p&gt;I&#39;ve been doing a lot more bookbinding lately. I&#39;ve done a lot of it throughout&#xA;the years and recently decided to dive a bit deeper.&lt;/p&gt;&#xA;&lt;p&gt;{% image notebook.jpeg &amp;quot;One of the notebooks I&#39;ve made in the past month&amp;quot; %}&lt;/p&gt;&#xA;&lt;p&gt;As part of this dive I&#39;ve tried looking a bit deeper into the adhesives I use. I&#xA;use Bookplast 22 most of the time. It&#39;s sold on my local bookbinding supply&#xA;store, dries quickly and flexible. It is based of &lt;em&gt;Methylisothiazolinone&lt;/em&gt;, which&#xA;I&#39;ve never heard of before. I think PVA is probably more commonly used though.&lt;/p&gt;&#xA;&lt;p&gt;I&#39;ve ruined a couple of notebooks because the glue I use dries too quickly. The&#xA;common solution I&#39;ve seen referenced is to use paste, which I am not a fan of.&#xA;I&#39;ve also started experimenting with methylcellulose, which seems like a common&#xA;paste replacement. It&#39;s easy to make at home and unlike paste doesn&#39;t go bad (I&#xA;haven&#39;t had any go bad yet anyways). It is extremely weak though, and sadly it&#xA;only seems to work really well between papers.&lt;/p&gt;&#xA;&lt;p&gt;Finally, the better alternative seems to be a mixture between the glue and&#xA;methylcellulose. A 60 / 40 mixture is what&#39;s usually recommended, it gives you&#xA;the strength of glue with the longer cure time.&lt;/p&gt;&#xA;&lt;p&gt;I did a quick test where I pasted paper, bookbinding cloth and cardstock to&#xA;greyboard, bookbinding cloth and cardstock to see how each behaved. I ripped it&#xA;off after about 2 hours of cure time.&lt;/p&gt;&#xA;&lt;p&gt;Here are the results:&lt;/p&gt;&#xA;&lt;p&gt;{% video out-greyboard.MP4 %}&lt;/p&gt;&#xA;&lt;p&gt;{% video out-cloth.MP4 %}&lt;/p&gt;&#xA;&lt;p&gt;{% video out-cardstock.MP4 %}&lt;/p&gt;&#xA;&lt;h2&gt;Conclusion&lt;/h2&gt;&#xA;&lt;p&gt;I think mix is the way to go when I need to be precise, it dries basically just&#xA;as strongly as glue while still giving me some freedom to move the pieces around&#xA;if I don&#39;t get them perfectly straight. For everything else, there&#39;s glue. I&#xA;want to try my hand at restoration and I think methylcellulose will have a place&#xA;in my toolkit then.&lt;/p&gt;&#xA;</description>
      <pubDate>Tue, 14 Jan 2025 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>We moved to Spain</title>
      <link>https://martianwabbit.com/2024/07/15/we-moved-to-spain.html</link>
      <description>&lt;p&gt;2024 has been wild. Towards the end of 2023 we decided to move to Spain. I&#39;ve&#xA;always loved Spain and it&#39;s the country I&#39;ve travelled the most to. We made the&#xA;decision randomly one night and so the scramble started.&lt;/p&gt;&#xA;&lt;p&gt;The first step was finding a lawyer and gathering documents. We knew we didn&#39;t&#xA;need the added stress of DIYing it. We scheduled a couple of calls for the&#xA;following week and were sold on the second one. They guided us through the&#xA;process and we gathered all of the documents over the following month. The&#xA;highlight was probably having to get married to get a marriage act. This was&#xA;towards the end of October and we were only getting started.&lt;/p&gt;&#xA;&lt;p&gt;We couldn&#39;t leave without our cats. Having four of them only made it more&#xA;tedious. To import them into the EU we needed a clean rabies test from a&#xA;certified lab. The closest lab was in the US and getting the results would take&#xA;a month. The result isn&#39;t even valid until 3 months after the blood is extracted&#xA;so that push our timeline to January at the earliest. We still needed to start&#xA;the visa application process and pack up our apartment so we needed to get a lot&#xA;going.&lt;/p&gt;&#xA;&lt;p&gt;Angela left for Spain on the second week of November to get the application&#xA;started and to get a new apartment. In the meantime I stayed back and started&#xA;packing the apartment and getting the cats ready for the move.&lt;/p&gt;&#xA;&lt;p&gt;Angela got a positive reply on the last week of December as I was almost done&#xA;packing. With the papers now in order I had to figure out how to get the cats to&#xA;Spain. Only one cat is allowed per passenger on the cabin so I had to get 3&#xA;friends to come with me to deliver the cats.&lt;/p&gt;&#xA;&lt;p&gt;We left the third week of January, everyone got to Spain safely.&lt;/p&gt;&#xA;</description>
      <pubDate>Mon, 15 Jul 2024 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Project Log: MidiFaders - ESP-32 MIDI-BLE Faders</title>
      <link>https://martianwabbit.com/2023/02/04/project-log-midifaders-esp-32-midi-ble-faders.html</link>
      <description>&lt;p&gt;A while back I built a BLE MIDI controller. I was never too happy with it and&#xA;had been meaning to take another stab at it.&lt;/p&gt;&#xA;&lt;p&gt;My plan is pretty simple, I want a 4 or 5 faders in a small battery-powered box.&#xA;I recently came across a TTGO display board. It brings most of what I need&#xA;onboard, bluetooth, a screen, a couple of buttons, battery management and, best&#xA;of all, a usb-c port.&lt;/p&gt;&#xA;&lt;p&gt;I knew exactly what I wanted, so I went to my parts cabinet and grabbed some&#xA;faders, and measured how many I could fit easily on that board.&lt;/p&gt;&#xA;&lt;h2&gt;Electrical Design&lt;/h2&gt;&#xA;&lt;p&gt;The electronics were pretty straightforward. I just needed all of my faders to&#xA;be connected:&lt;/p&gt;&#xA;&lt;p&gt;{% image schematic.svg &amp;quot;A schematic for the midi faders&amp;quot; invert %}&lt;/p&gt;&#xA;&lt;p&gt;I rapidly routed a board, and proceeded to mill it.&lt;/p&gt;&#xA;&lt;h2&gt;Milling a PCB&lt;/h2&gt;&#xA;&lt;p&gt;I have a small desktop CNC I use for milling PCBs at home. I don&#39;t use it nearly&#xA;as often as I&#39;d like but I love having it available. It&#39;s much better than&#xA;protoboard and way more fun.&lt;/p&gt;&#xA;&lt;p&gt;I had a lot of issues milling this PCB though. It turns out most of the software&#xA;I am used to using in Ubuntu flat out doesn&#39;t work on a Mac M1. So I had to find&#xA;solutions to some of those issues.&lt;/p&gt;&#xA;&lt;p&gt;The biggest problem was FlatCam. FlatCam is awesome and I love it but it seems&#xA;barely maintained and running it is getting harder every day. I decided to try&#xA;out alternatives. It turns out there really aren&#39;t any.&lt;/p&gt;&#xA;&lt;p&gt;I ended up settling with &lt;a href=&#34;https://copper.carbide3d.com/&#34;&gt;Copper&lt;/a&gt;. This is a&#xA;website provided by carbide3d that allows you to upload your layers and get a&#xA;set of gcode files. You only get minimal options so I don&#39;t think I&#39;d use it for&#xA;anything but a one-sided PCB but it seemed acceptable.&lt;/p&gt;&#xA;&lt;p&gt;{% image 2.jpg &amp;quot;A picture of Carbide Copper&amp;quot; %}&lt;/p&gt;&#xA;&lt;p&gt;With my set of gcode files I felt ready to mill my PCB. Thankfully bCNC still&#xA;runs flawlessly on a Pi so that part of my workflow remained intact. Here&#39;s a&#xA;quick rundown on how I usually do it (I&#39;ll probably write a separate post to go&#xA;into it in more detail).&lt;/p&gt;&#xA;&lt;p&gt;I start by prepping a PCB blank. I clean it will alcohol and a scotch pad and&#xA;set it on the bed using double-sided tape.&lt;/p&gt;&#xA;&lt;p&gt;Next, I probe the PCB and set my working space.&lt;/p&gt;&#xA;&lt;p&gt;{% image 3.jpg &amp;quot;The spindle probing the pcb blank&amp;quot; %}&lt;/p&gt;&#xA;&lt;p&gt;I the autolevel but don&#39;t click autolevel. If you&#39;ve used bCNC before you know&#xA;this breaks stuff.&lt;/p&gt;&#xA;&lt;p&gt;{% image 4.jpg &amp;quot;The resulting PCB.&amp;quot; %}&lt;/p&gt;&#xA;&lt;p&gt;After cleaning it up, we can do soldering. This is generally the easy part. I&#xA;leave as much space as possible around my traces, as much as 1mm if there&#39;s&#xA;space. Soldering comes down to a lot of flux and as much solder as it takes.&#xA;I&#39;ll usually coat parts of the PCB with the excess solder, this is probably&#xA;useless but I feel like it makes for a better connection on these homemade PCBs.&lt;/p&gt;&#xA;&lt;p&gt;{% image 5.jpg &amp;quot;The parts inserted into the PCB before soldering.&amp;quot; %}&lt;/p&gt;&#xA;&lt;p&gt;I&#39;ll do a quick fit check with all parts and then start soldering.&lt;/p&gt;&#xA;&lt;p&gt;{% image 6.jpg &amp;quot;The PCB now soldered.&amp;quot; %}&lt;/p&gt;&#xA;&lt;p&gt;It ended up looking pretty good.&lt;/p&gt;&#xA;&lt;p&gt;{% image 7.jpg &amp;quot;The PCB from the frontside.&amp;quot; %}&lt;/p&gt;&#xA;&lt;h2&gt;Firmware~&lt;/h2&gt;&#xA;&lt;p&gt;So the firmware for these things is usually the hard part. My idea was extremely&#xA;simple. Each fader should send, via bluetooth midi, a cc on a channel. These&#xA;should be modifiable from within the device. The UI would have to be something I&#xA;came up with as I went. I used the excellent arduino_midi_library with a&#xA;bluetooth transport and everything went surprisingly smoothly.&lt;/p&gt;&#xA;&lt;p&gt;In a couple of days I had implemented all menus, battery management, bluetooth&#xA;and settings. Of the features I wanted to add, I am only missing presets and a&#xA;web app to load these in. Overall I am extremely happy with how performant and&#xA;easy to use it is.&lt;/p&gt;&#xA;&lt;h2&gt;Case&lt;/h2&gt;&#xA;&lt;p&gt;The case took a couple of iterations to get right. I hadn&#39;t done any 3d printing&#xA;in a while so I was a bit rusty.&lt;/p&gt;&#xA;&lt;p&gt;{% image 8.jpg &amp;quot;A 3d printer, printing the case&amp;quot; %}&lt;/p&gt;&#xA;&lt;p&gt;After shifting around the design a bit I came up with something that was both&#xA;easy to print and very functional.&lt;/p&gt;&#xA;&lt;p&gt;{% image 9.jpg &amp;quot;The different versions of the case&amp;quot; %}&lt;/p&gt;&#xA;&lt;h1&gt;The End ~&lt;/h1&gt;&#xA;&lt;p&gt;I am very happy with the final result. It came out really clean, easy to use and&#xA;highly functional. Setting up new devices is fast and easy and since it&#39;s&#xA;compliant it connects seamlessly with other MIDI-BLE devices, like the widi&#xA;masters.&lt;/p&gt;&#xA;&lt;p&gt;{% image 10.jpg &amp;quot;The final device&amp;quot; %}&lt;/p&gt;&#xA;&lt;p&gt;{% image 11.jpg &amp;quot;The UI showing the midi channel selector&amp;quot; %}&lt;/p&gt;&#xA;&lt;p&gt;{% image 12.jpg &amp;quot;Another closeup of the UI&amp;quot; %}&lt;/p&gt;&#xA;</description>
      <pubDate>Sat, 04 Feb 2023 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Making Softcases for Small Electronics and Cables</title>
      <link>https://martianwabbit.com/2023/01/29/making-softcases-for-small-electronics-and-cables.html</link>
      <description>&lt;p&gt;Wraps are my favorite way of storing small electronics. Whenever I get a new one&#xA;I&#39;ll probably make one really quickly to store it and it&#39;s accessories.&lt;/p&gt;&#xA;&lt;p&gt;It&#39;s a fairly straightforward process. Start with a piece of cloth. I really&#xA;like this one, where it&#39;s like felt on one side and like linen on the other. It&#xA;makes it so the interior is really nice and soft.&lt;/p&gt;&#xA;&lt;p&gt;{% image 1.jpg &amp;quot;A large piece of fabric laying on the floor&amp;quot; %}&lt;/p&gt;&#xA;&lt;p&gt;I&#39;ll start by measuring the device I&#39;ll be wrapping. Once I&#39;ve got the&#xA;measurements I&#39;ll lay my cloth on the floor and draw a rough rectangle. It&#39;ll be&#xA;a bit wider than needed and about four times the length of the device. This will&#xA;let me wrap it comfortably a couple of times.&lt;/p&gt;&#xA;&lt;p&gt;{% image 2.jpg &amp;quot;A couple of lines chalked up on black felt&amp;quot; %}&lt;/p&gt;&#xA;&lt;p&gt;I&#39;ll then cut this rectangle off.&lt;/p&gt;&#xA;&lt;p&gt;{% image 3.jpg &amp;quot;A small piece of fabric laying on the floor now&amp;quot; %}&lt;/p&gt;&#xA;&lt;p&gt;I&#39;ll then fold a third of this cloth on top of itself and sew it. I got a free&#xA;sewing machine a while back (all it took was a couple of 3d printed replacement&#xA;parts to get it working but that&#39;s a story for another day) which I use for&#xA;this.&lt;/p&gt;&#xA;&lt;p&gt;{% image 4.jpg &amp;quot;A sewing machine... sewing&amp;quot; %}&lt;/p&gt;&#xA;&lt;p&gt;{% image 5.jpg &amp;quot;A close up of the sewn case&amp;quot; %}&lt;/p&gt;&#xA;&lt;p&gt;Once that&#39;s done I&#39;ll flip it inside-out and sew any open borders to give it a&#xA;cleaner look.&lt;/p&gt;&#xA;&lt;p&gt;I&#39;ll also sew a elastic on the open side so I can close it up.&lt;/p&gt;&#xA;&lt;p&gt;{% image 6.jpg &amp;quot;The Elastic sewn to the flap&amp;quot; %}&lt;/p&gt;&#xA;&lt;p&gt;I am not great a sewing.&lt;/p&gt;&#xA;&lt;p&gt;I&#39;ll then place the device inside, wrap it up and figure out where to put a&#xA;button so that it closes up cleanly.&lt;/p&gt;&#xA;&lt;p&gt;{% image 7.jpg &amp;quot;A button being placed.&amp;quot; %}&lt;/p&gt;&#xA;&lt;p&gt;Buttons are hard. I&#39;ll do as many passes as possible because I really suck at&#xA;place them. Just doing a lot of passes will usually yield a nice looking result.&lt;/p&gt;&#xA;&lt;p&gt;{% image 8.jpg &amp;quot;A closeup of the button sewn into place.&amp;quot; %}&lt;/p&gt;&#xA;&lt;p&gt;{% image 9.jpg &amp;quot;How it looks on the insider&amp;quot; %}&lt;/p&gt;&#xA;&lt;p&gt;{% image 10.jpg &amp;quot;How it looks on the outside&amp;quot; %}&lt;/p&gt;&#xA;&lt;p&gt;It&#39;s all about confidence. Once it&#39;s all done, you can insert the device in and&#xA;wrap it, using the elastic as a latch.&lt;/p&gt;&#xA;&lt;p&gt;{% image 11.jpg &amp;quot;A closeup of the button sewn into place.&amp;quot; %}&lt;/p&gt;&#xA;</description>
      <pubDate>Sun, 29 Jan 2023 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>DIY Midi Cable for the OP-Z and ZM-1</title>
      <link>https://martianwabbit.com/2023/01/15/diy-midi-cable-for-the-op-z-and-zm-1.html</link>
      <description>&lt;p&gt;I&#39;ve been using an old Rockband Keytar as a midi controller for the longest&#xA;time. I usually take advantage of the OP-Z&#39;s ability to be a MIDI host to use&#xA;the keytar via a midi to usb adapter. This is fairly cumbersome as I have to use&#xA;big cables and a USB-A to USB-C adapter.&lt;/p&gt;&#xA;&lt;p&gt;Last year I got myself a ZM-1 module for the OP-Z which allows me to connect&#xA;MIDI devices via a 3.5mm jack. These are fairly easy to put together and I had&#xA;all the spare parts I needed hanging around already so I decided to make a&#xA;couple.&lt;/p&gt;&#xA;&lt;p&gt;All you need is a MIDI jack, and 3.5mm jack and some cable. I used a midi jack&#xA;that already had it&#39;s cable attached. I took this from a previous midi project&#xA;so that cut the soldering in half.&lt;/p&gt;&#xA;&lt;p&gt;{% image 1.jpg &amp;quot;The parts we&#39;ll need. A midi jack and a 3.5mm jack&amp;quot;%}&lt;/p&gt;&#xA;&lt;p&gt;I couldn&#39;t find documentation stating weather this cable is meant to be type a&#xA;or b or something else. So I tried wiring it as a type-A (a being the &amp;quot;standard&amp;quot;&#xA;from what I know). This didn&#39;t work, it turns out is actually type-B. Here&#39;s the&#xA;diagram:&lt;/p&gt;&#xA;&lt;p&gt;{% image diagram.svg &amp;quot;The diagram we&#39;ll follow, current source to tip, current sink to the ring and shield to the sleeve &amp;quot;%}&lt;/p&gt;&#xA;&lt;p&gt;Some soldering later and the cable is mostly ready:&lt;/p&gt;&#xA;&lt;p&gt;{% image 2.jpg &amp;quot;The cables soldered onto the 3.5mm jack&amp;quot;%}&lt;/p&gt;&#xA;&lt;p&gt;I used some heatshrink as strain-relief. I was also lacking the piece of plastic&#xA;that screws to the 3.5mm jack so I wrapped it in some extra heatshrink to give&#xA;it some strength. Here&#39;s the final cable:&lt;/p&gt;&#xA;&lt;p&gt;{% image 4.jpg &amp;quot;The finished cable, now with some heatshrink&amp;quot; %}&lt;/p&gt;&#xA;&lt;p&gt;Here&#39;s what my keytar setup looks like now:&lt;/p&gt;&#xA;&lt;p&gt;{% image 5.jpg &amp;quot;The op-z on top of my rockband keytar&amp;quot; %}&lt;/p&gt;&#xA;&lt;p&gt;It works flawlessly and makes for a fun little weekend project.&lt;/p&gt;&#xA;</description>
      <pubDate>Sun, 15 Jan 2023 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Project Log: Some Sort of Guitar</title>
      <link>https://martianwabbit.com/2023/01/02/project-log-some-sort-of-guitar.html</link>
      <description>&lt;p&gt;I was lucky enough to be gifted an old, broken guitar.&lt;/p&gt;&#xA;&lt;p&gt;{% image 1.jpg &amp;quot;An image of the guitar&#39;s body&amp;quot; %}&lt;/p&gt;&#xA;&lt;p&gt;It was in pretty rough shape. The bridge had been bolted to the body so when it&#xA;started lifting it broke through the top.&lt;/p&gt;&#xA;&lt;p&gt;{% image 2.jpg &amp;quot;A closeup of the guitar&#39;s lifted bridge&amp;quot; %}&lt;/p&gt;&#xA;&lt;p&gt;I felt that it wasn&#39;t really worth restoring it and that I&#39;d rather try building&#xA;something new on top of it. I was thinking that just adding a pickup would make&#xA;it a bit more interesting.&lt;/p&gt;&#xA;&lt;p&gt;I started by removing half of the top. Since I don&#39;t care too much about the&#xA;quality, I was able to remove the lower half quite easily with a utility knife.&lt;/p&gt;&#xA;&lt;p&gt;{% image 3.jpg &amp;quot;A ruler on the guitar showing where I cut it through&amp;quot; %}&lt;/p&gt;&#xA;&lt;p&gt;{% image 4.jpg &amp;quot;The lower half of the guitar&#39;s top removed from the guitar&amp;quot; %}&lt;/p&gt;&#xA;&lt;p&gt;I used this lower half to create a template to create a new lower half.&lt;/p&gt;&#xA;&lt;p&gt;{% image 5.jpg &amp;quot;The paper template I created&amp;quot;%}&lt;/p&gt;&#xA;&lt;p&gt;I used this template to cut a thin sheet of plywood to replace that piece. It&#39;s&#xA;a bit oversized but I will be sanding it down to size.&lt;/p&gt;&#xA;&lt;p&gt;{% image 6.jpg &amp;quot;The guitar with its new plywood top&amp;quot;%}&lt;/p&gt;&#xA;&lt;p&gt;The new plywood was a bit thicker than the rest of the top so I had to plane the&#xA;outer wall down so that both parts would be somewhat flush together.&lt;/p&gt;&#xA;&lt;h2&gt;January 22nd&lt;/h2&gt;&#xA;&lt;p&gt;Here&#39;s the not-so-fun part. I started prepping the guitar for painting. I am&#xA;thinking I want to paint the entire thing in a solid color, a dark one should&#xA;make the entire thing easier to match.&lt;/p&gt;&#xA;&lt;p&gt;I started with the body. I needed to make sure all edges were as neat as&#xA;possible. There&#39;s an upper bound to how good I think I can get it to look so I&#xA;am trying to cover the basics at least.&lt;/p&gt;&#xA;&lt;p&gt;I didn&#39;t have a chisel on hand so I had to use a utility knife. It made the&#xA;process rather slow but I got it done.&lt;/p&gt;&#xA;&lt;p&gt;{% video video-1.mp4 %}&lt;/p&gt;&#xA;&lt;p&gt;After cleaning the edges, I sanded the body.&lt;/p&gt;&#xA;&lt;p&gt;{% image 7.jpg &amp;quot;The guitar with is freshly sanded body&amp;quot;%}&lt;/p&gt;&#xA;&lt;p&gt;Next I had to do the neck and fittings. I started by removing the old fittings,&#xA;I don&#39;t intend to buy new ones so I&#39;ll have to clean these.&lt;/p&gt;&#xA;&lt;p&gt;{% image 8.jpg &amp;quot;The guitar&#39;s tuners&amp;quot;%}&lt;/p&gt;&#xA;&lt;p&gt;Luckily disassembly is pretty straightforward.&lt;/p&gt;&#xA;&lt;p&gt;{% image 9.jpg &amp;quot;The guitar&#39;s tuners dissambled&amp;quot;%}&lt;/p&gt;&#xA;&lt;p&gt;Next I prepped the neck. Some light sanding...&lt;/p&gt;&#xA;&lt;p&gt;{% image 10.jpg &amp;quot;The guitar&#39;s neck after a light sanding&amp;quot;%}&lt;/p&gt;&#xA;&lt;p&gt;and some light scrapping...&lt;/p&gt;&#xA;&lt;p&gt;{% image 11.jpg &amp;quot;The guitar&#39;s neck after a light scrapping&amp;quot;%}&lt;/p&gt;&#xA;&lt;p&gt;and it was ready to be painted.&lt;/p&gt;&#xA;&lt;p&gt;{% image 12.jpg &amp;quot;The guitar hanged from a wire to be painted&amp;quot;%}&lt;/p&gt;&#xA;&lt;p&gt;We applied a primer, to hopefully even everything out a bit.&lt;/p&gt;&#xA;&lt;p&gt;{% image 13.jpg &amp;quot;The guitar with it&amp;quot;s white primer&#39;%}&lt;/p&gt;&#xA;&lt;p&gt;Now it only needs a second coat of primer and we&#39;ll apply it&#39;s final color.&lt;/p&gt;&#xA;&lt;h2&gt;January 24&lt;/h2&gt;&#xA;&lt;p&gt;In the meantime, I&#39;ve gone ahead and cleaned up it&#39;s original hardware. I left&#xA;it all submerged in a cup with 1 part of distilled white vinegar and 1 part&#xA;water overnight.&lt;/p&gt;&#xA;&lt;p&gt;The next day I had a go at it with a scotch pad and some steel wool under&#xA;running water.&lt;/p&gt;&#xA;&lt;p&gt;{% image 14.jpg &amp;quot;All the parts cleaned up&amp;quot;%}&lt;/p&gt;&#xA;&lt;p&gt;After letting it dry and having it reassembled, it all looked great.&lt;/p&gt;&#xA;&lt;p&gt;{% image 15.jpg &amp;quot;The tuners reassembled&amp;quot;%}&lt;/p&gt;&#xA;</description>
      <pubDate>Mon, 02 Jan 2023 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Installing Gitea on Dokku</title>
      <link>https://martianwabbit.com/2022/08/07/installing-gitea-on-dokku.html</link>
      <description>&lt;p&gt;I&#39;ve been meaning to backup my GitHub repos somewhere for a while. I recently&#xA;discovered that Gitea can mirror them and will keep them updated. I am running&#xA;Dokku on my dedicated server and pretty much run everything I can think of&#xA;there. Gitea was a bit tricky to install so here are some notes.&lt;/p&gt;&#xA;&lt;p&gt;You start by creating the app:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;; dokku app:create gitea&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Once that&#39;s done, we can initialize it from the docker image:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;; dokku git:from-image gitea gitea/gitea:latest&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;This is a good time to set the correct domain name and mount the Gitea&#xA;directories.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;; dokku domains:add gitea git.example.org&#xA;; dokku storage:ensure-directory gitea&#xA;; dokku storage:mount gitea /var/lib/dokku/data/storage/gitea:/data&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;We can rebuild the app now:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;; dokku ps:rebuild gitea&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Dokku will get some ports wrong sometimes, we should check those:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;; dokku proxy:report gitea&#xA;=====&amp;gt; gitea proxy information&#xA;       Proxy enabled:                 true&#xA;       Proxy port map:                http:22:22 http:3000:3000&#xA;       Proxy type:                    nginx&#xA;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Those look somewhat wrong, lets fix them:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;; dokku proxy:ports-remove gitea http:3000:3000 http:22:22&#xA;; dokku proxy:ports-add gitea http:80:3000&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;We can enable LetsEncrypt now:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;; dokku letsencrypt:enable gitea&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;That&#39;s pretty much it! Seems a lot simpler once I&#39;ve written it down.&#xA;If you want to change the config file you can go ahead and edit it + restart the&#xA;app:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;; sudo vim /var/lib/dokku/data/storage/gitea/gitea/conf/app.ini&#xA;; dokku ps:restart gitea&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Cheers!&lt;/p&gt;&#xA;</description>
      <pubDate>Sun, 07 Aug 2022 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>The Pandemic</title>
      <link>https://martianwabbit.com/2022/08/05/the-pandemic.html</link>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;As the &lt;em&gt;end&lt;/em&gt;&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; of the Pandemic approaches, I wanted to write a blog post to&#xA;remind myself of these past 18 months and how we spent our time in exile.&#xA;There isn&#39;t really a point to this blog post in general it&#39;s mostly a slice&#xA;of my life and a lot of disconnected thoughts.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;I originally started writing this post in August 8th, 2021. It took me a year to&#xA;get around to finishing it but here it is. Better late than never I guess!&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2&gt;Before The Pandemic&lt;/h2&gt;&#xA;&lt;p&gt;My exile started a bit before the pandemic got to Honduras. Towards the end of&#xA;the previous year (2019) I had a cancer scare. It turned out to be nothing but&#xA;I developed a lot of anxiety around my health because of it. I had become overly&#xA;weary of anything health related and hearing of this SARS-like disease that was&#xA;showing up everywhere didn&#39;t help. By that time everyone was a bit tired of my&#xA;shenanigans and when I asked everyone around me to prepare for it I&#xA;(understandably) was not taken very seriously.&lt;/p&gt;&#xA;&lt;p&gt;Honduras is poor and I knew it wouldn&#39;t take much for it&#39;s system to collapse.&#xA;If even rich countries seem to be struggling it wouldn&#39;t really take much for&#xA;the same to happen here. I told my mother that if she wanted to visit she&#39;d have&#xA;to do so before the first case was reported in Honduras. Once that happened I&#39;d&#xA;pretty much lock myself up and isolate for however long it took. She came to&#xA;visit a couple of weeks before the first case, just in-case. It sounded like&#xA;masks and hand sanitizer would be the first thing to fly off the shelves so I&#xA;purchased some preemptively. I figured I was being overly dramatic but better&#xA;safe than sorry. Having basic things I could hold to would make my anxiety&#xA;easier to control I figured.&lt;/p&gt;&#xA;&lt;p&gt;As the pandemic seemed to get closer I told everyone my plans of staying indoors&#xA;until it was under control, that it might be a bit long but hopefully not more&#xA;than a couple of months. The 8th of March, we had Arleth over for brunch, we&#xA;talked about the upcoming pandemic over coffee.&lt;/p&gt;&#xA;&lt;p&gt;On 10th of March, 2020 the first two cases of covid were reported in&#xA;Honduras my lock down would begin two days later. The following day I dismissed&#xA;the house staff, had them take the day off and go purchase groceries and supplies.&#xA;I assured them that they would still receive their salaries and that they would&#xA;have job once this was over.&lt;/p&gt;&#xA;&lt;h2&gt;The first month&lt;/h2&gt;&#xA;&lt;p&gt;Once the first cases were reported everything started moving too fast. By Sunday&#xA;every supermarket was swamped with people and supplies started dwindling. I felt&#xA;a bit validated knowing I had prepared myself with a couple months worth of&#xA;food. That sense of validation didn&#39;t really last long.&lt;/p&gt;&#xA;&lt;p&gt;For the first couple of weeks everything was under strict lockdown and looked&#xA;like Honduras wouldn&#39;t spiral too bad. Wishful thinking.&lt;/p&gt;&#xA;&lt;p&gt;The 20th we had a nice break with the release of Animal Crossing: New Horizons.&#xA;It came in at the best time, the boredom was settling in and everyone with a&#xA;switch was playing it. It felt like a community event, everyone was alone,&#xA;playing together. It carried us over a month or two.&lt;/p&gt;&#xA;&lt;p&gt;By the end of march the food was a little less varied so it seemed like the&#xA;right time to resupply. It looked like all supermarkets were booked for&#xA;deliveries for a month or so in advanced so we had to get creative. For&#xA;non-perishable we used a small supermarket that specialized in organic goods.&#xA;It&#39;s variety wasn&#39;t great and it was really expensive but it allowed us to get&#xA;some basics and some not-so-basics while the regular supermarkets got their act&#xA;together.&lt;/p&gt;&#xA;&lt;p&gt;Mid April everything got a lot better. We found a local catering company that&#xA;being unable to cater, had started selling vegetables, dairy and eggs. Getting&#xA;fresh vegetables for the first time after almost two months gave me back my will&#xA;to live.&lt;/p&gt;&#xA;&lt;h2&gt;The following 4 months&lt;/h2&gt;&#xA;&lt;p&gt;As the pandemic raged on I realized I was not doing too great. I had become a&#xA;bit of a hypochondriac and had developed some anxiety. I had been stuck in my&#xA;apartment for a while now so it seemed justified. One day I decided I wanted to&#xA;get into therapy. I found a nice Colombian psychologist that would treat me&#xA;online. It worked out great and after a month or two I felt better and was told&#xA;I could stop going.&lt;/p&gt;&#xA;&lt;p&gt;Whenever I am bored I get started on new hobbies. I had a ton of paint around&#xA;the apartment so I started painting. I would experiment quite a bit with&#xA;acrylics, I didn&#39;t like how glossy they were but it grew on me. I eventually&#xA;started drawing over them with markers and developed a bit of a &amp;quot;style&amp;quot;. I would&#xA;paint quite a bit over the next couple of months.&lt;/p&gt;&#xA;&lt;p&gt;{% image painting.jpg &amp;quot;One of the many paintings I did over the pandemic. An infinity net over a red background.&amp;quot;%}&lt;/p&gt;&#xA;&lt;p&gt;As the sense of normalcy grew and I had more time off I started playing Call of&#xA;Duty with Carlos and Carla. It happened almost by accident but we started&#xA;playing a couple of hours every day. It was great fun, they&#39;ve been my best&#xA;friends for the longest time and being able to spend time with them, even if&#xA;only online, felt awesome.&lt;/p&gt;&#xA;&lt;p&gt;Eventually I fell back to my oldest habit, overworking. I decided I wanted to be&#xA;more productive and get more done. I had been toying with an idea to help local&#xA;companies get their products online. Honduras is really far behind on this sort&#xA;of thing and during the pandemic it really showed. I&#39;ve had an Estonian&#xA;e-residency for a while so I used that to incorporate a business and started&#xA;working on the app. I would let it sit to focus on my day job soon after.&lt;/p&gt;&#xA;&lt;p&gt;Up to this point we had been using a small refrigerator I bought back when I&#xA;first moved in. It was fine at the beginning but since getting delivery was hard&#xA;it made more sense to order more food and store it than try to order when&#xA;needed. We got a new fridge which was a pretty large QOL upgrade at the time.&#xA;Sounds weird but it really cheered us up.&lt;/p&gt;&#xA;&lt;p&gt;At this point my anxiety had improved so I decided to let myself drink coffee&#xA;again. It&#39;s always been a large part of my life so it felt like that&#39;d help me&#xA;go back &amp;quot;normal&amp;quot;. I decided to make a hobby off it (it technically already was)&#xA;and got myself a espresso machine. I named it Pino.&lt;/p&gt;&#xA;&lt;p&gt;{% image pino.jpg &amp;quot;Pino the espresso machine&amp;quot;%}&lt;/p&gt;&#xA;&lt;p&gt;I eventually start working on my small side project, a site to simplify selling&#xA;online, elmarket.&lt;/p&gt;&#xA;&lt;h2&gt;The rest of 2020&lt;/h2&gt;&#xA;&lt;p&gt;Very little happened the rest of the year:&lt;/p&gt;&#xA;&lt;p&gt;We raised moths.&lt;/p&gt;&#xA;&lt;p&gt;{% image marimoth.jpg &amp;quot;One of the moths we raised, marimoth&amp;quot;%}&lt;/p&gt;&#xA;&lt;p&gt;We would raise more moths the following year at around the same time of the&#xA;year.&lt;/p&gt;&#xA;&lt;p&gt;Customs eventually reopened so we bought some extra art supplies. I got a new&#xA;camera (Which I called Prismo). I painted some more. My sister suggested we run&#xA;a book club, we read one book, tiny fire everywhere, I hated it and decided to&#xA;stop book clubbing.&lt;/p&gt;&#xA;&lt;p&gt;{% image painting2.jpg &amp;quot;Another painting of mine from that time&amp;quot;%}&lt;/p&gt;&#xA;&lt;p&gt;I took a couple of weeks off in December to try to chill for a bit.&lt;/p&gt;&#xA;&lt;p&gt;{% image sky.jpg &amp;quot;A picture of the sky&amp;quot;%}&lt;/p&gt;&#xA;&lt;h2&gt;A New Year&lt;/h2&gt;&#xA;&lt;p&gt;On my first day back after the Christmas break we were told at Azlo that our CEO&#xA;was leaving. The following day they announced we would be shutting down. Our&#xA;parent company had been sold off and no one really wanted to keep operating&#xA;Azlo.&lt;/p&gt;&#xA;&lt;p&gt;Since I was still stuck home I immediately started interviewing and looking for a&#xA;new gig. I found a really nice job at Blueonion Labs. They were doing really&#xA;cool things that closely matched the reconciliation stuff I was doing at Azlo. I&#xA;would start the week after my birthday. I decided to ignore it that year, it&#xA;didn&#39;t seem fair to count it.&lt;/p&gt;&#xA;&lt;p&gt;We got a roomba shortly after, it was surprisingly helpful, we were spending&#xA;quite a bit of time cleaning and just having it run everyday made it way easier.&lt;/p&gt;&#xA;&lt;p&gt;I started working at Blueonion Labs.&lt;/p&gt;&#xA;&lt;p&gt;We found Pitt, the chunkiest boy. We originally offered him to Edward for&#xA;adoption but he didn&#39;t want to adopt him. After a couple of days, even though we thought&#xA;we had enough cats, we ended up falling in love with him.&lt;/p&gt;&#xA;&lt;p&gt;{% image pitt.jpg &amp;quot;Pitt, the cat&amp;quot;%}&lt;/p&gt;&#xA;&lt;p&gt;We finally got our first vaccine shot in August. It was nice, it felt like maybe&#xA;it was coming to an end.&lt;/p&gt;&#xA;&lt;p&gt;A bit later my grandfather died from Covid. My uncle followed a couple of weeks&#xA;later.&lt;/p&gt;&#xA;&lt;p&gt;I left my job. I was feeling a bit burnt out and depressed.&lt;/p&gt;&#xA;&lt;p&gt;Towards the end of September we were fully immunized and decided it was time to&#xA;start moving on. We started planning a trip, it&#39;d be the third time leaving the&#xA;house in 18 months. The other two were for vaccinations.&lt;/p&gt;&#xA;&lt;p&gt;Shortly before leaving we found Gomita, the newest member of our family. We had&#xA;no intentions of adopting another cat at the point but she needed a ton of help&#xA;and it didn&#39;t seem fair to pin her off on someone else. So we kept her. No&#xA;regrets.&lt;/p&gt;&#xA;&lt;p&gt;{% image gomita.jpg &amp;quot;Gomita, the cat&amp;quot;%}&lt;/p&gt;&#xA;&lt;p&gt;We left for Europe in October and spent a couple of weeks over there. I had to&#xA;go to Estonia to open a bank account for the company I had founded the year&#xA;before but we spent the rest of time relaxing and doing normally touristy stuff&#xA;(mostly eating).&lt;/p&gt;&#xA;&lt;p&gt;{% image me.jpg &amp;quot;A picture of the author&amp;quot;%}&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;We are about 4 weeks away from being fully immunized which is as far as I&#xA;know, the closest thing to an end there can be for the time being.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
      <pubDate>Fri, 05 Aug 2022 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Installing FlatCAM on Ubuntu</title>
      <link>https://martianwabbit.com/2021/01/22/installing-flatcam-with-pyenv.html</link>
      <description>&lt;p&gt;So FlatCAM is an essential part of my PCB milling workflow and has become&#xA;increasingly difficult to install on the latest version of Ubuntu. Here&#39;s a&#xA;couple of notes on how I managed to get it running.&lt;/p&gt;&#xA;&lt;p&gt;The first thing is to clone the repo:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;git clone https://bitbucket.org/jpcgt/flatcam&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Something I didn&#39;t notice at first is that there&#39;s a beta branch available, it&#xA;uses newer versions of pyqt which makes everything way easier.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;git checkout origin/Beta&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;If you are on Ubuntu you can run &lt;code&gt;ubuntu_setup.sh&lt;/code&gt; and should install pretty&#xA;much everything you need. I did hit a snag though, for whatever reason if I&#xA;tried installing the requirements, gdal would not compile. Turns out&#xA;it comes down to it not finding the correct headers. You can get around it by&#xA;installing it manually like this:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;sudo apt install libgdal-dev gdal-bin&#xA;pip install gdal==3.0.4 --global-option=build_ext --global-option=&amp;quot;-I/usr/include/gdal/&amp;quot;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;You should use whatever version &lt;code&gt;gdal-config --version&lt;/code&gt; prints out. You should&#xA;also update the &lt;code&gt;requirements.txt&lt;/code&gt; so that the version of gdal is also the same&#xA;so that the rest of the dependencies install.&lt;/p&gt;&#xA;&lt;p&gt;Once that&#39;s up you can run it with &lt;code&gt;python FlatCAM.py&lt;/code&gt;.&lt;/p&gt;&#xA;</description>
      <pubDate>Fri, 22 Jan 2021 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Haproxy, Nginx and Dokku</title>
      <link>https://martianwabbit.com/2021/01/04/haproxy-nginx-and-dokku.html</link>
      <description>&lt;p&gt;I just finished setting up a wordpress site for my sister over the past weekend.&#xA;I usually setup some plugins to automatically block bruteforce attempts on these&#xA;since they are so common. Everything went smooth as usual until I checked in on&#xA;it the next morning and found myself blocked. I checked the logs and it turns&#xA;out it banned the reverse proxy&#39;s ip.&lt;/p&gt;&#xA;&lt;p&gt;I am using Haproxy as a reverse proxy / load balancer for the entire server but&#xA;the ssl is handled by dokku which means Haproxy runs in tcp mode and doesn&#39;t do&#xA;much other than route the traffic. Dokku also has a reverse proxy which it uses&#xA;to handle domains, it uses Nginx for this.&lt;/p&gt;&#xA;&lt;p&gt;It turns out Haproxy can&#39;t add requests to an https request that terminates on a&#xA;different server. This makes sense but wasn&#39;t obvious from the get go, the easy&#xA;solution was to use the proxy protocol so that Haproxy and Nginx can agree on&#xA;which ip is which.&lt;/p&gt;&#xA;&lt;p&gt;Here&#39;s how to do it:&lt;/p&gt;&#xA;&lt;p&gt;First, we need to tell Haproxy to use the proxy protocol. All we have to do is&#xA;add &lt;code&gt;send-proxy&lt;/code&gt; to the server option. This will send over all of the info Nginx&#xA;will need to find the correct ip.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;backend web&#xA;        mode tcp&#xA;        server web-http dokku send-proxy&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Next we need to tell Nginx to actually use that info. This is done by adding the&#xA;&lt;code&gt;proxy_protocol&lt;/code&gt; parameter to the listen option.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;server {&#xA;  listen      443 ssl proxy_protocol http2;&#xA;  ...&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Finally, we need to set the request&#39;s &lt;code&gt;X-Forwarded-For&lt;/code&gt; header to the real ip.&#xA;We can achieve this by adding a new conf file in&#xA;&lt;code&gt;/etc/nginx/conf.d/set_real_ip.conf&lt;/code&gt;. You can name it whatever you want, it&#xA;should look something like this:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;set_real_ip_from  10.0.0.0/8;&#xA;set_real_ip_from  172.0.0.0/8;&#xA;real_ip_header proxy_protocol;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;You should list off all of the proxies that are part of the chain here.&#xA;&lt;code&gt;proxy_protocol&lt;/code&gt; will take care to set the &lt;code&gt;X-Forwarded-For&lt;/code&gt; ip to the correct&#xA;value automatically.&lt;/p&gt;&#xA;</description>
      <pubDate>Mon, 04 Jan 2021 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>KVM Backups, the easy way</title>
      <link>https://martianwabbit.com/2020/10/30/kvm-backups-the-easy-way.html</link>
      <description>&lt;p&gt;I am now using a dedicated server to host all of my various projects. It turns&#xA;out if you are willing to do a lot of the work yourself you can get quite a bit&#xA;for you buck. Since I have to take care of backups myself now I had to rethink&#xA;my general backup strategy.&lt;/p&gt;&#xA;&lt;p&gt;In the name of being as lazy as possible what I&#39;ve been doing now is using&#xA;libvirt to create individual VMs for every project. To back them up I can just&#xA;copy off the entire disk somewhere else. Once compressed these are relatively&#xA;small for what they are and are easy to move around into storage.&lt;/p&gt;&#xA;&lt;p&gt;I am also using git underneath almost everything so that actual code and assets&#xA;are also backed up locally and on github/gitea etc.&lt;/p&gt;&#xA;&lt;p&gt;Anyways, here&#39;s what I am using to back machines up:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;DOMAIN&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;$1&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;DISK&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;$(&lt;/span&gt;virsh domblklist &lt;span style=&#34;color:#ebbcba&#34;&gt;$DOMAIN&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;|&lt;/span&gt; tail -n +3 &lt;span style=&#34;color:#908caa&#34;&gt;|&lt;/span&gt; awk &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;|&lt;/span&gt; tr -d &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;\n&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;TIME&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;$(&lt;/span&gt;date &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;+%Y-%m-%d--%H.%M.%S&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;virsh snapshot-create-as --domain &lt;span style=&#34;color:#ebbcba&#34;&gt;$DOMAIN&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;$DOMAIN&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;-backup&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;&lt;/span&gt;        --diskspec vda,file&lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt;/var/lib/libvirt/images/&lt;span style=&#34;color:#ebbcba&#34;&gt;$DOMAIN&lt;/span&gt;-backup.qcow2 &lt;span style=&#34;color:#31748f&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;&lt;/span&gt;        --disk-only --atomic --quiesce --no-metadata&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;xz -k --verbose /var/lib/libvirt/images/&lt;span style=&#34;color:#ebbcba&#34;&gt;$DOMAIN&lt;/span&gt;.qcow2&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl --netrc -T /var/lib/libvirt/images/&lt;span style=&#34;color:#ebbcba&#34;&gt;$DOMAIN&lt;/span&gt;.qcow2.xz ftp://ftp.example.org/&lt;span style=&#34;color:#ebbcba&#34;&gt;$DOMAIN&lt;/span&gt;.&lt;span style=&#34;color:#ebbcba&#34;&gt;$TIME&lt;/span&gt;.qcow2.xz&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;virsh blockcommit &lt;span style=&#34;color:#ebbcba&#34;&gt;$DOMAIN&lt;/span&gt; vda --active --verbose --pivot&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rm /var/lib/libvirt/images/&lt;span style=&#34;color:#ebbcba&#34;&gt;$DOMAIN&lt;/span&gt;.qcow2.xz&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rm /var/lib/libvirt/images/&lt;span style=&#34;color:#ebbcba&#34;&gt;$DOMAIN&lt;/span&gt;-backup.qcow2&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;First I create a snapshot for the current machine I&#39;ll be backing up, these&#xA;machines are running the qemu agent so I get to use &lt;code&gt;--quiesce&lt;/code&gt; to freeze the&#xA;file system. If you don&#39;t have the agent installed you&#39;d probably have to make&#xA;some small changes to the command.&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;virsh snapshot-create-as --domain &lt;span style=&#34;color:#ebbcba&#34;&gt;$DOMAIN&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;$DOMAIN&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;-backup&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;&lt;/span&gt;        --diskspec vda,file&lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt;/var/lib/libvirt/images/&lt;span style=&#34;color:#ebbcba&#34;&gt;$DOMAIN&lt;/span&gt;-backup.qcow2 &lt;span style=&#34;color:#31748f&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;&lt;/span&gt;        --disk-only --atomic --quiesce --no-metadata&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Once that&#39;s done I&#39;ll compress it using &lt;code&gt;xz&lt;/code&gt;. This will make the backup tiny but&#xA;it takes a really long time, you could use zip, tar or nothing at all if you&#xA;want the whole process to be faster.&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;xz -k --verbose /var/lib/libvirt/images/&lt;span style=&#34;color:#ebbcba&#34;&gt;$DOMAIN&lt;/span&gt;.qcow2&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now we can upload the compressed file to our backup location. I use curl to&#xA;upload to a local network drive I have available. I also attach a timestamp to&#xA;the file name as I do this.&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl --netrc -T /var/lib/libvirt/images/&lt;span style=&#34;color:#ebbcba&#34;&gt;$DOMAIN&lt;/span&gt;.qcow2.xz ftp://ftp.example.org/&lt;span style=&#34;color:#ebbcba&#34;&gt;$DOMAIN&lt;/span&gt;.&lt;span style=&#34;color:#ebbcba&#34;&gt;$TIME&lt;/span&gt;.qcow2.xz&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Finally I will use blockcommit to pivot back to the original disk image, merging&#xA;the contents of the backup and anything that&#39;s happened since the snapshot was&#xA;taken, and remove the unnecessary snapshot and compressed files.&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;virsh blockcommit &lt;span style=&#34;color:#ebbcba&#34;&gt;$DOMAIN&lt;/span&gt; vda --active --verbose --pivot&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rm /var/lib/libvirt/images/&lt;span style=&#34;color:#ebbcba&#34;&gt;$DOMAIN&lt;/span&gt;.qcow2.xz&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rm /var/lib/libvirt/images/&lt;span style=&#34;color:#ebbcba&#34;&gt;$DOMAIN&lt;/span&gt;-backup.qcow2&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It took me a bit to figure out how to do this which is why I am documenting it&#xA;here for myself. Most of this is based of off &lt;a href=&#34;https://wiki.libvirt.org/page/Live-disk-backup-with-active-blockcommit&#34;&gt;this wiki&#xA;entry&lt;/a&gt;.&lt;/p&gt;&#xA;</description>
      <pubDate>Fri, 30 Oct 2020 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>PocketChip in 2020</title>
      <link>https://martianwabbit.com/2020/10/24/pocketchip-in-2020.html</link>
      <description>&lt;p&gt;After many years of wanting one and then giving up on them when the company went&#xA;under, I finally acquired a PocketChip. This thing is great. Not all around&#xA;great but great &lt;em&gt;in principle&lt;/em&gt;. It has a great form factor with a nice screen&#xA;and great battery life. I quite like it. I&#39;ve been using it to control my&#xA;plotters wirelessly, for counting words on my typewriter and to backup my op-z.&#xA;I&#39;ve ran into a bunch of issues along the way so here are my notes on it, what&#39;s&#xA;worked and what hasn&#39;t in case someone else wants to give it a go.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/files/2020-10-24-pocketchip-in-2020/pocket-chip.jpg&#34; alt=&#34;My PocketChip&#34;&gt;&lt;/p&gt;&#xA;&lt;h2&gt;Apt Sources&lt;/h2&gt;&#xA;&lt;p&gt;The first thing you should do is change you apt sources. It turns out when the&#xA;NextThingCo went under they took their mirrors with them (naturally). Luckily a&#xA;valuable member of the community took the time to create a mirror for it we can&#xA;all use &lt;a href=&#34;http://chip.jfpossibilities.com/chip/debian/&#34;&gt;here&lt;/a&gt;. That same member&#xA;of the community also took the time to mirror all of NextThingCo&#39;s repositories&#xA;and other goodies:&#xA;&lt;a href=&#34;http://chip.jfpossibilities.com/&#34;&gt;http://chip.jfpossibilities.com/&lt;/a&gt; this is in&#xA;general the single best resource of data and code available for the chip in&#xA;2020.&lt;/p&gt;&#xA;&lt;p&gt;I ran into an issue with Jessie backports, as the distribution is pretty old&#xA;it&#39;ll be necessary to update your apt sources to use the debian archive mirror:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;deb http://security.debian.org/ jessie/updates main&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;deb-src http://security.debian.org/ jessie/updates main&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;deb http://archive.debian.org/debian/ jessie-backports main&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;deb-src http://archive.debian.org/debian/ jessie-backports main&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;deb http://archive.debian.org/debian/ jessie main contrib non-free&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;deb-src http://archive.debian.org/debian/ jessie main contrib non-free&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Don&#39;t forget to disable validity checks:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Acquire::Check-Valid-Until false;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;|&lt;/span&gt; sudo tee -a /etc/apt/apt.conf.d/10-nocheckvalid&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;SSH Access&lt;/h2&gt;&#xA;&lt;p&gt;The PocketChip doesn&#39;t include an ssh server by default so I&#39;d recommend&#xA;installing one once you&#39;ve gotten your apt updating and running:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get install openssh-server&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Checking the Battery Level&lt;/h2&gt;&#xA;&lt;p&gt;There&#39;s two magic files in the os that reflect your current battery state, you&#xA;can use &lt;code&gt;/usr/lib/pocketchip-batt/voltage&lt;/code&gt; to check how charged your PocketChip&#xA;is and you can use &lt;code&gt;/usr/lib/pocketchip-batt/charging&lt;/code&gt; to check if it&#39;s charging&#xA;or not. These are mostly useful for scripts and such.&lt;/p&gt;&#xA;&lt;p&gt;The voltage range is from &lt;code&gt;3600&lt;/code&gt; to &lt;code&gt;4200&lt;/code&gt; from what I&#39;ve seen.&lt;/p&gt;&#xA;&lt;h2&gt;Using UART&lt;/h2&gt;&#xA;&lt;p&gt;If you want to use the built-in UART you need to shutdown getty:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl stop serial-getty@ttyS0.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You can then use &lt;code&gt;/dev/ttyS0&lt;/code&gt; as you normally would as a terminal or programmer&#xA;and &lt;code&gt;stty&lt;/code&gt; to check the config &lt;code&gt;stty -F /dev/ttyS0&lt;/code&gt; or change it&#xA;&lt;code&gt;stty -F /dev/ttyUSB0 9600&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2&gt;A full desktop environment&lt;/h2&gt;&#xA;&lt;p&gt;If you want to have a full desktop environment running on your chip, you can use&#xA;&lt;a href=&#34;https://github.com/AllGray/PocketDesk&#34;&gt;PocketDesk&lt;/a&gt;, which sets it up for you.&lt;/p&gt;&#xA;&lt;h2&gt;Using your GPIO Pins&lt;/h2&gt;&#xA;&lt;p&gt;This actually took a lot of tinkering and was going to be the original focus of&#xA;this blog post.&lt;/p&gt;&#xA;&lt;p&gt;PocketOS provides an easy way (once you figure it out) to enable or disable gpio&#xA;pins. Under &lt;code&gt;/sys/class/gpio&lt;/code&gt; there&#39;s two sinks &lt;code&gt;export&lt;/code&gt; and &lt;code&gt;unexport&lt;/code&gt;. As&#xA;&lt;code&gt;root&lt;/code&gt; you can use &lt;code&gt;export&lt;/code&gt; to enable a gpio pin by piping it the pin&#39;s&#xA;identifier:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;1015&lt;/span&gt; &amp;gt; /sys/class/gpio/export&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Apparently these identifiers changed depending on the OS version, on mine it&#xA;starts with GPIO 1 as &lt;code&gt;1015&lt;/code&gt; and follows with GPIO 2 on &lt;code&gt;1016&lt;/code&gt; and so on. When&#xA;you are done using a pin you should &lt;code&gt;unexport&lt;/code&gt; it:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;1015&lt;/span&gt; &amp;gt; /sys/class/gpio/unexport&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;While the pin is exported you can set three settings according to what you are&#xA;trying to achieve:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Pin direction:&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;in&amp;#34;&lt;/span&gt; &amp;gt; /sys/class/gpio/gpio1015/direction&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;out&amp;#34;&lt;/span&gt; &amp;gt; /sys/class/gpio/gpio1015/direction&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;Active Low:&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;1&lt;/span&gt; &amp;gt; /sys/class/gpio/gpio1015/active_low&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;0&lt;/span&gt; &amp;gt; /sys/class/gpio/gpio1015/active_low&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;Edge detection:&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;rising&amp;#34;&lt;/span&gt; &amp;gt; /sys/class/gpio/gpio1015/edge&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;falling&amp;#34;&lt;/span&gt; &amp;gt; /sys/class/gpio/gpio1015/edge&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt; &amp;gt; /sys/class/gpio/gpio1015/edge&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You can check the GPIO&#39;s state by reading the value:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat /sys/class/gpio/gpio1015/value&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e6a86&#34;&gt;# Either 0 or 1 depending on the current state of the pin.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Since this behaves like a normal file and emits events you can use anything that&#xA;uses inotify to watch it. For example, here&#39;s how you&#39;d monitor a button press&#xA;using inotify-hookable:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;cd&lt;/span&gt; /sys/class/gpio&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;1015&lt;/span&gt; &amp;gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;export&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;cd&lt;/span&gt; gpio1015&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;0&lt;/span&gt; &amp;gt; active_low&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;in&amp;#34;&lt;/span&gt; &amp;gt; direction&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;rising&amp;#34;&lt;/span&gt; &amp;gt; edge&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;inotify-hookable -f ./value -c &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;cat ./value&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;There&#39;s some extra information about the pins in the&#xA;&lt;a href=&#34;http://web.archive.org/web/20210222094348/http://www.chip-community.org/index.php/GPIO_Info&#34;&gt;community wiki&lt;/a&gt;.&#xA;The pin numbers seem wrong for the pocketchip but the rest of the information&#xA;available seems solid.&lt;/p&gt;&#xA;&lt;h2&gt;Configure the app launcher&lt;/h2&gt;&#xA;&lt;p&gt;The default built-in launcher for the PocketChip, PocketHome, can be minimally&#xA;configured by editing a json file &lt;code&gt;/usr/share/pocket-home/config.json&lt;/code&gt;. You can&#xA;change the apps and the icons from there among other small niceties.&lt;/p&gt;&#xA;&lt;p&gt;I&#39;d recommend changing the terminal to xfce-terminal, it comes pre-installed and&#xA;seems to be better in general, I changed the terminal button to this:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Terminal&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;&amp;#34;shell&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;xfce-terminal --hide-borders --fullscreen --hide-menubar&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;&amp;#34;icon&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;appIcons/terminal.png&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You need to restart the entire PocketChip for the changes to kick in.&lt;/p&gt;&#xA;&lt;p&gt;Also, if you are ever using a keyboard, dmenu is installed and mapped to alt +&#xA;space which is super nice for quickly switching apps.&lt;/p&gt;&#xA;&lt;p&gt;And that&#39;s it, I think, everything I&#39;ve had to figure out about the PocketChip,&#xA;distilled into one blog post. Let me know if there&#39;s anything important you&#xA;think I should know.&lt;/p&gt;&#xA;</description>
      <pubDate>Sat, 24 Oct 2020 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Setting up Ruby on Rails System Tests on WSL with Docker</title>
      <link>https://martianwabbit.com/2020/05/26/setting-up-ruby-on-rails-system-tests-on-wsl.html</link>
      <description>&lt;p&gt;For some context, I recently started a new RoR project on Windows. The process went remarkably smooth. Everything worked out of the box. Well, everything except for system tests.&lt;/p&gt;&#xA;&lt;p&gt;It turns out Capybara will, by default, any chrome instance installed on your local machine. That&#39;s normally great except for when there isn&#39;t one available. Luckily there is a surprisingly easy way to achieve this in a cross-platform way. Docker. There are great docker images that can run a headless Chrome or Firefox instance for you, selenium even has a hub to administrate all of these instances. The configuration for this within rails is easy but poorly documented which brings us to this post.&lt;/p&gt;&#xA;&lt;p&gt;To get started you should setup Selenium hub and a browser or two, if you are using docker already it&#39;s as simple as creating this &lt;code&gt;docker-compose.yml&lt;/code&gt; file:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;version&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;3.1&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;services&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;hub&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ebbcba&#34;&gt;image&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;selenium/hub:3.141.59-20200515&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ebbcba&#34;&gt;ports&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;4444:4444&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;chrome&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ebbcba&#34;&gt;image&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;selenium/node-chrome:3.141.59-20200515&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ebbcba&#34;&gt;volumes&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f6c177&#34;&gt;/dev/shm:/dev/shm&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ebbcba&#34;&gt;depends_on&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f6c177&#34;&gt;hub&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ebbcba&#34;&gt;environment&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#ebbcba&#34;&gt;HUB_HOST&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;hub&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#ebbcba&#34;&gt;HUB_PORT&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;4444&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Once that&#39;s setup and running we can now go ahead and tell rails to use this hub for all of our testing needs. The first thing we have to do is remove &lt;code&gt;webdrivers&lt;/code&gt; from our &lt;code&gt;gemfile&lt;/code&gt;. As long as that&#39;s installed capybara will keep trying to use our local chrome instead.&lt;/p&gt;&#xA;&lt;p&gt;Now we have to change the default chrome driver to use the selenium hub instead:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e6a86&#34;&gt;# application_system_test_case.rb &lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;require&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;test_helper&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#9ccfd8&#34;&gt;ApplicationSystemTestCase&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;ActionDispatch&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;SystemTestCase&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;driven_by&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;:selenium&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;using&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;:chrome&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;screen_size&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;1600&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;1080&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;options&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f6c177&#34;&gt;url&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;http://localhost:4444/wd/hub&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f6c177&#34;&gt;desired_capabilities&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;Selenium&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;WebDriver&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;Remote&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;Capabilities&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;chrome&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f6c177&#34;&gt;chromeOptions&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;args&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;%w[headless window-size=1600x1080]&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This would be mostly it if we are running rails containerized as well but since my rails runs on the host machine we need to tell headless chrome to visit rails on the host machine so you also have to modify the setup code:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e6a86&#34;&gt;# application_system_test_case.rb &lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;require&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;test_helper&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#9ccfd8&#34;&gt;ApplicationSystemTestCase&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;ActionDispatch&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;SystemTestCase&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#908caa&#34;&gt;...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;setup&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#f6c177&#34;&gt;Capybara&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;server_host&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;0.0.0.0&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#f6c177&#34;&gt;Capybara&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;server&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;:puma&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;Threads&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;1:1&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#f6c177&#34;&gt;Capybara&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;app_host&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;http://host.docker.internal:&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;#{&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;Capybara&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;current_session&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;server&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;port&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#ebbcba&#34;&gt;host!&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;http://host.docker.internal:&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;#{&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;Capybara&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;current_session&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;server&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;port&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#31748f&#34;&gt;super&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The key idea here is that rails instances created by capybara when testing should be bound to &lt;code&gt;0.0.0.0&lt;/code&gt; so they are available to the chrome container, these will get a random port assigned and we can use it along with &lt;code&gt;host.docker.internal&lt;/code&gt; to allow chrome to connect to it.&lt;/p&gt;&#xA;&lt;p&gt;It turns out it&#39;s pretty easy to setup once you figure it out!&lt;/p&gt;&#xA;</description>
      <pubDate>Tue, 26 May 2020 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Notes on a Roland DXY-1150</title>
      <link>https://martianwabbit.com/2019/10/25/notes-on-a-roland-dxy-1150.html</link>
      <description>&lt;p&gt;I recently acquired a second plotter to complement my HP-7475A. I&#39;ve been&#xA;meaning to get an XY plotter so that I can use taller pens without modifying the&#xA;case of my hp plotter. These Roland plotters are both beautiful and very&#xA;functional so I&#39;ve been waiting for a nice looking one to show up on my feed. It&#xA;finally did.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/files/2019-10-25-notes-on-a-roland-dxy-1150/plotter.jpg&#34; alt=&#34;Roland DXY-1150 Plotter&#34;&gt;&lt;/p&gt;&#xA;&lt;h2&gt;The Power Supply&lt;/h2&gt;&#xA;&lt;p&gt;I overpaid quite a bit for it but it was what I wanted so I figured it was worth&#xA;it. It was about $150.00 without a power supply. A word of warning, DO NOT BUY&#xA;ONE OF THESE WITHOUT A POWERSUPPLY. I am not the first person to say this but I&#xA;decided to ignore that advice. I was lucky to find a power supply for it for an&#xA;additional $30. All in all I ended up paying a bit over $200 for it (don&#39;t get&#xA;me started on how much it was to ship it to Honduras). If you are looking for a&#xA;power supply the model number is &lt;code&gt;DCP-302A&lt;/code&gt;. It is a dual voltage power supply&#xA;with one rail providing 31V 0.7A DC and another providing 9.7V 0.7A DC.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/files/2019-10-25-notes-on-a-roland-dxy-1150/power-supply.jpg&#34; alt=&#34;Roland DCP-302A Power Supply&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Here&#39;s the pinout just in case:&lt;/p&gt;&#xA;&lt;p&gt;{% image roland-DCP-302A-pinout.svg &amp;quot;A diagram of the power supplys pinout&amp;quot; diagram %}&lt;/p&gt;&#xA;&lt;h2&gt;Communicating With The Plotter&lt;/h2&gt;&#xA;&lt;p&gt;Luckily this plotter has two different ports, which makes communicating with it&#xA;very convenient. The serial port is fairly straightforward to use so I went with&#xA;it. Turns out getting a USB to Serial adapter in Honduras was a bit harder than&#xA;I expected. I did end up finding a DB9 USB to Serial adapter. The plotter has a&#xA;DB25 serial port so that was only half of it. Luckily my plotter came with a&#xA;PS/2 to DB25 cable I could sacrifice to make an adapter.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/files/2019-10-25-notes-on-a-roland-dxy-1150/original-cable.jpg&#34; alt=&#34;The PS/2 to DB25 serial cable my plotter came with&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;My DB9 USB to Serial adapter was male so I bought one of these DB-9 female&#xA;adapters to replace the PS/2 end of my cable with.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/files/2019-10-25-notes-on-a-roland-dxy-1150/DB9-female-adapter.jpg&#34; alt=&#34;The DB9 female adapter I replaced the PS/2 end with&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Luckily Roland tells us what pin goes where in their user manual so setting it&#xA;up was fairly easy.&lt;/p&gt;&#xA;&lt;p&gt;{% image serial-interface-diagram.svg &amp;quot;Rolands pinout chart as shown in the user manual&amp;quot; diagram %}&lt;/p&gt;&#xA;&lt;p&gt;Here&#39;s how I wired it:&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&lt;thead&gt;&#xA;&lt;tr&gt;&#xA;&lt;th style=&#34;text-align:left&#34;&gt;DB25 Pin&lt;/th&gt;&#xA;&lt;th style=&#34;text-align:left&#34;&gt;DB9 Pin&lt;/th&gt;&#xA;&lt;/tr&gt;&#xA;&lt;/thead&gt;&#xA;&lt;tbody&gt;&#xA;&lt;tr&gt;&#xA;&lt;td style=&#34;text-align:left&#34;&gt;FG (1)&lt;/td&gt;&#xA;&lt;td style=&#34;text-align:left&#34;&gt;Sleeve (GND)&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&lt;tr&gt;&#xA;&lt;td style=&#34;text-align:left&#34;&gt;TXD (2)&lt;/td&gt;&#xA;&lt;td style=&#34;text-align:left&#34;&gt;RXD (2)&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&lt;tr&gt;&#xA;&lt;td style=&#34;text-align:left&#34;&gt;RXD (3)&lt;/td&gt;&#xA;&lt;td style=&#34;text-align:left&#34;&gt;TXD (3)&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&lt;tr&gt;&#xA;&lt;td style=&#34;text-align:left&#34;&gt;DTR (20)&lt;/td&gt;&#xA;&lt;td style=&#34;text-align:left&#34;&gt;DTR (4)&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&lt;tr&gt;&#xA;&lt;td style=&#34;text-align:left&#34;&gt;SG (7)&lt;/td&gt;&#xA;&lt;td style=&#34;text-align:left&#34;&gt;GND (5)&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Make sure that the TXD goes into the RXD and the RXD into the TXD. It might seem&#xA;obvious but I got it wrong the first time. Luckily these solder-less DB9 plugs&#xA;are easy to reconfigure.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/files/2019-10-25-notes-on-a-roland-dxy-1150/final-cable.jpg&#34; alt=&#34;How all the cables looked like when done&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;That was pretty much it, I plugged everything in and it all came together.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/files/2019-10-25-notes-on-a-roland-dxy-1150/cables-connected.jpg&#34; alt=&#34;How the connection between the DB25 to DB9 adapter and the USB to serial adapter looked like&#34;&gt;&lt;/p&gt;&#xA;&lt;h2&gt;DIP Switches&lt;/h2&gt;&#xA;&lt;p&gt;The dip switches are fairly straight forward, I just kept everything off. So&#xA;just change everything as you need it. I&#39;d recommend changing one at a time.&#xA;Coolterm managed to connect to it without any special settings. Baudrate 9600,&#xA;Databits 8, Parity None, Stop Bits 1, DTR and RTS ON.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/files/2019-10-25-notes-on-a-roland-dxy-1150/dip-switches.jpg&#34; alt=&#34;All of my DIP switches are off&#34;&gt;&lt;/p&gt;&#xA;&lt;h2&gt;Conclusions&lt;/h2&gt;&#xA;&lt;p&gt;This plotter was surprisingly easy to setup. Its worked almost entirely out of&#xA;the box. Had I bought the correct adapter from the start it would have been a 5&#xA;minute affair rather than an hour long one.&lt;/p&gt;&#xA;&lt;video playsinline muted=&#34;muted&#34; autoplay=&#34;autoplay&#34; preload=&#34;auto&#34; loop=&#34;loop&#34;&gt;&#xA;    &lt;source src=&#34;/files/2019-10-25-notes-on-a-roland-dxy-1150/plotter-working.mp4&#34; type=&#34;video/mp4&#34;&gt;&#xA;&lt;/video&gt;&#xA;</description>
      <pubDate>Fri, 25 Oct 2019 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Glitch, The Cat</title>
      <link>https://martianwabbit.com/2019/09/06/glitch-the-cat.html</link>
      <description>&lt;p&gt;Glitch the cat was my best friend for quite a while. This might seem as hyperbole, but that&#39;s exactly who he was. I don&#39;t think I&#39;ve ever gone through anything as hard as losing him. It gets to the point that sometimes I wake up and think about how dull a world without Glitch is and how I might not want to live in that world. I carry on though. He was a beautiful and strong cat who had his own way of showing how much he cared for us. That&#39;s how I&#39;ll always remember him.&lt;/p&gt;&#xA;&lt;p&gt;Goodbye Glitch, The Cat. I love you and you will be missed.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/files/2019-09-06-glitch-the-cat/glitch.JPG&#34; alt=&#34;Glitch, The Cat&#34;&gt;&lt;/p&gt;&#xA;</description>
      <pubDate>Fri, 06 Sep 2019 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Restoring my HP7475A to it’s former glory</title>
      <link>https://martianwabbit.com/2018/10/26/restoring-my-hp7475a.html</link>
      <description>&lt;p&gt;Recently I’ve become obsessed with generative art. As usual I dove in head first.&#xA;I love old HP gear so seeing the HP 7475a as one of the most recommended plotters&#xA;around made it a no brainer. Everyone seems to recommend avoiding getting one with&#xA;a HPIB port; This makes them a lot cheaper than their serial counterparts. I&#xA;managed to get one for 10 bucks!&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/files/2018-10-26-restoring-my-hp7475a/hp7475a.jpeg&#34; alt=&#34;My HP7475a in all of it&#39;s current glory&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;A couple of weeks later it came in through the door. It’s a beautiful machine.&#xA;It’s big and built like a tank, it feels ridiculous. I love this machine. It&#xA;came with a couple of missing bits, the pen carousel was broken, it runs on top&#xA;of a Geneva drive and the small gear was broken (it actually pulverized when I&#xA;first tried moving it around).&lt;/p&gt;&#xA;&lt;video playsinline muted=&#34;muted&#34; autoplay=&#34;autoplay&#34; preload=&#34;auto&#34; loop=&#34;loop&#34;&gt;&#xA;    &lt;source src=&#34;/files/2018-10-26-restoring-my-hp7475a/gear-breaking.mp4&#34; type=&#34;video/mp4&#34;&gt;&#xA;&lt;/video&gt;&#xA;&lt;p&gt;Luckily Geneva drives are well documented and this one was a textbook example so&#xA;designing and 3D printing a replacement was super straightforward.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/files/2018-10-26-restoring-my-hp7475a/new-gear.jpeg&#34; alt=&#34;The newly 3d printed replacement gear&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Once that was in the pen drive came back to life and worked brilliantly. It&#xA;seems to use bumping into the first position to figure out where it’s at making&#xA;it noisy and hilarious to use.&lt;/p&gt;&#xA;&lt;script src=&#34;https://gumroad.com/js/gumroad.js&#34;&gt;&lt;/script&gt;&#xA;&lt;p&gt;&lt;a class=&#34;gumroad-button&#34; href=&#34;https://gum.co/hp7475adrive&#34;&gt;Download Geneva Drive&lt;/a&gt;&lt;/p&gt;&#xA;&lt;video playsinline muted=&#34;muted&#34; autoplay=&#34;autoplay&#34; preload=&#34;auto&#34; loop=&#34;loop&#34;&gt;&#xA;    &lt;source src=&#34;/files/2018-10-26-restoring-my-hp7475a/new-gear-working.mp4&#34; type=&#34;video/mp4&#34;&gt;&#xA;&lt;/video&gt;&#xA;&lt;p&gt;Once the carousel was working as expected I could tackle a bigger issue, pens.&#xA;It turns out plotter pens aren’t nearly as common as one would hope. They are&#xA;hard to find and really expensive so I decided to figure out a more maintainable&#xA;solution. Luckily my plotter came with a couple of dried up pens and some&#xA;not-so-dried ones so I could use them to figure out what I should look up for in&#xA;a pen replacement. I first thought a ballpoint pen would be a good replacement,&#xA;they are cheap, easy to find and replace, and some draw pretty nice lines.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/files/2018-10-26-restoring-my-hp7475a/ballpoint-holder.jpeg&#34; alt=&#34;A 3d printed ballpoint pen holder shaped like a plotter pen&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;I 3D printed a ballpoint pen holder shaped like a plotter pen. I got a couple of&#xA;cheap ballpoint pens and stole their ink cartridges and went to town. It worked&#xA;well but the vibrations seem to yield some shaggy lines. I decided to try&#xA;something closer to the original next, I thought a felt tipped pen would&#xA;probably be a better closer-to-the-real-deal option so I made an adapter for one&#xA;of these Stabilo pens:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/files/2018-10-26-restoring-my-hp7475a/stabilo-holder.jpeg&#34; alt=&#34;A 3d printed plotter pen holder for a Stabilo pen&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a class=&#34;gumroad-button&#34; href=&#34;https://seich.gumroad.com/l/qhiekx&#34;&gt;Download Stabilo Adapter&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;At the end I really liked how the ballpoint pen worked but I think I can still&#xA;get a better line out of a finer Stabilo pen. Yet to test it so it&#39;ll have to&#xA;wait for a later post.&lt;/p&gt;&#xA;&lt;video playsinline muted=&#34;muted&#34; autoplay=&#34;autoplay&#34; preload=&#34;auto&#34; loop=&#34;loop&#34;&gt;&#xA;    &lt;source src=&#34;/files/2018-10-26-restoring-my-hp7475a/ballpoint-pen-plot.mp4&#34; type=&#34;video/mp4&#34;&gt;&#xA;&lt;/video&gt;&#xA;&lt;h2&gt;HPIB&lt;/h2&gt;&#xA;&lt;p&gt;HPIB is an awesome little protocol that’s not very common outside of test&#xA;equipment. The adapters are weird and expensive. If you have old test equipment&#xA;lying around you might benefit from getting one along with a new plotter just&#xA;cause. Don’t let that scare you away. I personally use an old prologix HPIB to&#xA;Serial USB adapter and it works great. No regrets. Don&#39;t destroy an old plotter&#xA;before giving this a go.&lt;/p&gt;&#xA;</description>
      <pubDate>Fri, 26 Oct 2018 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Testing OCLIF apps with Jest</title>
      <link>https://martianwabbit.com/2018/05/25/testing-oclif-with-jest.html</link>
      <description>&lt;p&gt;A couple of weeks ago I spent sometime migrating &lt;a href=&#34;https://beaujs.com&#34;&gt;Beau&lt;/a&gt; from&#xA;commander to OCLIF. I really liked how every command in OCLIF is a stand alone&#xA;class, it just felt tidier. Migrating the CLI was a breeze and I had the whole&#xA;thing running in a couple of hours.&lt;/p&gt;&#xA;&lt;p&gt;After I was done I decided I wanted to add some tests. I mostly cared about the&#xA;output so all I wanted to do was snapshot it and let Jest warn me if it changed&#xA;by accident. I mostly write tests to make rewriting things easier so snapshotting&#xA;covers about 95% of my testing.&lt;/p&gt;&#xA;&lt;p&gt;OCLIF recommends you use mocha and fancy-test for testing apps which is fine but&#xA;since I was already using Jest I didn&#39;t want to add even more dependencies. The&#xA;test helpers OCLIF provides seem nice, they mostly handle stdout and stderr, and&#xA;http requests. These are handy but since I only cared about the output I figured&#xA;I wouldn&#39;t need them.&lt;/p&gt;&#xA;&lt;p&gt;OCLIF makes testing super easy. Every command is a class and every class has a&#xA;static &lt;code&gt;run&lt;/code&gt; method which you can use to, &lt;em&gt;you guessed it&lt;/em&gt;, run the command. It&#xA;takes an array with the arguments the command would normally receive. Given that,&#xA;testing is made super easy.&lt;/p&gt;&#xA;&lt;p&gt;Let&#39;s create a Test command that prints &amp;quot;test&amp;quot; and test that it does so.&lt;/p&gt;&#xA;&lt;p&gt;Here&#39;s our test command:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;Command&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;@oclif/command&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;TestCommand&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;Command&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#31748f&#34;&gt;async&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;run&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#ebbcba&#34;&gt;console&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;log&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;Test&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;module&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;exports&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;TestCommand&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If the CLI was called &lt;code&gt;hello&lt;/code&gt; and we ran &lt;code&gt;hello test&lt;/code&gt; we&#39;d get &#39;test&#39; back. Let&#39;s&#xA;add a test to confirm we are getting the expected result back.&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;describe&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;Test Command&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ebbcba&#34;&gt;it&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;should print Test&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;async&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#31748f&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;result&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;TestCommand&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;run&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;([]);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#ebbcba&#34;&gt;expect&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;result&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;toBe&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;Test&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#908caa&#34;&gt;});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This is cool, but wouldn&#39;t work. Unfortunately the output is written to the&#xA;STDOUT so that means that &lt;code&gt;run&lt;/code&gt; doesn&#39;t actually return anything. Luckily for us&#xA;Jest has spies built-in so all it takes is to add a spy to that call:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ebbcba&#34;&gt;it&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;should print Test&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;async&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#31748f&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;spy&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;jest&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;spyOn&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;process&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;stdout&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;write&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#31748f&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;TestCommand&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;run&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;([]);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#ebbcba&#34;&gt;expect&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;spy&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;toHaveBeenCalledWith&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;Test&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#908caa&#34;&gt;});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;To simplify this you can move the spy to a &lt;code&gt;beforeEach&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;describe&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;Test Command&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#31748f&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;result&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ebbcba&#34;&gt;beforeEach&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(()&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#ebbcba&#34;&gt;result&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;[];&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#ebbcba&#34;&gt;jest&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;spyOn&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;process&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;stdout&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;write&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;mockImplementation&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#ebbcba&#34;&gt;result&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;push&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;val&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#908caa&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#908caa&#34;&gt;});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ebbcba&#34;&gt;afterEach&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(()&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;jest&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;restoreAllMocks&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;());&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ebbcba&#34;&gt;it&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;should print Test&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;async&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#31748f&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;TestCommand&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;run&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;([]);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#ebbcba&#34;&gt;expect&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;result&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;toContain&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;Test&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#908caa&#34;&gt;});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Whenever &lt;code&gt;process.stdout.write&lt;/code&gt; is called you push the value into the result array.&#xA;You can then check if the correct values are a part of the array. I&#39;d just snapshot&#xA;it and call it the day though.&lt;/p&gt;&#xA;&lt;p&gt;Remember that the array that run expects is supposed to be the argv for that command.&#xA;So they should be in the order they are expected and should all be strings.&lt;/p&gt;&#xA;&lt;p&gt;Have fun testing your CLIs.&lt;/p&gt;&#xA;</description>
      <pubDate>Fri, 25 May 2018 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Hardware Debugging: Fixing My HP6236B</title>
      <link>https://martianwabbit.com/2018/02/14/hardware-debugging-hp6236b.html</link>
      <description>&lt;p&gt;I recently added an HP6236B to my small but ever-growing vintage test equipment&#xA;collection. It was in amazing condition when shipped but got smashed quite a bit&#xA;on its way to me. The initial test wasn&#39;t promising:&lt;/p&gt;&#xA;&lt;p&gt;{% video initial_test.mp4 %}&lt;/p&gt;&#xA;&lt;p&gt;The insides looked really clean, and nothing seem out of place so I started&#xA;going through the manual&#39;s debug steps. According to the manual a voltage&#xA;reference should have been broken. So I started there. After replacing the&#xA;reference the power supply behaved exactly the same. It behaved exactly the same&#xA;even without the voltage reference in place so it had to be something else. I&#xA;then proceeded to go through all the test points the manual had marked. All 15&#xA;of them seemed normal.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/files/2018-02-14-hardware-debugging-hp6236b/insides.jpg&#34; alt=&#34;Inside shot of the power supply&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;This took a long time and didn&#39;t really lead anywhere. I gave up and put the&#xA;power supply away for a couple of days. The next time I got around to tinkering&#xA;around with it I decided it was time to see what Jake, my oscilloscope thought&#xA;about it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/files/2018-02-14-hardware-debugging-hp6236b/oscilloscope.jpg&#34; alt=&#34;Jake showing a square-ish wave on screen.&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Something was immediately obvious now, the power supply was oscillating quite a&#xA;bit. Oddly enough, the -20v rail was actually working as intended but with it&#39;s&#xA;range limited to what the 20v rail was stuck to. This was my first major clue. A&#xA;quick check on the schematic showed that the likely culprit were the filtering&#xA;capacitors near the output (C1 and C11).&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/files/2018-02-14-hardware-debugging-hp6236b/schematic.png&#34; alt=&#34;The schematic&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;I went ahead and removed them, replacing C1 with the closest capacitor I could&#xA;find, a 220µF one. It was close enough. The power supply came to life and&#xA;started working &lt;em&gt;almost&lt;/em&gt; as intended.&lt;/p&gt;&#xA;&lt;p&gt;{% video initial_working.mp4 %}&lt;/p&gt;&#xA;&lt;p&gt;The next day I made a quick visit to a local electronic store and got the&#xA;capacitors that needed replacement. A quick soldering job later and power supply&#xA;was back to working as intended. I started fixing some of the broken pieces,&#xA;like the meter holders. Those were not salvageable so I designed and 3d printed&#xA;new ones.&lt;/p&gt;&#xA;&lt;script src=&#34;https://gumroad.com/js/gumroad.js&#34;&gt;&lt;/script&gt;&#xA;&lt;p&gt;&lt;a class=&#34;gumroad-button&#34; href=&#34;https://gum.co/eAfVf&#34; target=&#34;_blank&#34;&gt;Download&#xA;Meter Holders&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/files/2018-02-14-hardware-debugging-hp6236b/holders.jpg&#34; alt=&#34;The broken holders&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Once all the pieces were in, I resoldered the meters, placed everything back&#xA;together and closed it up. I did some load testing and calibration using my&#xA;Kikusui PLZ72w and it was good to go.&lt;/p&gt;&#xA;&lt;p&gt;{% video final_working.mp4 %}&lt;/p&gt;&#xA;&lt;p&gt;It found a nice place right next to my DC load.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/files/2018-02-14-hardware-debugging-hp6236b/final.jpg&#34; alt=&#34;The final piece&#34;&gt;&lt;/p&gt;&#xA;</description>
      <pubDate>Wed, 14 Feb 2018 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Beau 0.4</title>
      <link>https://martianwabbit.com/2017/12/04/beau-0-4.html</link>
      <description>&lt;p&gt;Beau 0.4 is here! It includes some small goodies for ya&#39;ll. Mainly focusing on two things this time.&lt;/p&gt;&#xA;&lt;p&gt;First, Beau now allows you to define requests in one line. If you pass a string as a configuration value it&#39;ll be taken as that request&#39;s alias so, you can get those small repetitive requests out of the way ASAP.&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;GET /users/&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;alias&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;get-users&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;GET /user/$get-users.body.0.userId&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;alias&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;get-user-0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Becomes:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ebbcba&#34;&gt;GET /users/&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;get-users&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ebbcba&#34;&gt;GET /user/$get-users.body.0.userId&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;get-user-0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Much nicer.&lt;/p&gt;&#xA;&lt;p&gt;The second change is the addition of a couple of extra flags to Beau&#39;s CLI: &lt;code&gt;--clean-request&lt;/code&gt; and &lt;code&gt;--clean-list&lt;/code&gt; . These print results for request and list without any formatting. This is mostly to make it easy to integrate Beau with other tools.&lt;/p&gt;&#xA;&lt;p&gt;Speaking of other tools I am releasing a very-much in beta &lt;a href=&#34;https://github.com/Seich/sublime-beau&#34;&gt;plugin for sublime&lt;/a&gt; .&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://raw.githubusercontent.com/Seich/sublime-beau/refs/heads/master/images/demo.gif&#34; alt=&#34;Beau for Sublime demo&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;The plugin allows you to make requests right from the Beau config file you are currently editing. There are several improvements I am currently working on which should be released soon. You can install it by using package control in sublime and searching for &amp;quot;Beau&amp;quot;. Any feedback is welcome at the plugin&#39;s repository: &lt;a href=&#34;https://github.com/Seich/sublime-beau/issues&#34;&gt;https://github.com/Seich/sublime-beau/issues&lt;/a&gt; .&lt;/p&gt;&#xA;&lt;p&gt;That&#39;s it for now, I am working towards releasing a more polished release before the year ends if I get the time. I have lots of new and nice things planned for Beau in the near future.&lt;/p&gt;&#xA;</description>
      <pubDate>Mon, 04 Dec 2017 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Writing Plugins for Beau</title>
      <link>https://martianwabbit.com/2017/04/06/writing-plugins-for-beau.html</link>
      <description>&lt;p&gt;Currently Beau allows plugins to do two different transformations. You can&#xA;change the request settings right before they are used to make the request and&#xA;you can transform the response after the request is finished. This covers all&#xA;use cases I&#39;ve come up with so far. I&#39;ll go over the basics or writing a plugin&#xA;in this post.&lt;/p&gt;&#xA;&lt;h2&gt;The Plugin&lt;/h2&gt;&#xA;&lt;p&gt;The first step is writing the plugin. A Beau plugin is a Javascript class that&#xA;defines any of these methods: &lt;code&gt;preRequest(requestSettings, originalRequest)&lt;/code&gt; and&#xA;&lt;code&gt;postResponse(response)&lt;/code&gt;. They can also receive settings as part of their&#xA;&lt;code&gt;beau.yml&lt;/code&gt;configuration. Here&#39;s the basic skeleton for a new plugin:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;MyPlugin&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;settings&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{})&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#31748f&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;settings&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;settings&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;preRequest&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;req&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;orig&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;postResponse&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;res&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;module&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;exports&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;MyPlugin&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;All you are missing is a basic &lt;code&gt;package.json&lt;/code&gt; to finish the module (just run&#xA;&lt;code&gt;npm init&lt;/code&gt; and go through the steps). Once that&#39;s done you can install your&#xA;plugin globally and use it as part of your &lt;code&gt;beau.yml&lt;/code&gt; like this:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;Host&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;http://localhost:9000&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#ebbcba&#34;&gt;plugins&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       - &lt;span style=&#34;color:#ebbcba&#34;&gt;MyPlugin&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           &lt;span style=&#34;color:#ebbcba&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               &lt;span style=&#34;color:#ebbcba&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;Sergio&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;           &lt;span style=&#34;color:#ebbcba&#34;&gt;secret&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;ssh&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;GET /profile&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#ebbcba&#34;&gt;alias&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;profile&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;GET /&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#ebbcba&#34;&gt;skip_jwt&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#ebbcba&#34;&gt;alias&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;home&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Our plugin will generate a jwt using the secret and data settings and send that&#xA;along with every request. If &lt;code&gt;skip_jwt: true&lt;/code&gt; is part of the request&#39;s&#xA;configuration it won&#39;t attach the header. First I&#39;ll install &lt;code&gt;jsonwebtoken&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm install jsonwebtoken -S&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now all I need is to modify the preRequest so that it changes the headers and&#xA;includes an Authorization with the bearer token:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;preRequest&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;req&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;orig&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#31748f&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;token&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;jwt&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;sign&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;settings&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;data&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{},&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;settings&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;secret&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ebbcba&#34;&gt;req&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;headers&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;Authorization&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;`Bearer &lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This will attach the authorization header to every request. We should also&#xA;handle the case were certain requests don&#39;t need the header. In this case, I&#39;ll&#xA;just check if the original request configuration has the field:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;preRequest&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;req&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;orig&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#31748f&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;orig&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;skip_jwt&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#31748f&#34;&gt;return&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#31748f&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;token&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;jwt&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;sign&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;settings&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;data&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{},&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;settings&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;secret&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ebbcba&#34;&gt;req&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;headers&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;Authorization&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;`Bearer &lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;token&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;That&#39;s it. Like I said before, it&#39;s pretty simple. This plugin as-is allows us&#xA;for automatic token generation for certain requests. We can get as fancy or keep&#xA;it as simple as we want. For now, I&#39;ll publish that plugin as&#xA;&lt;a href=&#34;https://github.com/Seich/beau-jwt&#34;&gt;beau-jwt&lt;/a&gt; and will make more improvements as&#xA;I see fit.&lt;/p&gt;&#xA;&lt;h2&gt;Conclusion&lt;/h2&gt;&#xA;&lt;p&gt;Writing a plugin is pretty easy. Beau doesn&#39;t really do much so modifying&#xA;requests is pretty straightforward and allows for nice, clean configuration&#xA;files. Hopefully someone will think of cool things to do with these.&lt;/p&gt;&#xA;</description>
      <pubDate>Thu, 06 Apr 2017 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Hey Beau!</title>
      <link>https://martianwabbit.com/2017/03/13/hey-beau.html</link>
      <description>&lt;p&gt;So I&#39;ve been doing a lot of random experiments lately. One of them is Beau. &lt;a href=&#34;https://github.com/seich/beau&#34;&gt;Beau&lt;/a&gt; is at it&#39;s heart a configurable http client. It was built with JSON APIs in mind. I&#39;ve used things like Paw or Postman in the past and they are good but they are lacking in some key areas. For example, I love how extensible Paw is but not being able to share project files with coworkers in Windows or Linux makes it so I can&#39;t use it with most of the teams I&#39;ve worked with.&lt;/p&gt;&#xA;&lt;img src=&#34;/files/2017-03-13-hey-beau/beau.png&#34; alt=&#34;Beau&#39;s logo, a Seahorse&#34; height=&#34;144&#34; width=&#34;76&#34;&gt;&#xA;&lt;p&gt;So to scratch that itch, I decided to build a simple http client for myself. I only had a couple of requirements. It should run on all platforms. It should be easy to setup and get started. Ideally the configuration is a plain text file so I can version control it and share it with others.&lt;/p&gt;&#xA;&lt;p&gt;Having all of those things in mind I created Beau. Beau allows you to write a simple YAML file as configuration. It has a client written in Javascript which you can install using npm or yarn in a couple of seconds and it is completely cross-platform.&lt;/p&gt;&#xA;&lt;p&gt;A simple beau configuration might look something like this:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;POST /session&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ebbcba&#34;&gt;alias&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;session&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ebbcba&#34;&gt;payload&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ebbcba&#34;&gt;username&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;seich&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ebbcba&#34;&gt;password&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;password&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;With this simple config file, I can request a new session using the CLI:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;beau -r session&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/files/2017-03-13-hey-beau/beau.gif&#34; alt=&#34;A gif showing Beau in action&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;That&#39;s all it takes. It also has a couple other tricks up it&#39;s sleeve though. You can also reference requests, so if that session request returns a token to verify other requests you can reference it like this:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;GET /profile&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ebbcba&#34;&gt;alias&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;profile&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ebbcba&#34;&gt;headers&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ebbcba&#34;&gt;authorization&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;Bearer $session.body.token&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Beau understands $session is another request and it&#39;ll execute it first before attempting to do the profile request. The command doesn&#39;t change:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;beau -r profile&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Beau is still a work in progress but I feel like there is some potential to it. I&#39;ll be improving it&#39;s codebase and making it more extensible as time goes on. I am always open to feedback wether good or bad.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;P.S. The incredibly talented, Angela Velasquez helped me out with a logo. Everyone knows a successful open source project begins with a great logo.&lt;/em&gt;&lt;/p&gt;&#xA;</description>
      <pubDate>Mon, 13 Mar 2017 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Making a Wooden iPhone Stand</title>
      <link>https://martianwabbit.com/2015/12/05/Making-a-wooden-iphone-stand.html</link>
      <description>&lt;p&gt;I recently decided to tried my hand at building a physical thing. A stand for my iPhone. I decided I wanted to go through the whole process and see what its like. So I started with a mockup:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/files/2015-12-05-making-a-wooden-iphone-stand/mockup-1.png&#34; alt=&#34;First mockup&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;It’s a simple thing, a piece of wood with a slanted channel to put your phone in. Here’s how it turned out:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/files/2015-12-05-making-a-wooden-iphone-stand/final-1.jpg&#34; alt=&#34;First attempt&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;It looks ok, but there’s a couple of things I didn’t like with this first version. It held the phone just fine but it didn&#39;t look right or inspire enough confidence to actually trust it with my phone.&lt;/p&gt;&#xA;&lt;p&gt;Time for a second version. There were three things I wanted to change. The width of the base, its angle and I wanted to add little anti-slip pads.&lt;/p&gt;&#xA;&lt;p&gt;The width was straight forward, I measured my phone and added a centimetre. This way my phone would get to sit in the middle of the base.&lt;/p&gt;&#xA;&lt;p&gt;For the angle, I wanted my phone to “face” me. The whole point of the base was to keep me from moving my neck too much to see my phone. This angle also defined the out cuts on the base because I wanted all the angles to match. After a bunch of test, I settled with 15º, which is rather comfortable.&lt;/p&gt;&#xA;&lt;p&gt;Finally, I wanted to add anti-slipping pads to the base. I originally wanted to get some clear vinyl pads. I ended up settling for 1/2” cork pads though. The cork pads looked nicer and were thinner than their vinyl counterparts.&lt;/p&gt;&#xA;&lt;p&gt;With everything figured out, I moved onto the mock up. I learned a couple of new techniques for sketchup so making it was a lot faster. Here’s what the mockup ended up looking like:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/files/2015-12-05-making-a-wooden-iphone-stand/mockup-2.png&#34; alt=&#34;Second Mockup&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;And here’s what it ended up looking like at then end:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/files/2015-12-05-making-a-wooden-iphone-stand/final-2.jpg&#34; alt=&#34;Final result&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;All in all, I am pretty happy with the results. The base matches my original idea and fulfils my expectations. It’s not perfect, my wood working skills leave much to be desired. I made a couple of mistakes which I plan on correcting on my next build. Here’s the sketchup model in case you want to play with it or build your own: &lt;a href=&#34;http://cl.ly/0z2w2K0T173t&#34;&gt;Download SketchUp Model&lt;/a&gt;&lt;/p&gt;&#xA;</description>
      <pubDate>Sat, 05 Dec 2015 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Postgres: Checking Queries in Real Time</title>
      <link>https://martianwabbit.com/2015/06/10/postgres-checking-queries-in-realtime.html</link>
      <description>&lt;p&gt;Recently I came around a really simple way of checking what queries are going on in Postgres at any given time. Basically what you want to do is tell Postgres to log all queries and then you can tail the log file.&lt;/p&gt;&#xA;&lt;p&gt;The first step is to tell Postgres to log all queries. To do that you go to your postgresql.conf file (mine’s here: ~/Library/Application Support/Postgres/var-9.4) and set the following options:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;logging_collector = on&#xA;log_directory = ‘pg_log’&#xA;log_statement = ‘all’&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Once you’ve configured these values Postgres will be dumping all queries into the current log file at pg_log. Now you can tail your log file and see what queries are happening in real time.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;# Change this to your log’s folder.&#xA;&#xA;tail -f ~/Library/Application\ Support/Postgres/var-9.4/pg_log/*&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Also, it’s worth noting that Pg Admin has a log viewer you can use for this task. Just go to Tools &amp;gt; Server Status and you should get this window:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/files/2015-06-10-postgres-checking-queries/pg_admin.png&#34; alt=&#34;Screenshot of PG Admin Log&#34;&gt;&lt;/p&gt;&#xA;</description>
      <pubDate>Wed, 10 Jun 2015 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Expiring full-page caches in Rails 4 from the model</title>
      <link>https://martianwabbit.com/2015/03/08/Expiring-full-page-caches-in-Rails-4-from-the-model.html</link>
      <description>&lt;p&gt;Recently I was struggling with Rail’s full-page cache. Ever since it was moved out of core I can’t seem to get sweepers to work correctly. After fiddling around for several hours I finally found the best solution possible (excluding sweepers, that is), invalidating the cache on the model’s callbacks. Here’s how it looks:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#9ccfd8&#34;&gt;Ad&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;ActiveRecord&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;Base&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;after_save&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;:clear_cache&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;after_destroy&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;:clear_cache&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#31748f&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;clear_cache&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f6c177&#34;&gt;ActionController&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;Base&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;expire_page&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;/ads.json&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#31748f&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;There’s a couple of gotchas:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;You can’t use the nice syntax that’s available on controllers when you use &lt;code&gt;expire_page&lt;/code&gt;, you have to pass the route to the file as a string. I couldn’t get it to work any other way (You could use url helpers to come up with this route, I suppose).&lt;/li&gt;&#xA;&lt;li&gt;You have to make sure to expire any additional pages that might have changed base on the model’s relationship since this won’t handle it for you.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Other than these 2 things it’s pretty straight-forward and easy to use. I hope I don’t have to use full page caching again any time soon.&lt;/p&gt;&#xA;</description>
      <pubDate>Sun, 08 Mar 2015 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Angular.js One-way bindings</title>
      <link>https://martianwabbit.com/2014/12/26/angular-one-time-bindings.html</link>
      <description>&lt;p&gt;This week I discovered One-way bindings in Angular.&lt;/p&gt;&#xA;&lt;p&gt;Angular&#39;s one-way bindings are a great way to improve your app&#39;s performance.&#xA;Here&#39;s what the documentation says about them:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&#x9;&lt;p&gt;&#xA;&#x9;One-time expressions will stop recalculating once they are stable, which happens after the first digest if the expression result is a non-undefined value.&#xA;&#x9;&lt;/p&gt;&#xA;&#x9;-&lt;cite&gt;&lt;a href=&#34;https://docs.angularjs.org/guide/expression#one-time-binding&#34;&gt;Expressions, Angular Developer Guide&lt;/a&gt;&lt;/cite&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;This means that by using them, once the value is not undefined, the bound value&#xA;is removed from the watch list and thus isn&#39;t processed anymore during the&#xA;digest cycle.&lt;/p&gt;&#xA;&lt;p&gt;The syntax is pretty straight forward and very easy to use. All you have to do&#xA;Once the value is set to the user&#39;s name, it won&#39;t be watched for changes&#xA;anymore.&lt;/p&gt;&#xA;&lt;p&gt;Great, huh?&lt;/p&gt;&#xA;&lt;p&gt;You can use them as part of expressions and directives as well so, go crazy!&lt;/p&gt;&#xA;&lt;h2&gt;Read More!&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://blog.thoughtram.io/angularjs/2014/10/14/exploring-angular-1.3-one-time-bindings.html&#34;&gt;Exploring Angular 1.3: One-time bindings&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://docs.angularjs.org/guide/expression#one-time-binding&#34;&gt;One-time binding, Angular Developers Guide&lt;/a&gt;&lt;/p&gt;&#xA;</description>
      <pubDate>Fri, 26 Dec 2014 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>JustVector Social Font 1.5</title>
      <link>https://martianwabbit.com/2014/09/15/just-vector-social-font-1-5.html</link>
      <description>&lt;p&gt;Today I am releasing a new version of the JustVector social font.&lt;/p&gt;&#xA;&lt;p&gt;3 years and 59k downloads later, the process of building icon fonts has changed radically. There are a bunch of new and better ways to get things done, I think the process has come a very long way in the past 3 years. Taking these new techniques and ideas into account, I&#39;ve rebuilt the font from scratch.&lt;/p&gt;&#xA;&lt;p&gt;I had a couple of objectives with this new version: First, I wanted to fit in all of the icons, when I first built the font this wasn&#39;t quite as trivial since I kept running out of glyphs I could replace but these days it&#39;s quite easy. You can use special glyphs and css to have as many icons as you want (I am not sure how many that is to be honest).&lt;/p&gt;&#xA;&lt;p&gt;Second, I wanted to make the process of building a new font as automatic as possible. 3 years ago I had to manually export each glyph and add it to the font. It took fairly long and was painful to hint and size correctly.&lt;/p&gt;&#xA;&lt;p&gt;The process is now automatic, I use &lt;a href=&#34;http://fontcustom.com/&#34;&gt;font custom&lt;/a&gt; which allows me to automate the whole process. I can now build a new version in a couple of minutes. This means that I no longer will take 3 years between versions. I am aiming to keep it synced with the &lt;a href=&#34;http://alexpeattie.com/projects/justvector_icons/&#34;&gt;original set&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;All in all I am really happy with the much-needed update. I&#39;d like to thank &lt;a href=&#34;http://www.maxrice.com/&#34;&gt;Max Rice&lt;/a&gt; for helping me find the motivation to revisit the project and &lt;a href=&#34;http://alexpeattie.com&#34;&gt;Alex Peattie&lt;/a&gt; for the wonderful icon set.&lt;/p&gt;&#xA;&lt;p&gt;The project can now be found on Github: &lt;a href=&#34;https://github.com/Seich/JustVector-Icons-Font&#34;&gt;https://github.com/Seich/JustVector-Icons-Font&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Here&#39;s a preview: &lt;a href=&#34;/files/2014-09-15-just-vector-social-font/index.html&#34;&gt;Preview&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Here&#39;s the download link: &lt;a href=&#34;http://cl.ly/203m2e0n1J2K&#34;&gt;Download&lt;/a&gt;&lt;/p&gt;&#xA;</description>
      <pubDate>Mon, 15 Sep 2014 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Using TableViewControllers with Swift</title>
      <link>https://martianwabbit.com/2014/07/31/using-tableviewcontrollers-with-swift.html</link>
      <description>&lt;p&gt;Using a TableViewController with swift is easy. It takes only a couple of steps to create a table with custom cells. I started by creating a single view application.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/files/2014-07-31-using-tableviewcontrollers/swiftTables_step_1.png&#34; alt=&#34;New Project&#34;&gt;&lt;/p&gt;&#xA;&lt;h2&gt;Setting up the table and cell prototype&lt;/h2&gt;&#xA;&lt;p&gt;I started by deleting the default view. Then, I added a &lt;em&gt;Table View Controller&lt;/em&gt; to the storyboard.&#xA;Finally, I added two labels to the prototype cell. You can use the prototype cell to define how the cells for the table will look, so go ahead and tweak it to your convenience. Afterwards, I set the cell&#39;s identifier to &#39;cell&#39;. I am creating a Twitter client so I only need to display the user and the Tweet.&lt;/p&gt;&#xA;&lt;p&gt;(There&#39;s a preset style that&#39;s only a title and a subtitle which I could have used but, I want more control over it&#39;s appearance so I went this way)&lt;/p&gt;&#xA;&lt;video controls&gt;&#xA;    &lt;source src=&#34;/files/2014-07-31-using-tableviewcontrollers/swiftTable_step_1.mp4&#34; type=&#34;video/mp4; codecs=avc1.42E01E,mp4a.40.2&#34;&gt;&#xA;    &lt;source src=&#34;/files/2014-07-31-using-tableviewcontrollers/swiftTable_step_1.webm&#34; type=&#34;video/webm; codecs=vp8,vorbis&#34;&gt;&#xA;&lt;/video&gt;&#xA;&lt;p&gt;Once I had my cell and table ready I just needed to do a couple more things. First, I created a class called TweetCell that inherits from &lt;code&gt;UITableViewCell&lt;/code&gt;. I&#39;ll be using this class as a base for my custom cell. I set my class as the custom class and I added two outlets to refer to both of the labels. I named the big one &amp;quot;username&amp;quot; and the smaller one &amp;quot;body&amp;quot;.&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e6a86&#34;&gt;// TweetCell.swift&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#9ccfd8&#34;&gt;UIKit&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#9ccfd8&#34;&gt;TweetCell&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;UITableViewCell&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#31748f&#34;&gt;@IBOutlet&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;weak&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;username&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;UILabel&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;!&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#31748f&#34;&gt;@IBOutlet&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;weak&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;body&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;UILabel&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;!&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;video controls&gt;&#xA;    &lt;source src=&#34;/files/2014-07-31-using-tableviewcontrollers/swiftTable_step_2.mp4&#34; type=&#34;video/mp4; codecs=avc1.42E01E,mp4a.40.2&#34;&gt;&#xA;    &lt;source src=&#34;/files/2014-07-31-using-tableviewcontrollers/swiftTable_step_2.webm&#34; type=&#34;video/webm; codecs=vp8,vorbis&#34;&gt;&#xA;&lt;/video&gt;&#xA;&lt;h2&gt;The ViewController&lt;/h2&gt;&#xA;&lt;p&gt;Now I only have to set up the view controller. We already have the basic view controller that came with the project so now we can just change it to do our bidding.&lt;/p&gt;&#xA;&lt;p&gt;I start by creating a struct to contain my tweets. I added it before the ViewController&#39;s class definition.&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#9ccfd8&#34;&gt;Tweet&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;username&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;String&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;body&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;String&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;After that, I changed the ViewController&#39;s parent class from &lt;code&gt;UIViewController&lt;/code&gt; to &lt;code&gt;UITableViewController&lt;/code&gt; and added the &lt;code&gt;UITableViewDataSource&lt;/code&gt; protocol to it so my class looks like this:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#9ccfd8&#34;&gt;ViewController&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;UITableViewController&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;UITableViewDataSource&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now I added an array with a couple of tweets:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;tweets&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;Tweet&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ebbcba&#34;&gt;Tweet&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;username&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Seich&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;body&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Hello, World&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;),&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ebbcba&#34;&gt;Tweet&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;username&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Albert&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;body&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;How are you doing?&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Finally I just need to override a couple of methods. The first one is this method:  &lt;code&gt;tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -&amp;gt; UITableViewCell! &lt;/code&gt; which determines what cell should be drawn at the given index. Here&#39;s how mine looks:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;override&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;tableView&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ebbcba&#34;&gt;tableView&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;UITableView&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;!,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ebbcba&#34;&gt;cellForRowAtIndexPath&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;indexPath&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;NSIndexPath&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;!)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#908caa&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;UITableViewCell&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;!&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;cell&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;tableView&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;dequeueReusableCellWithIdentifier&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;cell&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;TweetCell&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ebbcba&#34;&gt;cell&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;username&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;text&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;tweets&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;indexPath&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;row&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;username&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ebbcba&#34;&gt;cell&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;body&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;text&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;tweets&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;indexPath&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;row&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;body&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#31748f&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;cell&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The second method is this one: &lt;code&gt;override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -&amp;gt; Int&lt;/code&gt; which should return the number of cells to draw, mine looks like this:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;override&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;tableView&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ebbcba&#34;&gt;tableView&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;UITableView&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;!,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ebbcba&#34;&gt;numberOfRowsInSection&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;section&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;Int&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;Int&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#31748f&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;tweets&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;count&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And that&#39;s it. Here&#39;s my final code for the view controller:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#9ccfd8&#34;&gt;UIKit&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#9ccfd8&#34;&gt;Tweet&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;username&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;String&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;body&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;String&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#9ccfd8&#34;&gt;ViewController&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;UITableViewController&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;UITableViewDataSource&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;tweets&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;Tweet&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ebbcba&#34;&gt;Tweet&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;username&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Seich&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;body&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Hello, World&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;),&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ebbcba&#34;&gt;Tweet&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;username&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Albert&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;body&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;How are you doing?&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#908caa&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#31748f&#34;&gt;override&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;tableView&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ebbcba&#34;&gt;tableView&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;UITableView&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;!,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ebbcba&#34;&gt;numberOfRowsInSection&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;section&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;Int&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#908caa&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;Int&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#31748f&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;tweets&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;count&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#31748f&#34;&gt;override&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;tableView&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ebbcba&#34;&gt;tableView&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;UITableView&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;!,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ebbcba&#34;&gt;cellForRowAtIndexPath&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;indexPath&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;NSIndexPath&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;!)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#908caa&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;UITableViewCell&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;!&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;cell&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;tableView&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;dequeueReusableCellWithIdentifier&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;cell&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#31748f&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;TweetCell&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ebbcba&#34;&gt;cell&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;username&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;text&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;tweets&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;indexPath&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;row&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;username&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ebbcba&#34;&gt;cell&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;body&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;text&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;tweets&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;indexPath&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;row&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;body&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#31748f&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;cell&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And this is what my finalised app looks like:&lt;/p&gt;&#xA;&lt;img src=&#34;/files/2014-07-31-using-tableviewcontrollers/swiftTables_final.png&#34; alt=&#34;Final app&#34; class=&#34;small&#34;&gt;&#xA;&lt;p&gt;It&#39;s not perfect but, it shouldn&#39;t take much to have it looking decent. I&#39;ll probably be revisiting this soon and finishing the whole Twitter application so stay tuned for more.&lt;/p&gt;&#xA;&lt;h2&gt;Resources&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://developer.apple.com/library/ios/documentation/userexperience/conceptual/tableview_iphone/AboutTableViewsiPhone/AboutTableViewsiPhone.html&#34;&gt;About Table Views in iOS Apps&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://developer.apple.com/library/ios/documentation/userexperience/conceptual/tableview_iphone/CreateConfigureTableView/CreateConfigureTableView.html&#34;&gt;Creating and Configuring a Table View&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.raywenderlich.com/50308/storyboards-tutorial-in-ios-7-part-1&#34;&gt;Storyboard Tutorial&lt;/a&gt;&lt;/p&gt;&#xA;</description>
      <pubDate>Thu, 31 Jul 2014 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Using MapKit with Swift</title>
      <link>https://martianwabbit.com/2014/07/29/using-mapkit-with-swift.html</link>
      <description>&lt;p&gt;I&#39;ve been using Swift a lot lately. I wanted to start making iOS apps a while ago but Objective-C is frankly, not worth the trouble. Swift on the other hand is actually fun to use and I love experiencing how the language evolves.&lt;/p&gt;&#xA;&lt;p&gt;This weekend I started working on a small app I&#39;ve wanted for a while but got stuck when it came to implementing a map with MapKit. I couldn&#39;t find documentation or code samples on how to do it anywhere. Turns out that it&#39;s not hard at all! It took very little fiddling around before I figured it out. Here&#39;s how I did it:&lt;/p&gt;&#xA;&lt;h2&gt;First, create a new project&lt;/h2&gt;&#xA;&lt;p&gt;I started with a &lt;strong&gt;Single View Application&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/files/2014-07-29-using-mapkit/step_1.png&#34; alt=&#34;New Project Screen&#34;&gt;&#xA;Then added a MKMapView to the view controller. After that, imported &lt;code&gt;MapKit&lt;/code&gt; into the view controller&#39;s code. Finally, I added a new reference outlet to the map called &lt;em&gt;map&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;video controls&gt;&#xA;    &lt;source src=&#34;/files/2014-07-29-using-mapkit/swiftmaps_step_1.mp4&#34; type=&#34;video/mp4; codecs=avc1.42E01E,mp4a.40.2&#34;&gt;&#xA;    &lt;source src=&#34;/files/2014-07-29-using-mapkit/swiftmaps_step_1.webm&#34; type=&#34;video/webm; codecs=vp8,vorbis&#34;&gt;&#xA;&lt;/video&gt;&#xA;&lt;h2&gt;Setup your desired location&lt;/h2&gt;&#xA;&lt;p&gt;Now our map is ready to display a location. You&#39;ll need a couple of things to set it to the right place. First, you need a location in the form of a latitude and longitude and a CLLocationCoordinate2D.&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;location&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;CLLocationCoordinate2D&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ebbcba&#34;&gt;latitude&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;16.40&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ebbcba&#34;&gt;longitude&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;86.34&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now, we need to tell the map what the area spanned by the region is. For this we use &lt;code&gt;MKCoordinateSpanMake&lt;/code&gt;. Which, as you probably guessed, creates a &lt;code&gt;MKCoordinateSpan&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;span&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;MKCoordinateSpanMake&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;After that we just need to define the region using these two things:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;region&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;MKCoordinateRegion&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;center&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;location&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;span&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;span&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And finally, we set this region to the map:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;map&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;setRegion&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;region&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;animated&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Bonus: Adding an annotation&lt;/h2&gt;&#xA;&lt;p&gt;Adding an annotation is actually quite easy. We start by creating a new MKPointAnnotation instance. It&#39;ll display the default red pin which, might not be as pretty but it&#39;ll get the job done.&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;annotation&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;MKPointAnnotation&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Afterwards, we can set it&#39;s coordinates, title and subtitle to place it wherever we want and to add the text it&#39;s callout will display when tapped.&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;annotation&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;coordinate&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;location&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;annotation&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;title&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Roatan&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;annotation&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;subtitle&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Honduras&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Finally, we add it to the map like this:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;map&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;addAnnotation&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;annotation&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Here&#39;s my final code:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#9ccfd8&#34;&gt;UIKit&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#9ccfd8&#34;&gt;MapKit&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#9ccfd8&#34;&gt;ViewController&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;UIViewController&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#31748f&#34;&gt;@IBOutlet&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;weak&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;map&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;MKMapView&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;!&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#31748f&#34;&gt;override&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;viewDidLoad&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#31748f&#34;&gt;super&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;viewDidLoad&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;location&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;CLLocationCoordinate2D&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#ebbcba&#34;&gt;latitude&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;16.40&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#ebbcba&#34;&gt;longitude&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;86.34&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;span&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;MKCoordinateSpanMake&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;0.5&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;0.5&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;region&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;MKCoordinateRegion&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;center&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;location&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;span&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;span&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ebbcba&#34;&gt;map&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;setRegion&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;region&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;animated&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;annotation&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;MKPointAnnotation&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ebbcba&#34;&gt;annotation&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;coordinate&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;location&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ebbcba&#34;&gt;annotation&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;title&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Roatan&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ebbcba&#34;&gt;annotation&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;subtitle&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Honduras&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ebbcba&#34;&gt;map&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;addAnnotation&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;annotation&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And here&#39;s what my app looks like:&#xA;&lt;img src=&#34;/files/2014-07-29-using-mapkit/final.png&#34; alt=&#34;Final product&#34; class=&#34;small&#34;&gt;&lt;/p&gt;&#xA;&lt;h2&gt;Additional Resources&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://developer.apple.com/library/ios/documentation/userexperience/Conceptual/LocationAwarenessPG/AnnotatingMaps/AnnotatingMaps.html&#34;&gt;Location and Maps Programming Guide&lt;/a&gt;&lt;/p&gt;&#xA;</description>
      <pubDate>Tue, 29 Jul 2014 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Using mailgun to receive emails with Phabricator</title>
      <link>https://martianwabbit.com/2014/04/21/using-mailgun-to-receive-emails-with-phabrication.html</link>
      <description>&lt;p&gt;&lt;a href=&#34;http://phabricator.com&#34;&gt;Phabricator&lt;/a&gt; is awesome. We recently started trying it out for &lt;a href=&#34;http://2build.it&#34;&gt;2build.it&lt;/a&gt; (more like, this morning) and we all (&lt;a href=&#34;http://jorge.caballeromurillo.com&#34;&gt;Jorge&lt;/a&gt; and I) agreed it&#39;s awesome.&lt;/p&gt;&#xA;&lt;p&gt;The setup is pretty straight-forward and only took like 20 minutes. The one thing I got stuck on though, was the emailing. It took me forever to realise that you&#39;re supposed to restart the emailing daemons for the configuration to stick. It is my fault but, this wasn&#39;t mentioned anywhere in the documentation. Btw, here&#39;s how you do it:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;./bin/phd restart&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Right from the Phabricator folder.&lt;/p&gt;&#xA;&lt;p&gt;Moving on.&lt;/p&gt;&#xA;&lt;p&gt;Now that sending was settled there was one huge thing that wasn&#39;t working. Inbound emails. I tried working with postfix but, it was too painful and after a couple of hours I didn&#39;t get anywhere. The &lt;a href=&#34;https://secure.phabricator.com/book/phabricator/article/configuring_inbound_email/&#34;&gt;documentation&lt;/a&gt; talks about using sendgrid to achieve it but, I already have a mailgun account and according to the configuration Phabricator should be able to use mailgun as well. So, I had to do some research.&lt;/p&gt;&#xA;&lt;p&gt;It turns out you can use mailgun to do this but, there&#39;s zero documentation about it. Luckily, I found the &lt;a href=&#34;https://secure.phabricator.com/rPa9612fac24a9eb97ad3f611d84dfedbce98d17ad&#34;&gt;commit&lt;/a&gt; where this functionality was added and figured it out on my own. Here&#39;s the three step guide to getting it done.&lt;/p&gt;&#xA;&lt;h2&gt;Step 1&lt;/h2&gt;&#xA;&lt;p&gt;You have to configure you domain&#39;s MX records to point to mailgun. You can find more information &lt;a href=&#34;http://documentation.mailgun.com/user_manual.html#verifying-your-domain&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2&gt;Step 2&lt;/h2&gt;&#xA;&lt;p&gt;Go to your setup your mailgun configuration by going to the mailgun config (&lt;a href=&#34;http://example.com/config/group/mailgun/&#34;&gt;http://example.com/config/group/mailgun/&lt;/a&gt;) and adding your API key and your domain.&lt;/p&gt;&#xA;&lt;h2&gt;Step 3&lt;/h2&gt;&#xA;&lt;p&gt;We&#39;re almost done. Now, all we have to do is tell mailgun to send received emails your way. To do this all you have to do is create a new route (go here: &lt;a href=&#34;https://mailgun.com/cp/routes&#34;&gt;https://mailgun.com/cp/routes&lt;/a&gt;). Give it a priority and a filter that&#39;ll work for you (I used 0 as a priority and &lt;code&gt;catch_all()&lt;/code&gt; for a filter). For the action, forward it to your Phabricator installation with the endpoint &#39;/mail/mailgun&#39;. Like this: &lt;code&gt;forward(&amp;quot;http://example.com/mail/mailgun/&amp;quot;)&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;That is all. Your emails should now allow you to interact with Phabricator.&lt;/p&gt;&#xA;</description>
      <pubDate>Mon, 21 Apr 2014 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Sketch Presets for Desktop Screens</title>
      <link>https://martianwabbit.com/2014/04/05/Sketch-Presets-For-Desktop.html</link>
      <description>&lt;p&gt;I&#39;ve been using &lt;a href=&#34;http://bohemiancoding.com/sketch/&#34;&gt;Sketch&lt;/a&gt; to create mock ups for clients lately. So far so good. Today, I wanted to create art board presets for common desktop screen sizes. It took me a little while to find out how to organize them into folders. Luckily for me, Jan Drewniak has a &lt;a href=&#34;http://j4n.co/blog/custom-sketch-art-board-presets&#34;&gt;blog post&lt;/a&gt; detailing how to do just this.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Sketch actually keeps these artboard presets in an artboards.sketchpreset file located somewhere on your mac. If you&#39;re using the App Store version of Sketch, then the file is located here:&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;pre&gt;&lt;code&gt;~/Library/Containers/com.bohemiancoding.sketch/Data/Library/Application  Support/sketch/&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Here&#39;s my presets:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;&amp;lt;dict&amp;gt;&#xA;&#x9;&amp;lt;key&amp;gt;name&amp;lt;/key&amp;gt;&#xA;&#x9;&amp;lt;string&amp;gt;Desktop&amp;lt;/string&amp;gt;&#xA;&#x9;&amp;lt;key&amp;gt;presets&amp;lt;/key&amp;gt;&#xA;&#x9;&amp;lt;array&amp;gt;&#xA;&#x9;&#x9;&amp;lt;string&amp;gt;Retina Displays&amp;lt;/string&amp;gt;&#xA;&#x9;&#x9;&amp;lt;dict&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;width&amp;lt;/key&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;integer&amp;gt;2880&amp;lt;/integer&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;name&amp;lt;/key&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;string&amp;gt;15-inch&amp;lt;/string&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;height&amp;lt;/key&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;integer&amp;gt;1800&amp;lt;/integer&amp;gt;&#xA;&#x9;&#x9;&amp;lt;/dict&amp;gt;&#xA;&#x9;&#x9;&amp;lt;dict&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;width&amp;lt;/key&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;integer&amp;gt;2560&amp;lt;/integer&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;name&amp;lt;/key&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;string&amp;gt;13-inch&amp;lt;/string&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;height&amp;lt;/key&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;integer&amp;gt;1600&amp;lt;/integer&amp;gt;&#xA;&#x9;&#x9;&amp;lt;/dict&amp;gt;&#xA;&#x9;&#x9;&amp;lt;string&amp;gt;4:3&amp;lt;/string&amp;gt;&#xA;&#x9;&#x9;&amp;lt;dict&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;width&amp;lt;/key&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;integer&amp;gt;1600&amp;lt;/integer&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;name&amp;lt;/key&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;string&amp;gt;Large 4:3&amp;lt;/string&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;height&amp;lt;/key&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;integer&amp;gt;1200&amp;lt;/integer&amp;gt;&#xA;&#x9;&#x9;&amp;lt;/dict&amp;gt;&#xA;&#x9;&#x9;&amp;lt;dict&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;width&amp;lt;/key&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;integer&amp;gt;1280&amp;lt;/integer&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;name&amp;lt;/key&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;string&amp;gt;Medium 4:3&amp;lt;/string&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;height&amp;lt;/key&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;integer&amp;gt;1024&amp;lt;/integer&amp;gt;&#xA;&#x9;&#x9;&amp;lt;/dict&amp;gt;&#xA;&#x9;&#x9;&amp;lt;string&amp;gt;16:9&amp;lt;/string&amp;gt;&#xA;&#x9;&#x9;&amp;lt;dict&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;width&amp;lt;/key&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;integer&amp;gt;1920&amp;lt;/integer&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;name&amp;lt;/key&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;string&amp;gt;Large 16:9&amp;lt;/string&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;height&amp;lt;/key&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;integer&amp;gt;1080&amp;lt;/integer&amp;gt;&#xA;&#x9;&#x9;&amp;lt;/dict&amp;gt;&#xA;&#x9;&#x9;&amp;lt;dict&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;width&amp;lt;/key&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;integer&amp;gt;1600&amp;lt;/integer&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;name&amp;lt;/key&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;string&amp;gt;Medium 16:9&amp;lt;/string&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;height&amp;lt;/key&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;integer&amp;gt;900&amp;lt;/integer&amp;gt;&#xA;&#x9;&#x9;&amp;lt;/dict&amp;gt;&#xA;&#x9;&#x9;&amp;lt;dict&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;width&amp;lt;/key&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;integer&amp;gt;1366&amp;lt;/integer&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;name&amp;lt;/key&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;string&amp;gt;Small 16:9&amp;lt;/string&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;key&amp;gt;height&amp;lt;/key&amp;gt;&#xA;&#x9;&#x9;&#x9;&amp;lt;integer&amp;gt;768&amp;lt;/integer&amp;gt;&#xA;&#x9;&#x9;&amp;lt;/dict&amp;gt;&#xA;&#x9;&amp;lt;/array&amp;gt;&#xA;&amp;lt;/dict&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;I have categories for: Retina, 16:9 and 5:4 displays. Only listing the ones I&#39;ve used recently and might re-use in the future.&lt;/p&gt;&#xA;</description>
      <pubDate>Sat, 05 Apr 2014 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Scroll Spying for Fun and Profit</title>
      <link>https://martianwabbit.com/2014/04/04/scroll-spying-for-fun-and-profit.html</link>
      <description>&lt;p&gt;I recently redesigned by blog. One of the new features is a menu that highlights the current post you are on.&#xA;&lt;img src=&#34;http://f.cl.ly/items/133x0c1u0K0g0Y3g0g1W/scrollspying.gif&#34; class=&#34;small&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;To achieve this, I used &lt;a href=&#34;http://zeptojs.com/&#34;&gt;Zepto&lt;/a&gt; and a small amount of math. (The great thing about Zepto is that it&#39;s fully compatible with jQuery, so this should work with jQuery out of the box as well).&lt;/p&gt;&#xA;&lt;p&gt;Let&#39;s jump right in, here&#39;s how I do it:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;window&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;on&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;scroll&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;scrollTop&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;window&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;scrollTop&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;article_offsets&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;article&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;map&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#31748f&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#31748f&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#31748f&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;offset&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;().&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;top&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#908caa&#34;&gt;});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#31748f&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;lt&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;article_offsets&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;length&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;++&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#31748f&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;article_offsets&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;40&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;lt&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;scrollTop&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#ebbcba&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;.sidebar li&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;removeClass&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;active&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;eq&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;addClass&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;active&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#908caa&#34;&gt;};&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The first line of interest:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;article_offsets&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;article&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;map&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#31748f&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#31748f&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#31748f&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;offset&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;().&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;top&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Grabs all the vertical positions (from now on, offsets) of the elements I want to match and makes an array out of them. In this case, I am targeting the articles since, those represent my blog posts. I make sure to mark the first one as 0, so it works when the page first loads at scroll position 0.&lt;/p&gt;&#xA;&lt;p&gt;After doing this, we iterate over all our scroll positions, if we find ourselves scrolled after one of the offsets we run this:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ebbcba&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;.sidebar li&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;removeClass&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;active&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;eq&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;addClass&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;active&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This looks for the Ith element on the sidebar&#39;s list and we add a class of &#39;active&#39; to it, highlighting it and doing whatever we want with it.&lt;/p&gt;&#xA;&lt;p&gt;There&#39;s a couple of other (bigger, more complex and probably more robust) solutions to this problem out there. Here&#39;s a couple I came through:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://getbootstrap.com/javascript/#scrollspy&#34;&gt;http://getbootstrap.com/javascript/#scrollspy&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.outyear.co.uk/smint/&#34;&gt;http://www.outyear.co.uk/smint/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://scrollnav.com/&#34;&gt;http://scrollnav.com/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;I am pretty sure they are plenty of others but, for my evil purposes, my tiny script fulfills my needs.&lt;/p&gt;&#xA;</description>
      <pubDate>Fri, 04 Apr 2014 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>2014</title>
      <link>https://martianwabbit.com/2014/01/26/2014.html</link>
      <description>&lt;p&gt;I know I am a little late doing the whole goal setting and year review thing but, this year I wanted to try something different. I wanted to see how January turned out before setting goals.&lt;/p&gt;&#xA;&lt;p&gt;This year will be pretty exciting. I&#39;ll continue working as a consultant as I have for the past couple of years. Invivo Link is doing some pretty cool things and I am happy to help them continue building their product. Over at &lt;a href=&#34;http://www.2build.it&#34;&gt;2build.it&lt;/a&gt;, we&#39;re working with some pretty cool clients, building a variety of pretty cool things, hopefully the company will grow a whole lot this year.&lt;/p&gt;&#xA;&lt;p&gt;I tend to decide what I&#39;d like to learn more during the year. This year&#39;s language is going to be Rust. I&#39;ve fallen in love with it on the past couple of months and I&#39;d like to start building more things with it as the language becomes more stable. Apart from Rust, this year I&#39;ll be working with Objective-C a whole lot more. I don&#39;t fully like the language yet but, I feel like it can be a valuable tool in my toolset. I&#39;ll also continue working on bundle.js as it has become essential to a client&#39;s project which, turns out to be a great way to further develop it.&lt;/p&gt;&#xA;&lt;p&gt;I&#39;d also like to write more, I didn&#39;t get to do it as much as I wanted to last year so I&#39;ve adjusted my goal, I want to write at least, 12 posts during the year. I think this is a reasonable quantity and I hope I&#39;ll be able to reach it. I&#39;d also like to read more, my goal for that is at least 52 books. I am up to speed so far so I am pretty sure I can reach that.&lt;/p&gt;&#xA;&lt;p&gt;Finally, I&#39;d like a travel more this year, I am getting a little tired and burned out and I feel that it would help me to travel and see things.&lt;/p&gt;&#xA;&lt;p&gt;I achieved most of the important goals from last year so, I am looking forward to a great year.&lt;/p&gt;&#xA;</description>
      <pubDate>Sun, 26 Jan 2014 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>You&#39;ve Gotta Love Deferreds</title>
      <link>https://martianwabbit.com/2013/11/12/youve-gotta-love-deferreds.html</link>
      <description>&lt;p&gt;Deferreds are awesome. They are such a simple solution to a really hard problem. Keeping things async in javascript can get hard sometimes. I recently wrote some code that looked like this:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;settings&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ebbcba&#34;&gt;template&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;todo.hbs&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ebbcba&#34;&gt;data_src&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;/todo.json&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;};&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;template&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;getting_template&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;getting_data&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;template&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;settings&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ebbcba&#34;&gt;getting_template&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;get&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;settings&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;template&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ebbcba&#34;&gt;getting_template&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;done&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#ebbcba&#34;&gt;template&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#908caa&#34;&gt;});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#31748f&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;data_src&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;settings&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#ebbcba&#34;&gt;getting_data&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;get&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;settings&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;data_src&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#ebbcba&#34;&gt;getting_data&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;done&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#ebbcba&#34;&gt;render&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;template&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#908caa&#34;&gt;});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#ebbcba&#34;&gt;getting_template&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;done&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&#x9;&lt;span style=&#34;color:#ebbcba&#34;&gt;render&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#908caa&#34;&gt;});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ebbcba&#34;&gt;render&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;(I am pretty sure it wasn&#39;t necessarily as ugly but, I don&#39;t quite remember.)&lt;/p&gt;&#xA;&lt;p&gt;As you can see, even though I am making use of the deferreds returned by the &lt;code&gt;$.get&lt;/code&gt; function. This could be cleaned up a lot by using even more deferreds.&lt;/p&gt;&#xA;&lt;p&gt;Here&#39;s more or less what the code ended up looking like:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;settings&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ebbcba&#34;&gt;template&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;todo.hbs&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ebbcba&#34;&gt;data_src&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;/todo.json&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;};&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;templateDefer&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;Deferred&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;dataDefer&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;Deferred&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;template&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;settings&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ebbcba&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;get&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;settings&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;template&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;template&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#ebbcba&#34;&gt;templateDefer&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;resolve&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;template&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#908caa&#34;&gt;});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ebbcba&#34;&gt;templateDefer&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;resolve&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;data_src&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;settings&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ebbcba&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;get&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;settings&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;data_src&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#ebbcba&#34;&gt;dataDefer&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;resolve&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#908caa&#34;&gt;});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ebbcba&#34;&gt;dataDefer&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;resolve&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;({});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;when&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;templateDefer&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;dataDefer&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;done&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;template&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#ebbcba&#34;&gt;render&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;template&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I basically kept everything async using stand-alone deferreds. Turns out jQuery has really handy deferred util built-in, all you have to do is create a new one (&lt;code&gt;new $.Deferred()&lt;/code&gt;). The other handy thing built into jQuery is the &lt;code&gt;$.when&lt;/code&gt; method, you can basically pass in a bunch of deferreds and you&#39;d get a single one that responds when all of them respond in a particular way. That way, you can basically say, when they are all done, do this.&lt;/p&gt;&#xA;&lt;p&gt;I shall try experimenting a lot more with these tools, they are pretty easy to use and pack in, so much functionality.&lt;/p&gt;&#xA;&lt;h2&gt;Recommended links&lt;/h2&gt;&#xA;&lt;p&gt;Here&#39;s a couple of recommended links, in case you want to learn more about deffereds, in particular, those built into jQuery:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://api.jquery.com/category/deferred-object/&#34;&gt;jQuery&#39;s Deferred Object Documentation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://vvv.tobiassjosten.net/javascript/jquery-deferreds-promises-asynchronous-bliss/&#34;&gt;jQuery Deferreds promises asynchronous bliss&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://promises-aplus.github.io/promises-spec/&#34;&gt;Promises A+ Spec&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      <pubDate>Tue, 12 Nov 2013 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>A Semantic Grid with Zurb&#39;s Foundation</title>
      <link>https://martianwabbit.com/2013/10/11/a-semantic-grid-with-foundation.html</link>
      <description>&lt;p&gt;&lt;a href=&#34;http://foundation.zurb.com&#34;&gt;Foundation&lt;/a&gt; is great. I love it, I use it whenever I am building anything big. My favorite feature and the one key thing that has kept me as a fan for so long has been it&#39;s grid. I feel like it&#39;s the best grid we have available so far.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;    My favorite thing about that grid you ask? Apart from just being plainly awesome? Well, it&#39;s the semantic option. I know you probably haven&#39;t put much thought into it but, don&#39;t you feel like grid classes tend to clutter the html? I do, and I hate it. Enter the mixins!&#xA;&lt;/p&gt;&#xA;&lt;h2&gt;The Mixins&lt;/h2&gt;&#xA;&lt;p&gt;&#xA;    To alleviate this issue, Foundation gives us a set of really handy mixins which allow you to build a really semantic grid. It&#39;s as flexible as it can be and just as easy to use (I&#39;d argue that if you&#39;re familiar with sass, it&#39;s just plainly easier and requires less typing).&#xA;&lt;/p&gt;&#xA;&lt;p&gt;To demonstrate, I&#39;ll be showing you how to build this:&lt;/p&gt;&#xA;&lt;div&gt;&#xA;    &lt;img src=&#34;http://f.cl.ly/items/08411t3C1f393p3W2B0G/Screen%20Shot%202013-10-11%20at%2012.45.18%20PM.png&#34; alt=&#34;Demo&#34;&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;As you can see, it&#39;s a very simple layout. It&#39;d be really easy to build it using the grid classes, it&#39;s even easier to build it using the mixins. Here&#39;s my markup:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;article&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#908caa&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;header&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#908caa&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;h1&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;&amp;gt;&lt;/span&gt;Hello World&lt;span style=&#34;color:#908caa&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;h1&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#908caa&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;header&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#908caa&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;div&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#908caa&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;img&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;src&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;http://lorempixel.com/300/400/&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;/&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#908caa&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;div&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#908caa&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;p&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Exercitationem,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    voluptatibus, deserunt, facilis iusto sapiente impedit praesentium&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    laudantium minus voluptas numquam incidunt corrupti sequi laboriosam magnam&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    officia perspiciatis quas quam quaerat!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#908caa&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;p&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;article&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;As you can see it&#39;s pretty standard except the elements lack classes and such. Much prettier than usual in my opinion.&lt;/p&gt;&#xA;&lt;p&gt;Here&#39;s my CSS:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;@import&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;foundation/components/global&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;@import&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;foundation/components/grid&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;$total-columns&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;5&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;article&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#31748f&#34;&gt;@include&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt; grid-row&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;header&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#31748f&#34;&gt;@include&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt; grid-row&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ebbcba&#34;&gt;h1&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#31748f&#34;&gt;@include&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt; grid-column&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;5&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#31748f&#34;&gt;@include&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt; grid-column&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;p&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#31748f&#34;&gt;@include&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt; grid-column&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Awesome, right? Here I am the grid-column and grid-row mixins to create the grid directly in my CSS. All you have to do is import the mixins. There are also many options to customize the grid, in this case I changed the number of columns from the default 12, to 5. I am also nesting rows, all from the CSS, leaving the HTML to describe it&#39;s thing. &lt;/p&gt;&#xA;&lt;h3&gt;Side note:&lt;/h3&gt;&#xA;&lt;p&gt;I hadn&#39;t notice that in this case you&#39;re putting a row directly inside another row, this isn&#39;t ideal as it can cause alignment issues. Ideally you&#39;d have the header inside full width column to prevent this. I don&#39;t think it matters in this example but in anything more complex it might be a pain to debug.&lt;/p&gt;&#xA;&lt;p&gt;Thanks to &lt;a href=&#34;https://twitter.com/smiley&#34;&gt;@smiley&lt;/a&gt; for the heads up!&lt;/p&gt;&#xA;&lt;h2&gt;Conclusion&lt;/h2&gt;&#xA;&lt;p&gt;I feel like this technique is a great way to simplify the HTML and further decouple it from it&#39;s CSS. They&#39;ve been several similar things before such as the &lt;a href=&#34;http://semantic.gs/&#34;&gt;Semantic Grid&lt;/a&gt; which experimented with this idea. Foundation has a much more powerful grid so, it being able to work this way as well makes me really happy.&lt;/p&gt;&#xA;</description>
      <pubDate>Fri, 11 Oct 2013 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Connecting To A Remote RethinkDB Admin Interface</title>
      <link>https://martianwabbit.com/2013/07/20/connecting-to-a-remote-rethinkdb-admin-interface.html</link>
      <description>&lt;p&gt;So here&#39;s a really quick tip, when you run a RethinkDB instance on a remote server you cannot access the admin interface, by default, from the outside of the server. The easiest way to get around this without allowing anyone to access it is to use a ssh tunnel like this:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ssh -L 8080:localhost:8080 &amp;amp;lt;host&amp;amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;This basically uses ssh to map the port 8080 of your machine (127.0.0.1 or localhost) to the port 8080 on the host machine. Don&#39;t forget to replace &amp;quot;&amp;lt;host&amp;gt;&amp;quot; with your actual remote host.&lt;/p&gt;&#xA;&lt;p&gt;With this, you can now connect to the admin interface by going to localhost:8080 on your machine. Note that this will only work as long as the ssh connection remains open.&lt;/p&gt;&#xA;&lt;h2&gt;Additional Resources&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.symantec.com/connect/articles/ssh-port-forwarding&#34;&gt;SSH Port Forwarding - Symatec&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://help.ubuntu.com/community/SSH/OpenSSH/PortForwarding&#34;&gt;SSH/OpenSSH/PortForwarding - Ubuntu Community Documentation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      <pubDate>Sat, 20 Jul 2013 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>A Javascript Array of Countries</title>
      <link>https://martianwabbit.com/2013/06/28/a-javascript-array-of-countries.html</link>
      <description>&lt;p&gt;Here&#39;s the Array:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;countries&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Afghanistan&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Åland Islands&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Albania&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Algeria&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;American Samoa&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Andorra&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Angola&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Anguilla&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Antarctica&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Antigua And Barbuda&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Argentina&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Armenia&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Aruba&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Australia&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Austria&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Azerbaijan&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Bahamas&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Bahrain&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Bangladesh&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Barbados&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Belarus&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Belgium&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Belize&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Benin&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Bermuda&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Bhutan&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Bolivia, Plurinational State Of&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Bonaire, Sint Eustatius And Saba&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Bosnia And Herzegovina&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Botswana&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Bouvet Island&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Brazil&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;British Indian Ocean Territory&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Brunei Darussalam&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Bulgaria&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Burkina Faso&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Burundi&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Cambodia&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Cameroon&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Canada&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Cape Verde&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Cayman Islands&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Central African Republic&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Chad&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Chile&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;China&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Christmas Island&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Cocos (keeling) Islands&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Colombia&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Comoros&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Congo&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Congo, The Democratic Republic Of The&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Cook Islands&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Costa Rica&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Côte D&amp;#39;ivoire&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Croatia&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Cuba&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Curaçao&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Cyprus&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Czech Republic&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Denmark&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Djibouti&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Dominica&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Dominican Republic&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Ecuador&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Egypt&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;El Salvador&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Equatorial Guinea&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Eritrea&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Estonia&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Ethiopia&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Falkland Islands (malvinas)&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Faroe Islands&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Fiji&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Finland&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;France&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;French Guiana&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;French Polynesia&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;French Southern Territories&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Gabon&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Gambia&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Georgia&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Germany&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Ghana&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Gibraltar&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Greece&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Greenland&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Grenada&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Guadeloupe&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Guam&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Guatemala&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Guernsey&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Guinea&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Guinea-bissau&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Guyana&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Haiti&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Heard Island And Mcdonald Islands&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Holy See (vatican City State)&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Honduras&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Hong Kong&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Hungary&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Iceland&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;India&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Indonesia&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Iran, Islamic Republic Of&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Iraq&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Ireland&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Isle Of Man&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Israel&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Italy&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Jamaica&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Japan&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Jersey&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Jordan&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Kazakhstan&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Kenya&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Kiribati&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Korea, Democratic People&amp;#39;s Republic Of&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Korea, Republic Of&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Kuwait&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Kyrgyzstan&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Lao People&amp;#39;s Democratic Republic&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Latvia&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Lebanon&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Lesotho&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Liberia&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Libya&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Liechtenstein&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Lithuania&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Luxembourg&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Macao&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Macedonia, The Former Yugoslav Republic Of&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Madagascar&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Malawi&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Malaysia&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Maldives&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Mali&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Malta&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Marshall Islands&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Martinique&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Mauritania&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Mauritius&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Mayotte&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Mexico&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Micronesia, Federated States Of&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Moldova, Republic Of&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Monaco&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Mongolia&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Montenegro&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Montserrat&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Morocco&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Mozambique&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Myanmar&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Namibia&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Nauru&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Nepal&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Netherlands&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;New Caledonia&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;New Zealand&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Nicaragua&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Niger&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Nigeria&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Niue&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Norfolk Island&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Northern Mariana Islands&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Norway&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Oman&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Pakistan&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Palau&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Palestine, State Of&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Panama&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Papua New Guinea&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Paraguay&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Peru&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Philippines&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Pitcairn&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Poland&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Portugal&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Puerto Rico&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Qatar&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Réunion&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Romania&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Russian Federation&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Rwanda&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Saint Barthélemy&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Saint Helena, Ascension And Tristan Da Cunha&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Saint Kitts And Nevis&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Saint Lucia&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Saint Martin (french Part)&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Saint Pierre And Miquelon&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Saint Vincent And The Grenadines&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Samoa&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;San Marino&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Sao Tome And Principe&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Saudi Arabia&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Senegal&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Serbia&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Seychelles&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Sierra Leone&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Singapore&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Sint Maarten (dutch Part)&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Slovakia&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Slovenia&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Solomon Islands&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Somalia&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;South Africa&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;South Georgia And The South Sandwich Islands&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;South Sudan&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Spain&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Sri Lanka&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Sudan&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Suriname&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Svalbard And Jan Mayen&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Swaziland&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Sweden&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Switzerland&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Syrian Arab Republic&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Taiwan, Province Of China&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Tajikistan&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Tanzania, United Republic Of&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Thailand&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Timor-leste&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Togo&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Tokelau&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Tonga&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Trinidad And Tobago&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Tunisia&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Turkey&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Turkmenistan&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Turks And Caicos Islands&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Tuvalu&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Uganda&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Ukraine&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;United Arab Emirates&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;United Kingdom&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;United States&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;United States Minor Outlying Islands&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Uruguay&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Uzbekistan&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Vanuatu&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Venezuela, Bolivarian Republic Of&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Viet Nam&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Virgin Islands, British&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Virgin Islands, U.s.&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Wallis And Futuna&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Western Sahara&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Yemen&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Zambia&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Zimbabwe&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;];&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It follows the ISO 3166-1-alpha-2 standard. You don&#39;t need an array with countries everyday but, when you do, getting it is a pain. I am putting it here so my future self doesn&#39;t have to look for it again.&lt;/p&gt;&#xA;&lt;p&gt;Here&#39;s how I got the list:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;$&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;jQuery&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;String&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;prototype&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;capitalize&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#31748f&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;replace&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;/(?:^|\s)\S/g&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;toUpperCase&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;();&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;};&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;countries&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;var countries = [&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;tbody&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;find&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;tr&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;each&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;country&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;find&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;td&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;last&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;().&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;text&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ebbcba&#34;&gt;country&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;country&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;toLowerCase&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;().&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;capitalize&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#31748f&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ebbcba&#34;&gt;countries&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;countries&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;\&amp;#34;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;country&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;\&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ebbcba&#34;&gt;countries&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;countries&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;, &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;\&amp;#34;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;country&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;\&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;countries&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;countries&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;];&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;console&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;log&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;countries&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If you run that script in &lt;a href=&#34;http://www.iso.org/iso/country_codes/iso_3166_code_lists/country_names_and_code_elements.htm&#34;&gt;here&lt;/a&gt;, you&#39;ll get a nice string printed on the console which you can copy and paste and use as an array. Quick 5-minute hack FTW.&lt;/p&gt;&#xA;</description>
      <pubDate>Fri, 28 Jun 2013 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Design For Your Mother</title>
      <link>https://martianwabbit.com/2013/02/20/Design-for-your-mother.html</link>
      <description>&lt;p&gt;I am not really that much of a designer. I&#39;ve worked as one but, I&#39;d never describe me as a &amp;quot;web designer&amp;quot;. I am simply not that good with designing things. I do have good taste though and, can tell good design apart from bad design. I also have a solid knowledge of design and UX in general which is enough for my day to day activities. At the end of the day, the only thing I know about design, is that good design should be easy to use. How easy? Well, my mother should be able to use it without having to ask for my help. I obviously know that not all mothers need help when it comes to computers (to be honest, mine can handle herself just fine without me) but, the point is, your design should be easy to use first, and nice-looking second. My mother should be able to use your application without having to think too hard. Users are lazy and they like being able to do stuff without thinking. Try as hard as possible to make it easy for them to not think.&lt;/p&gt;&#xA;&lt;p&gt;I really like how simple interfaces are kind of trending these days. It really is great, simple design helps get the message through and allows users to interact more freely with the web. I&#39;ve always gone with &amp;quot;minimalist&amp;quot; designs mostly because, it&#39;s easier to get right when you are not that great of a designer and also because it&#39;s easier for the user to interact with any application if they are only presented what they need at any given moment.&lt;/p&gt;&#xA;&lt;p&gt;Are you sure you need that extra button? Would anyone apart from power users benefit from having this on the interface? Will this get the message through? Can we hide all of this complexity so they can find it if they need it but wont get in the way if they don&#39;t?&lt;/p&gt;&#xA;&lt;p&gt;Think about, simple design is awesome, &lt;a href=&#34;http://www.sensible.com/dmmt.html&#34;&gt;don&#39;t make me think&lt;/a&gt; and don&#39;t make my mother ask me for help.&lt;/p&gt;&#xA;</description>
      <pubDate>Wed, 20 Feb 2013 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Organizing a Javascript MVC Project</title>
      <link>https://martianwabbit.com/2013/02/01/organizing-a-javascript-mvc-project.html</link>
      <description>&lt;p&gt; &#xD;&#xA;I&#39;ve been doing a lot of javascript development lately. My work as a frontend developer for Laureate has forced me to seriously how we organize the frontend code so it&#39;s easy to work with and hard for us to make mistakes.&#xD;&#xA;&lt;/p&gt;&#xD;&#xA;&lt;p&gt;&#xD;&#xA;As it stands, I developed the frontend structure of the project (I am not sure if I am allowed to share it) we are currently building. We use &lt;a href=&#34;http://www.canjs.us&#34;&gt;can.js&lt;/a&gt; as our MVC framework of choice and use &lt;a href=&#34;http://www.gruntjs.com/&#34;&gt;grunt&lt;/a&gt; to stick all the files together and check them for errors. All this, in the effort to be as agile as possible.&#xD;&#xA;&lt;/p&gt;&#xD;&#xA;&lt;p&gt;&#xD;&#xA;Coming up with a structure was pretty hard but, I think out current structure works pretty well. Our folder structure looks somewhat like this:&#xD;&#xA;&lt;/p&gt;&#xD;&#xA;&lt;pre&gt;&#xD;&#xA;    -Project&#xD;&#xA;        -Application&#xD;&#xA;            -Assets&#xD;&#xA;                -Images&#xD;&#xA;                -Css&#xD;&#xA;            -Javascript&#xD;&#xA;                -Models&#xD;&#xA;                -Views&#xD;&#xA;                -Controllers&#xD;&#xA;                -libs&#xD;&#xA;                    -Plugins&#xD;&#xA;                    jQuery.js&#xD;&#xA;                app.js&#xD;&#xA;        -dist&#xD;&#xA;            -app.min.js&#xD;&#xA;            -libs.min.js&#xD;&#xA;        index.html&#xD;&#xA;        grunt.js&#xD;&#xA;&lt;/pre&gt;&#xD;&#xA;&lt;p&gt;&#xD;&#xA;It might look complicated, but it&#39;s actually fairly simple. I&#39;ll try to break it down, show how we use grunt to generate &lt;code&gt;app.min.js&lt;/code&gt; and &lt;code&gt;libs.min.js&lt;/code&gt; and how they all generally fit in together.&#xD;&#xA;&lt;/p&gt;&#xD;&#xA;&lt;h2&gt;Folder &amp;amp; File Structure&lt;/h2&gt;&#xD;&#xA;&lt;p&gt;&#xD;&#xA;The folder structure is fairly straight forward. Inside the &lt;code&gt;Application&lt;/code&gt; folder we hold all of our important files. The only important folder here is the one called &lt;code&gt;Javascript&lt;/code&gt;, this is where we store all of our Models, Views and Controllers which at the end, make up our entire application. You can have more folders inside of these and grunt can still fetch all of their contents to build up the final files.&#xD;&#xA;&lt;/p&gt;&#xD;&#xA;&lt;p&gt;&#xD;&#xA;Here&#39;s what a raw controller inside this folder looks like:&#xD;&#xA;&lt;/p&gt;&#xD;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;(&lt;/span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;namespace&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;undefined&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;use strict&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;ControllerName&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;can&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;Control&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;({&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;init&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;element&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;options&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;self&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#6e6a86&#34;&gt;// Actual code stuff&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e6a86&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#908caa&#34;&gt;});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;namespace&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;Controllers&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;namespace&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;Controllers&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{};&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;namespace&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;Controllers&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;ControllerName&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;ControllerName&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;}(&lt;/span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;));&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&#xD;&#xA;As you can see the only thing we are doing which isn&#39;t immediately obvious is to add the controller to the namespace&#39;s Controller object. In our case, this is the window object. This is great because we don&#39;t populate the global namespace with every single controller and because we can access any controller like this: &lt;code&gt;Controllers.ControllerName&lt;/code&gt;. We do the same for models:&#xD;&#xA;&lt;/p&gt;&#xD;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;(&lt;/span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;namespace&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;undefined&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;use strict&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#31748f&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;ModelName&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;can&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;Model&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;({&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ebbcba&#34;&gt;findOne&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;GET /getModel&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#908caa&#34;&gt;},&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;namespace&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;Models&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;namespace&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;Models&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{};&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;namespace&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;Models&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;ModelName&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;ModelName&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;}(&lt;/span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;));&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&#xD;&#xA;In our case, views are simple .ejs files so there&#39;s nothing special about how we define them, although you could compile them to javascript and tell grunt to minimize it along with the whole code which would probably faster to load in the long run.&#xD;&#xA;&lt;/p&gt;&#xD;&#xA;&lt;p&gt;&#xD;&#xA;Now that we have our files in place, let&#39;s move into using grunt to generate the finalized application files will be using in production.&#xD;&#xA;&lt;/p&gt;&#xD;&#xA;&lt;h2&gt;Grunt&lt;/h2&gt;&#xD;&#xA;&lt;p&gt;Here&#39;s what an example grunt file would look like:&lt;/p&gt;&#xD;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;module&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;exports&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;grunt&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;grunt&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;initConfig&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;({&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ebbcba&#34;&gt;concat&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#ebbcba&#34;&gt;app&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ebbcba&#34;&gt;src&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;Application/Assets/Javascript/controllers/**/*.js&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;Application/Assets/Javascript/models/**/*.js&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;Application/Assets/Javascript/app.js&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#908caa&#34;&gt;],&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ebbcba&#34;&gt;dest&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;dist/app.js&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#908caa&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#ebbcba&#34;&gt;libs&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ebbcba&#34;&gt;src&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;Application/Assets/Javascript/libs/jQuery.js&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;Application/Assets/Javascript/libs/plugins/**/*.js&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#908caa&#34;&gt;],&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ebbcba&#34;&gt;dest&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;dist/libs.js&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#908caa&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ebbcba&#34;&gt;min&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#ebbcba&#34;&gt;app&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ebbcba&#34;&gt;src&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;&amp;amp;lt;config:concat.app.dest&amp;amp;gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;],&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ebbcba&#34;&gt;dest&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;dist/app.min.js&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#908caa&#34;&gt;},&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#ebbcba&#34;&gt;libs&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ebbcba&#34;&gt;src&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;&amp;amp;lt;config:concat.libs.dest&amp;amp;gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;],&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ebbcba&#34;&gt;dest&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;dist/libs.min.js&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#908caa&#34;&gt;});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;grunt&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;registerTask&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;default&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;concat min&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;};&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This particular grunt file doesn&#39;t do much. When you call the &lt;code&gt;grunt&lt;/code&gt; command it&#39;ll concatenate all of the files in the javascript folder (except for the views) and all of the libraries into two files, libs.js and app.js (and their minimized equivalents). These can be included directly into the html to have the final application files.&lt;/p&gt;&#xD;&#xA;&lt;h2&gt;That&#39;s it&lt;/h2&gt;&#xD;&#xA;&lt;p&gt;I hope this is somewhat useful to someone, it actually took me a while to find something I was comfortable with so try experimenting with variations and let me know about it. This is how I currently do things but, I am sure there are places where I can improve the design. This mostly revolves around keeping the global namespace as clean as possible and making files that can be easily concatenated to save space when you have to finalized copy which, I think are generally good goals.&lt;/p&gt;&#xD;&#xA;</description>
      <pubDate>Fri, 01 Feb 2013 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Surviving a Hackathon</title>
      <link>https://martianwabbit.com/2013/01/27/surviving-a-hackathon.html</link>
      <description>&lt;p&gt;Last week I finally went to &lt;a href=&#34;http://vdhackathon.org&#34;&gt;my first hackathon&lt;/a&gt; and it was an awesome experience! Here are a couple of things everyone should watch out for when they go to a hackathon for the first time.&lt;/p&gt;&#xA;&lt;h2&gt;What you&#39;ll need&lt;/h2&gt;&#xA;&lt;p&gt;Okay, first things first, hackathons are apparently seriously social events. If you are more of an introvert it might be good for a you to bring along a friend, it&#39;ll make your time there easier. I brought a friend along and it made the whole thing a lot more fun.&lt;/p&gt;&#xA;&lt;p&gt;There are other things which are kind of pretty obvious stuff such as: a laptop if you are going to be doing some coding and headphones if you need to block the world to get things done (Although, like I said, these are social events so try not to get too lost in your code and enjoy the company). Cameras are also great, your phone will probably do if you don&#39;t feel like carrying additional stuff.&lt;/p&gt;&#xA;&lt;p&gt;Finally, another thing, which I didn&#39;t actually bring with me on purpose are business cards. Even though I was just hanging around and doing stuff a bunch of people approached me with project ideas and business offers. So if you are looking for a job that might also be a good place to look for one. I almost ran out of them during the weekend!&lt;/p&gt;&#xA;&lt;h2&gt;Hackathoning!&lt;/h2&gt;&#xA;&lt;p&gt;Hackathoning is the only reason you are awake at 9am on a Saturday so it&#39;s important to keep it in mind. If there&#39;s a theme which was set beforehand, I&#39;d recommend you go ahead and think of ideas so you can discuss them with your teammates. If there&#39;s no theme then thinking of ideas is still a good idea.&lt;/p&gt;&#xA;&lt;p&gt;The first thing you&#39;ll need to do if find a team, if you wanna work on your own (which I don&#39;t think is a good idea) or brought along your own team, you are done with this and can go ahead and start brainstorming. If you didn&#39;t and have to find a team look for people who can complement your skill-set. Let them know the kind of thing you wanna work on and what you can do or want to do.&lt;/p&gt;&#xA;&lt;p&gt;Once you are in a team, you are ready to make a plan. Make sure the plan is feasible, you only have a limited amount of time after all so, if it&#39;s too complicated you might have enough time to finish, you can always continue working on the project after the hackathon so, keep it achievable.&lt;/p&gt;&#xA;&lt;p&gt;At this point, you are ready to start coding! So go out there and code! Try not to get too distracted or too focused, try to socialize and get stuff done at the same time. If you can balance these things you&#39;ll survive this hackathon successfully.&lt;/p&gt;&#xA;&lt;h3&gt;Networking&lt;/h3&gt;&#xA;&lt;p&gt;This is, what I found to be, the most important aspect of the hackathon. You cannot only socialize but, you can also make new friends, business partners, clients and jobs. So try to talk with everyone, it&#39;s always nice to find new project to work on.&lt;/p&gt;&#xA;&lt;h2&gt;Closing up&lt;/h2&gt;&#xA;&lt;p&gt;Hackathoning is fun! You can network, socialize, code and have a general good weekend so, if you haven&#39;t gone to one, I highly recommend you do.&lt;/p&gt;&#xA;</description>
      <pubDate>Sun, 27 Jan 2013 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Creating a model while skipping validations in Rails</title>
      <link>https://martianwabbit.com/2013/01/18/rails-quickhint-1.html</link>
      <description>&lt;p&gt;This certainly needs some background. I&#39;ve been working on a random rails project for the better part of the last couple of months.&#xA;This project uses devise to manage logins and user registration. Recently registrations started failing in the site which, didn&#39;t&#xA;make sense since they had been working fine for a while. So I started digging into it.&lt;/p&gt;&#xA;&lt;p&gt;According to rails the user url didn&#39;t exist so it couldn&#39;t redirect back to the homepage after a successful registration.&#xA;After much digging around the stack trace I finally figured it out. Turns out that when a devise user is created a user profile is created along with it(this is specific to my application). But, that&#39;s normal, what started causing problems was that the profile had a validation for a unique username, which blank, wasn&#39;t (since the username is only supposed to be set after registration).&lt;/p&gt;&#xA;&lt;p&gt;So, what&#39;s the solution? Easy, all I had to make sure of was that when I created the user profile I disabled validations for the user profile model. Here&#39;s how I did it:&lt;/p&gt;&#xA;&lt;p&gt;user.rb&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#9ccfd8&#34;&gt;User&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;ActiveRecord&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;Base&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;after_create&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;:create_profile&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;has_one&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;:user_profile&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;:dependent&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;:destroy&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#31748f&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;create_profile&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ebbcba&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;build_user_profile&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ebbcba&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;user_profile&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;save&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;:validate&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;false&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#31748f&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;user_profile.rb&lt;/p&gt;&#xA;``` ruby&#xA;class UserProfile &lt; ActiveRecord::Base&#xA;  belongs_to :user&#xA;&lt;p&gt;attr_accessible :username&#xA;validates_uniqueness_of :username&#xA;end&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;&amp;lt;p&amp;gt;This bug took around 2 hours to fix, I guess not all errors in rails are as descriptive and easy to follow as they should. But at the end of it all, it&#39;s my fault for not paying attention.&amp;lt;/p&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;</description>
      <pubDate>Fri, 18 Jan 2013 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Hiding elements when they lose focus with jQuery</title>
      <link>https://martianwabbit.com/2013/01/10/onBlur-for-divs-with-jquery.html</link>
      <description>&lt;p&gt;There&#39;s no standard way of hiding an element when it loses it&#39;s &#39;focus&#39; using Javascript or jQuery. Here&#39;s how I&#39;ve been  doing it lately:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;.userMenu a&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;on&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;click&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;.loginForm&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;stop&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;().&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;fadeToggle&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;100&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;linear&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ebbcba&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;body&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;on&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;click.loginform&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;e&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#31748f&#34;&gt;if&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;e&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;target&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;parents&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;.loginForm, .userMenu&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ebbcba&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;.loginForm&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;fadeToggle&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;100&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ebbcba&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;body&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;).&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;off&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;.loginform&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#908caa&#34;&gt;});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#908caa&#34;&gt;});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;As you can see, it&#39;s fairly straight forward. Basically, when you click the button that shows the element, it toggle&#39;s the target element&#39;s visibility. When it is visible, an event is bound to the body, so whenever it is clicked, it checks if the click was on the element or if it wasn&#39;t. If it wasn&#39;t on the element, we hide the element and remove the event from the body. If it was on the element, nothing happens.&lt;/p&gt;&#xA;&lt;p&gt;So far, I like this method a lot, mostly because it is simple and gets things done quickly.&lt;/p&gt;&#xA;</description>
      <pubDate>Thu, 10 Jan 2013 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>New Year&#39;s Resolutions 2013</title>
      <link>https://martianwabbit.com/2013/01/05/new-years-resolutions-2013.html</link>
      <description>&lt;p&gt;I&#39;ll begin by saying this will be a great year. I have a lot of objectives and things I want to accomplish. Some will be the culmination of past efforts and some are new things I want to get done. My first resolution is to blog more. I&#39;ve been saying I&#39;ll start blogging more often for a couple of years now and I keep failing. I&#39;ll change that and thus, my first objective is to write 52 posts this year, one per week. Since I don&#39;t alway have too much time I am not requiring myself to publish every week as long as I get it done eventually. I also will write small random stuff most of the time since, that&#39;s how I roll.&lt;/p&gt;&#xA;&lt;p&gt;My second resolution is to start a company. I am currently participating in contest sponsored by my university. If I were to win I&#39;d be established as a company in a couple of months. Even if this doesn&#39;t work out, I&#39;ll get started on my own.&lt;/p&gt;&#xA;&lt;p&gt;There&#39;s more development and learning to be done in 2013 as well. I&#39;d say 2012 was the year of Javascript. Working as a front-end developer forces you to learn a lot of Javascript so it&#39;s been a great experience. This year I&#39;ll further evolve as a Javascript developer but, I also want to master ruby. I just love that language and even though I&#39;ve worked with it a lot I don&#39;t feel as confident in my skills. It still feels too magical for my taste. I&#39;ll be working a lot more on personal projects (and blogging about it as well). I already have one  android app in mind and a couple of gems to make my life easier.&lt;/p&gt;&#xA;&lt;p&gt;In the end I hope this year is as great as the last one and I learn, develop and grow a lot more.&lt;/p&gt;&#xA;</description>
      <pubDate>Sat, 05 Jan 2013 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>A little House Keeping</title>
      <link>https://martianwabbit.com/2012/10/15/housekeeping.html</link>
      <description>&lt;p&gt;Hello world! It&#39;s that time of the year again where I am forced to do a little house keeping. My blog has been incredibly hideous for a couple of months now and I finally got the opportunity to do somethign about it.&lt;/p&gt;&#xA;&lt;p&gt;I&#39;ve redesigned it and, since apparently I am terrible at designing stuff I went with a very minimalistic approach. So my new blog is easier on the eyes, simpler and, will now become my homepage.&lt;/p&gt;&#xA;&lt;p&gt;There isn&#39;t much to it, I&#39;ll be moving a couple of my old posts over to the new blog and I&#39;ll do my best to start blogging at least twice a week. It&#39;s actually harder said than done...&lt;/p&gt;&#xA;&lt;p&gt;The blog runs on Jekyll now, mostly because it is hacker friendlier than tumblr and I love the idea of version controlled blogging. I will also remove comments from the blog since they distract me quite often. If anyone feels the need to tell me anything they are free to email me.&lt;/p&gt;&#xA;</description>
      <pubDate>Mon, 15 Oct 2012 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Random stuff has been happening lately</title>
      <link>https://martianwabbit.com/2012/07/30/28387444881.html</link>
      <description>&lt;p&gt;Ok, so what’s up dear readers? I’ve been up to a bunch of random things lately so I’ll write them down just so I know what I was up to at this time of year later on.&lt;/p&gt;&#xA;&lt;p&gt;First of all, I got a new job. I guess I’ll stop freelancing for the time being and focus on my new (awesome) job. Starting 2 weeks ago, I’ll be working as a “Graphic Developer” for the HNSC, which, is a fancy way to say I am a front end developer. I get to play with lots of javascript and are surrounded by amazing people I didn’t even know about! So yes, lots of new people and cool projects which might actually inspire me to build new and cool things on my own.&lt;/p&gt;&#xA;&lt;p&gt;Second, I’ve been getting into javascript a lot lately. Like a serious lot. Even before my new job, I started reading and developing almost exclusively in javascript. I feel like I’ve been improving a lot constantly these past couple of weeks and am really happy about it. I’ve read and develop a lot, trying to get my vanilla javascript up to speed and I’ve been working with a lot of jQuery at work as well so that’s that. Today I built a jQuery plugin which, doesn’t do much but it’s exactly what I needed I’ll talk more about it once I figure out if I can release it as open source. That’ll hopefully happen soon.&lt;/p&gt;&#xA;&lt;p&gt;Third, since I recently started working as a frontend developer, which is almost completely opposite from my old freelancing stuff where I focused on the backend, I decided to start a pears repository of stuff I use often just to keep mental notes and to share with you guys. You can find them here: &lt;a href=&#34;http://patterns.martianwabbit.com/&#34;&gt;&lt;a href=&#34;http://patterns.martianwabbit.com/&#34;&gt;http://patterns.martianwabbit.com/&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;And I guess that’s basically it, school is as hard as usual, I am still pretty dumb and I get paid to program for 4 hours on a daily basis, I am doing pretty good these days.&lt;/p&gt;&#xA;</description>
      <pubDate>Mon, 30 Jul 2012 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Playing with Arduinos, RFID cards and Ruby</title>
      <link>https://martianwabbit.com/2012/05/28/23951072604.html</link>
      <description>&lt;p&gt;&lt;em&gt;This is probably one of the coolest things I’ve worked on in a while and I also happen to have time to write a blog post about it, which is great, I love working with hardware from time to time.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;It definitely isn’t the biggest programming challenge I’ve had but it is pretty cool and I am certain others might find it interesting. Yesterday, I was helping my sister with a project she was doing for her professional practice (she is a very weird kind of engineer who specializes in automation stuff, she is great at it), she was basically asked to open a door with a RFID card.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;http://media.tumblr.com/tumblr_m4r3qapJDn1qazvm1.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;To do this, she had a very simple plan, we plug an RFID card reader into a computer which then sends the RFID over to a computer and then tells an Arduino to open the door. She used this &lt;a href=&#34;http://www.sparkfun.com/products/8628&#34;&gt;RFID Reader&lt;/a&gt; (RFID Reader ID-20 (125 kHz)) which is pretty inexpensive and easy to plug into a computer.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;http://media.tumblr.com/tumblr_m4r3roDKpw1qazvm1.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;This was fairly straight-forward for her, she mounted the RFID card reader into a board and plugged it into her computer along with her Arduino. She then fired up putty and set it to read the RFID card reader’s serial port (COM 9, in our case) which showed us the RFID of any card we read. &lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;http://media.tumblr.com/tumblr_m4r3qluG5S1qazvm1.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is where I came in, she isn’t that much of a coder so she asked me for help on how to finish the connection between the RFID reader and the Arduino. This is what I came up in Ruby:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;require&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;serialport&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;@rfid_reader&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;SerialPort&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;4&lt;/span&gt; &lt;span style=&#34;color:#6e6a86&#34;&gt;# Open COM 5&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;@arduino&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;SerialPort&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#6e6a86&#34;&gt;# Open COM 3&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;@valid_ids&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;4500B8D690BB&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;readRFID&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;rfid&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;@rfid_reader&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;gets&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;rfid&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;strip!&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;rfid&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;slice&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;rfid&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;size&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;13&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;rfid&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;slice&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;rfid&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;size&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;14&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#31748f&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;rfid&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;puts&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Waiting for input...&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;loop&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;do&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;rfid&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;readRFID&lt;/span&gt; &lt;span style=&#34;color:#6e6a86&#34;&gt;# Get the RFID of the current card&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#31748f&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;rfid&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;empty?&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#31748f&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;@valid_ids&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;include?&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;rfid&lt;/span&gt; &lt;span style=&#34;color:#6e6a86&#34;&gt;# is the ID valid?&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#ebbcba&#34;&gt;puts&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;RFID: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;rfid&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#6e6a86&#34;&gt;# Send the arduino a signal so it opens the lock.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#ebbcba&#34;&gt;@arduino&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;write&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#31748f&#34;&gt;else&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#ebbcba&#34;&gt;puts&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;Invalid RFID: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;rfid&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#ebbcba&#34;&gt;@arduino&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;write&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#31748f&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#31748f&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;@arduino&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;write&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I was actually going to use C++ but I prefer using Ruby whenever possible. This is a very simple code snippet but it did the job wonderfully. The code is documented and very simple, I used the fabulous &lt;a href=&#34;https://github.com/hparra/ruby-serialport&#34;&gt;ruby-serialport&lt;/a&gt; gem which, took care of all the heavy lifting for me.&lt;/p&gt;&#xA;&lt;p&gt;This was only half of the work though, we also needed to get the Arduino to wait for an input coming from the computer and do something whenever a value is received, in this case we wanted to open a lock so that’s what we’ll do.&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;setup&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;Serial&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;begin&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;9600&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;pinMode&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;12&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;OUTPUT&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;serialEvent&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;digitalWrite&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;12&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;HIGH&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;delay&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;2000&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;digitalWrite&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;12&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;LOW&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;Serial&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;read&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The code is even simpler than the Ruby one running on the computer. All it does is wait for there to be an input and then activate a pin when there is one. Ruby is pretty much doing all of the actual processing and telling the Arduino when and what to do.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;http://media.tumblr.com/tumblr_m4r3s7jnwp1qazvm1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Finally, all we had to do was fire up the terminal and run our Ruby program which would then wait for there to be an input form the RFID reader. Whenever there’s an input it’ll log it and then, if the RFID is registered, tell the Arduino to open the lock. And that’s basically it, it made a nice problem to solve for fun.&lt;/p&gt;&#xA;</description>
      <pubDate>Mon, 28 May 2012 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Mew: Windows Markdown Editor</title>
      <link>https://martianwabbit.com/2011/12/04/13742736909.html</link>
      <description>&lt;p&gt;So for some mysterious and unknown reason I am selling a windows markdown editor. It’s called Mew, and you can get it for $8 at &lt;a href=&#34;http://codecanyon.net/item/mew-windows-markdown-editor/924879&#34;&gt;codecanyon&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Mew, as you’d expect from a markdown editor is pretty simple. I built it for myself using C# and the awesome .net framework. I was basically forced into building it since, there wasn’t a nice markdown editor for windows available. I worked on polishing it for a couple of weeks and now here the end result:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://codecanyon.net/item/mew-windows-markdown-editor/924879&#34;&gt;&lt;img src=&#34;http://media.tumblr.com/tumblr_lvp53kpOSQ1qazvm1.jpg&#34;/&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;It has built-in snippets, color themes and a live-preview, among other things.&lt;/p&gt;&#xA;&lt;p&gt;I am fairly happy with the results. It provides a simple, yet customizable enviorment, it’s fast and really simple. I’ve tried to create an editor that doesn’t get in your way and that actually tries to help you. It was built for my needs so, these are addressed completely. I might add more features in future versions if anyone requests them since, I want it to be good editor for everyone.&lt;/p&gt;&#xA;&lt;p&gt;I have a small list of things I’ve been considering to add so, we’ll see how that ends up working. Hopefully I’ll get somewhere with it and, even if it’s not a good seller, I did enjoy building it, working with C# is entertaining and pretty cool so, it made the whole process a nice experience. If I don’t make a single sale for a couple of months I’ll open-source it since, it’d mean there’s no commercial potential for it.&lt;/p&gt;&#xA;</description>
      <pubDate>Sun, 04 Dec 2011 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>PHP Routs</title>
      <link>https://martianwabbit.com/2011/07/11/7516077182.html</link>
      <description>&lt;p&gt;I am probably the most bored person I know. What I mean by this is, that I am almost never entertained. Most of the time, I&#39;ll be doing something for some 5 minutes before my short attention span takes me elsewhere. This has stopped me from finishing a lot of personal projects in the past, losing a lot of cool things I built halfway through. &lt;/p&gt;&#xA;&lt;p&gt;Since, I almost never finish my projects, I&#39;ve decided to start publishing them. Hopefully, just knowing that others are looking at my code my motivate me to continue developing something. I&#39;ve finally started using &lt;a title=&#34;My Github Account&#34; href=&#34;https://github.com/Seich&#34;&gt;my Github account&lt;/a&gt; to it&#39;s fullest. I honestly doubt it&#39;ll actually have a great effect on me but, any motivation I might get will prove useful. So, in conclusion, I&#39;ll be releasing most of the stuff I do whenever I am bored on my Github account and I&#39;ll be posting about it here, all in an attempt to keep me interested.&lt;/p&gt;&#xA;&lt;h2&gt;Introducing PHP Routs&lt;/h2&gt;&#xA;&lt;p&gt;Let&#39;s move on to my actual project. &lt;a title=&#34;PHP Routs&#34; href=&#34;http://routs.martianwabbit.com&#34;&gt;Routs&lt;/a&gt;, is a small PHP library built to handle URLs. Some background: I was playing with &lt;a title=&#34;Ruby&#39;s Sinatra&#34; href=&#34;htttp://www.sinatrarb.com&#34;&gt;Sinatra&lt;/a&gt; the other day and, just by reading the documentation I fell in love with how it managed URL routes (I later discovered I wasn&#39;t the only since, there are a bunch of projects written in PHP following it&#39;s example). So, I decided I wanted to do the same in PHP but, in a very simple way which, would allow me to easily implement it into any project by including a single file.&lt;/p&gt;&#xA;&lt;p&gt;It turned out to be a lot easier than I expected. After deciding on the syntax I would like to use with plugin I made huge advances in just a couple of lines. This is what I have so far:&lt;/p&gt;&#xA;&lt;p&gt;Let&#39;s say I am building an simple one page site for some guy named Bob. Since it&#39;s so simple, I want to have as much as I can in a single page. Routs allow me to do something like this:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;require&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;routs.php&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;Rout&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;get&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;home&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;homeFunction&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;homeFunction&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;$params&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;templateManager&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;Render&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;home.tpl&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;$params&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In this example I am using Routs to handle all get requests to example.com/home using the homeFunction() function. The part about the template manager is whatever method you&#39;re using, I&#39;ll be creating my own soonish. Now, I added a form to my html page and I want it to be handled on the same page. My routs handler changes into this:&lt;/p&gt;&#xA;&lt;pre style=&#34;color:#e0def4;background-color:#191724;&#34;&gt;&lt;code&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;require&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;routs.php&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;Rout&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;get&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;home&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;homeFunction&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#31748f&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;homeFunction&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;$params&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#908caa&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;templateManager&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;Render&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;home.tpl&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;$params&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;Rout&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;post&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;home&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#31748f&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;$params&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;){&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ebbcba&#34;&gt;mail&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;seich@martianwabbit.awesome&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;Some Subject&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ebbcba&#34;&gt;emailHandler&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#ebbcba&#34;&gt;Render&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f6c177&#34;&gt;&amp;#39;mailTemplate.tpl&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#ebbcba&#34;&gt;$params&lt;/span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#908caa&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#908caa&#34;&gt;});&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Which handles the the submitted form and so on. Basically, the possibilities are endless! :D So yeah, that&#39;s it, have fun with it, fork it, tell me why it sucks, etc.&lt;/p&gt;&#xA;</description>
      <pubDate>Mon, 11 Jul 2011 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>JustVector Social Icons Font</title>
      <link>https://martianwabbit.com/2011/04/04/4344642365.html</link>
      <description>&lt;div class=&#34;notice&#34;&gt;&#xA;&#x9;There&#39;s a new version available &lt;a href=&#34;/2014/09/15/just-vector-social-font-1-5.html&#34;&gt;here&lt;/a&gt;.&#xA;&lt;/div&gt;&#xA;&lt;p&gt;I&#39;ve been pretty bored lately, so I decided to redesign my &lt;a target=&#34;_self&#34; href=&#34;http://www.martianwabbit.com&#34;&gt;site&lt;/a&gt; and  found an awesome social icon set by Alex Peattie (&lt;a href=&#34;http://www.alexpeattie.com/&#34;&gt;&lt;a href=&#34;http://www.alexpeattie.com&#34;&gt;&lt;a href=&#34;http://www.alexpeattie.com&#34;&gt;http://www.alexpeattie.com&lt;/a&gt;&lt;/a&gt;&lt;/a&gt;) to go with the new design. The set is minimalistic and really cool! Unfortunately, I wasn&#39;t as happy to work with it as I would have liked to mainly because, I couldn&#39;t decide on what size I wanted the icons on the new site and thus, I found myself opening photoshop and resizing them far too often. I eventually, as you might have guessed by the post&#39;s title, decided that such an icon set would make an awesome font. So, I created a font file which included most icons from the set* . This would allow me to embed the font and get nice icons which, I can resize and recolor with css.&lt;/p&gt;&#xA;&lt;p&gt;I am very happy with the results, I&#39;ll be updating it soon as I wanna get rid of some of the icons  I included and replace them for others that I might think are more useful. The whole icon set is huge. So I&#39;ll keep all versions I make around just in case the icon you&#39;re looking for is in one of them. The main ones (Twitter, Facebook, Tumblr, etc.) will be on all versions of the set.&lt;/p&gt;&#xA;&lt;p&gt;I&#39;ve created a @font-face kit using fontsquirrel. So it&#39;s pretty much ready to be downloaded and used as it is right now. You can check out Alex&#39;s demos right &lt;a href=&#34;http://www.alexpeattie.com/projects/justvector_font/&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The font is distributed under the same license as the icons, the &lt;a href=&#34;http://artlibre.org/licence/lal/en&#34;&gt;Free Art License&lt;/a&gt; which, allows you to pretty much do anything you want with it. Read the license if you want details.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;* I didn&#39;t include all icons because, fonts have limited glyph spots available and I wanted to support as many keyboard layouts as possible by only including icons in common keys. For example, I didn&#39;t use any of the accent keys I have access to because I know most English keyboards wouldn&#39;t support them. (I have a Spanish keyboard)&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;http://cl.ly/2a2H3K0F1y423l182J0t&#34;&gt;Download Font Kit&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h2&gt;Update: V1.2&lt;/h2&gt;&#xA;&lt;p&gt;I found the first font a little hard to navigate so, I created a second version in which icons are now arranged alphabetically (mostly) and empty spaces where no icons could go were filled in with additional icons. This font version has less glyphs than the first version because it only uses letters and numbers. If you need some of the additional icons you can use the first one.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;http://cl.ly/3M0P0t2D2V403M1P2x2G&#34;&gt;Download Font Kit (v1.2)&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h2&gt;Tips&lt;/h2&gt;&#xA;&lt;p&gt;*When you use these icons add a text-shadow. It&#39;ll make the images smoother. Something like: &lt;code&gt;text-shadow: 0 0 1px #000;&lt;/code&gt; would do the trick.&lt;/p&gt;&#xA;</description>
      <pubDate>Mon, 04 Apr 2011 00:00:00 +0000</pubDate>
    </item>
  </channel>
</rss>