<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[NoSleep]]></title><description><![CDATA[Ramblings of a software engineer... or, the place where I can dump stuff so I don't forget it.]]></description><link>http://nosleep.ca/</link><generator>Ghost 0.11</generator><lastBuildDate>Fri, 10 Apr 2026 08:28:27 GMT</lastBuildDate><atom:link href="http://nosleep.ca/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Blender on Ubuntu Install Instructions]]></title><description><![CDATA[<p>A handy article when wanting to install the latest Blender for Ubuntu. It's a bit manual, but it gets the job done:</p>

<p><a href="https://ubuntuhandbook.org/index.php/2021/12/blender-3-0-released-install-tarball/">https://ubuntuhandbook.org/index.php/2021/12/blender-3-0-released-install-tarball/</a></p>]]></description><link>http://nosleep.ca/blender-on-ubuntu-install-instructions/</link><guid isPermaLink="false">e52243cf-ea68-4fc8-8258-344b60850895</guid><dc:creator><![CDATA[Derek Cunningham]]></dc:creator><pubDate>Tue, 15 Apr 2025 06:11:10 GMT</pubDate><content:encoded><![CDATA[<p>A handy article when wanting to install the latest Blender for Ubuntu. It's a bit manual, but it gets the job done:</p>

<p><a href="https://ubuntuhandbook.org/index.php/2021/12/blender-3-0-released-install-tarball/">https://ubuntuhandbook.org/index.php/2021/12/blender-3-0-released-install-tarball/</a></p>]]></content:encoded></item><item><title><![CDATA[JSON.Stringify() Circular Reference]]></title><description><![CDATA[<p>Troubleshooting JavaScript and TypeScript can often mean a lot of <code>console.log</code> statements, or logging out to your chosen log aggrigator (I'm looking at you, New Relic <code>;)</code>). At times, getting a dump of a detailed object is beneficial, which is where <code>JSON.Stringify()</code> comes in... however, since JavaScript objects are</p>]]></description><link>http://nosleep.ca/json-stringify-circular-reference/</link><guid isPermaLink="false">eed363e5-af1a-49ca-9e46-c8ce570a9764</guid><dc:creator><![CDATA[Derek Cunningham]]></dc:creator><pubDate>Thu, 13 Jun 2024 16:13:30 GMT</pubDate><content:encoded><![CDATA[<p>Troubleshooting JavaScript and TypeScript can often mean a lot of <code>console.log</code> statements, or logging out to your chosen log aggrigator (I'm looking at you, New Relic <code>;)</code>). At times, getting a dump of a detailed object is beneficial, which is where <code>JSON.Stringify()</code> comes in... however, since JavaScript objects are able to develop hierarchies by passing references as properties, those hierarchies can contain circular references.</p>

<p>To circumvent having a circular reference error thrown, we can implement a quick utility function. Here's some sample code that for that, note that the <code>res</code> object we're using here is NOT and adequate offender for this test, so please substitute your own offending object with this utility function.</p>

<h6 id="code">Code</h6>

<pre><code class="language-JavaScript">const res = { circularObject: true }; // no, it isn't

console.log(${JSON.stringify(res, getCircularReplacer())});

function getCircularReplacer() {  
  const seen = new WeakSet();
  // @ts-ignore
  return (key, value) =&gt; {
    if (typeof value === "object" &amp;&amp; value !== null) {
      if (seen.has(value)) {
        return;
      }
      seen.add(value);
    }
    return value;
  };
};
</code></pre>]]></content:encoded></item><item><title><![CDATA[JIRA Shortcut]]></title><description><![CDATA[<p>A lot of companies these days eat, sleep and breathe in JIRA.</p>

<p>Over the years, I've seen so many folks open the most recent JIRA ticket they're working on, and just change the URL in order to get to the ticket they want to discuss. This seems odd at times,</p>]]></description><link>http://nosleep.ca/jira-shortcut/</link><guid isPermaLink="false">1b95cc63-8503-449d-b8d2-6bda7806e9b4</guid><dc:creator><![CDATA[Derek Cunningham]]></dc:creator><pubDate>Thu, 13 Jun 2024 16:05:19 GMT</pubDate><content:encoded><![CDATA[<p>A lot of companies these days eat, sleep and breathe in JIRA.</p>

<p>Over the years, I've seen so many folks open the most recent JIRA ticket they're working on, and just change the URL in order to get to the ticket they want to discuss. This seems odd at times, but it works.</p>

<p>To make this more convenient, I've created a Chrome bookmark that will automatically jump to your JIRA ticket.</p>

<p>Some key pieces of information needed for this to work are:</p>

<ul>
<li>ticket prefix, identified as <code>PREFIX</code></li>
<li>atlassian sub-domain, identified below as <code>SUBDOMAIN</code></li>
</ul>

<h6 id="codesnippet">Code Snippet</h6>

<pre><code class="language-javascript">javascript:(() =&gt; {  
  let ticket = prompt('JIRA Ticket: ', 'PREFIX-');
  if (ticket !== null) {
    window.open(`https://SUBDOMAIN.atlassian.net/browse/${ticket}`, '_blank');
  }
})();
</code></pre>

<h6 id="cautionbrokencodeahead"><code>CAUTION</code> Broken Code ahead:</h6>

<p><mark>The below code doesn't work, but I'm noting it here for future investigation.</mark></p>

<p>For added flair, we can also add a favicon reference, so long as you have one (or choose one) that's available via a full URL:</p>

<pre><code class="language-javascript">var link = document.querySelector("link[rel~='icon']");  
if (!link) {  
    link = document.createElement('link');
    link.rel = 'icon';
    document.head.appendChild(link);
}
link.href = 'https://stackoverflow.com/favicon.ico';  
</code></pre>]]></content:encoded></item><item><title><![CDATA[Server Resource Monitoring - Glances]]></title><description><![CDATA[<p>As I near the end of the saga of my new 3D Printable PC case, I'm starting to look at additional bits that I'd like to sort out.</p>

<p>The GPU fans occassionally kickup while I'm deep in Blender--on said PC case--so I wanted to find some options for seeing system</p>]]></description><link>http://nosleep.ca/server-resource-monitoring-glances/</link><guid isPermaLink="false">c1e64e85-a36b-4e96-bafa-6744c861e351</guid><dc:creator><![CDATA[Derek Cunningham]]></dc:creator><pubDate>Fri, 03 Nov 2023 07:13:05 GMT</pubDate><content:encoded><![CDATA[<p>As I near the end of the saga of my new 3D Printable PC case, I'm starting to look at additional bits that I'd like to sort out.</p>

<p>The GPU fans occassionally kickup while I'm deep in Blender--on said PC case--so I wanted to find some options for seeing system temperatures. Google lead me to <code>Glances</code>, which is not only temps, but all system specs. Not only that, it satisfies some of my other wants: namely cross-platform, and can work in a web-based and/or server-client fashion.</p>

<p>So I reached out to my trusty installer, <code>apt</code>, and was underway. Terminal mode was cool, then I discovered it has a web-mode. So I launched it... only to get a blank screen. Turns out <code>Debian</code> package policy forbids pre-compiled content, so the necessary helper files in the package are missing.</p>

<h6 id="futuremenotes">Future-Me Notes</h6>

<p>And thus, future me, here's how I decided to resolve this issue tonight. YMMV, because you change your mind... a lot... seriously, you should work on that. I digress...</p>

<p>I'm not deep into <code>python</code> shtuff, so the <code>pip</code> etc. approaches don't always directly appeal to me. So I tried the <code>wget</code> method, and it didn't seem to want to load. I looked at the <code>snap install</code> method, and the tool doesn't work right in terminal mode, let alone web mode.</p>

<p>And so, I ventured into <code>python</code>. The <code>pip</code> commands were calling for a <code>venv</code>, which seemed both wonky and overkill. Wonky, because what if I want to run this often? Overkill because it seems like <code>glances</code> should be part of my <em>main environment</em>, not a <em>virtual</em> environment. <code>Docker</code> gave me the <em>heebee geebees</em> for the same reason... although, half a blog post in, <code>Docker</code> is looking pretty tempting.</p>

<p>Alas, <code>pipx</code> came to the rescue, it seems to obfuscate away this virtual environment bit somewhat.</p>

<p>So, Dear Future Me, here's what unlocked us tonight:</p>

<pre><code class="language-bash">$ pipx install `glances[web]`
</code></pre>

<p>And to run <code>glances</code>, via <code>pipx</code>:</p>

<pre><code class="language-bash">$ pipx run glances
</code></pre>

<p>But, <code>pipx</code> also adds the bins to <code>~/.local/bin</code>, so if you update your path, you can run it directly:</p>

<pre><code class="language-bash">$ export PATH=$PATH:/home/derek/.local/bin
$ glances -w
</code></pre>

<p>Onwards to system monitoring!</p>

<p><img src="http://nosleep.ca/content/images/2023/11/Screenshot-from-2023-11-03-03-15-10.png" alt=""></p>]]></content:encoded></item><item><title><![CDATA[Blender, on Ubuntu, using... AMD Radeon]]></title><description><![CDATA[<p><mark><strong><em>Update, April 2025</em></strong></mark></p>

<p>The below steps may no longer be needed, as the latest Ubuntu 24.04 LTS works well with AMD's instructions available here:</p>

<p><a href="https://rocm.docs.amd.com/projects/install-on-linux/en/latest/install/quick-start.html">https://rocm.docs.amd.com/projects/install-on-linux/en/latest/install/quick-start.html</a></p>

<h6 id="canadiantechpains">Canadian Tech Pains</h6>

<p>I've been a long-time fan of Radeon cards, despite their</p>]]></description><link>http://nosleep.ca/blender-on-ubuntu-using-amd-radeon/</link><guid isPermaLink="false">ae6001c2-7463-4f67-937a-5cc52fdb0a69</guid><dc:creator><![CDATA[Derek Cunningham]]></dc:creator><pubDate>Wed, 25 Oct 2023 03:36:56 GMT</pubDate><media:content url="http://nosleep.ca/content/images/2023/10/Screenshot-from-2023-10-25-01-41-31.jpg" medium="image"/><content:encoded><![CDATA[<img src="http://nosleep.ca/content/images/2023/10/Screenshot-from-2023-10-25-01-41-31.jpg" alt="Blender, on Ubuntu, using... AMD Radeon"><p><mark><strong><em>Update, April 2025</em></strong></mark></p>

<p>The below steps may no longer be needed, as the latest Ubuntu 24.04 LTS works well with AMD's instructions available here:</p>

<p><a href="https://rocm.docs.amd.com/projects/install-on-linux/en/latest/install/quick-start.html">https://rocm.docs.amd.com/projects/install-on-linux/en/latest/install/quick-start.html</a></p>

<h6 id="canadiantechpains">Canadian Tech Pains</h6>

<p>I've been a long-time fan of Radeon cards, despite their decreased performance over price-comparable NVIDIA counterparts... there's something about the Canadian in me that wants to support Canadian tech companies, or at least the technology hailed from the same.</p>

<p>I recently build a new PC, and one of my goals was to use all open-source software for it.</p>

<h6 id="opensource3dtech">Open Source 3D Tech</h6>

<p>90% of my stack makes that a breeze, but there was one key area holding me back: 3D editing. I've been wanting to dive in, and have spent a bit of time tinkering with Fusion 360 amongst others, but I wanted a solution that worked well in Linux.</p>

<h6 id="enterblender">Enter Blender</h6>

<p>I tried a number of tools, but Blender takes the cake.</p>

<p>At this moment, I've spent the past few weeks re-designing a PC case.</p>

<p>And here's the first <a href="https://www.printables.com/model/595320-blackbird-mkii-portable-mini-itx-pc-case">re-mixed one</a> I made. </p>

<p>Blender's speed is just getting worse for me. So I set out to figure out how to get <a href="https://www.amd.com/en/graphics/servers-solutions-rocm">ROCM</a>  running on my computer -- again. I recall the last time it seemed arduous, so I wasn't eager.</p>

<p>A few quick google searches later, I found this page, and my hesitancy seems unwarranted! Much to my relief.</p>

<p><a href="https://rocm.docs.amd.com/en/latest/deploy/linux/quick_start.html">ROCM Quick Start - Linux</a></p>

<p>Best of all, this may just set me up to do some AI/ML experimentation in the weeks ahead.</p>

<hr>

<h6 id="nittygrittydetailsformyfutureselfandforyoutoo">Nitty Gritty Details for my Future Self, and for you, too:</h6>

<p>I'm being a bit of a rebel and running an <em>interim</em> release of Ubuntu. This tends to make life difficult, but I'd like newer versions of the core software more often, so took the plunge.</p>

<p><strong>Ubuntu Version:</strong> 23.04 - Lunar Lobster</p>

<p>Best of all, despite the not-officially supported version, I got it to work!</p>

<p>Here's some more Ubuntu details by way of a screenshot:</p>

<p><img src="http://nosleep.ca/content/images/2023/10/Screenshot-from-2023-10-25-01-18-28.png" alt="Blender, on Ubuntu, using... AMD Radeon"></p>

<h6 id="howdididoit">How Did I Do It?</h6>

<p>It was relatively painless, and so hopefully, future self and/or non-self reader, it will be for you, too.</p>

<p>First off, the above noted <a href="https://rocm.docs.amd.com/en/latest/deploy/linux/quick_start.html">quick start guide</a> is -- actually -- a great place to start.</p>

<p>1 - Download Signing Key  </p>

<pre><code>$ sudo mkdir --parents --mwget https://repo.radeon.com/rocm/rocm.gpg.key -O - | \
    gpg --dearmor | sudo tee /etc/apt/keyrings/rocm.gpg &gt; /dev/nullode=0755 /etc/apt/keyrings
</code></pre>

<p>2 - Add the repositories  </p>

<pre><code>$ sudo tee /etc/apt/sources.list.d/amdgpu.list &lt;&lt;'EOF'
deb [arch=amd64 signed-by=/etc/apt/keyrings/rocm.gpg] https://repo.radeon.com/amdgpu/5.7.1/ubuntu jammy main  
EOF  
$ sudo tee /etc/apt/sources.list.d/rocm.list &lt;&lt;'EOF'
deb [arch=amd64 signed-by=/etc/apt/keyrings/rocm.gpg] https://repo.radeon.com/rocm/apt/debian jammy main  
EOF  
$ echo -e 'Package: *\nPin: release o=repo.radeon.com\nPin-Priority: 600' | sudo tee /etc/apt/preferences.d/rocm-pin-600
</code></pre>

<p>3 - Update and Install  </p>

<pre><code>$ sudo apt update
$ sudo apt install amdgpu-dkms
$ sudo apt install rocm-hip-libraries
</code></pre>

<p>4 - Reboot  </p>

<pre><code>$ sudo reboot
</code></pre>

<h6 id="diditwork">Did it Work?</h6>

<p>Not quite.</p>

<p><em>Then why'd you write all that?</em></p>

<p>Well, I'm superstitious. I did those steps, and then I did the next, so wanted to document it all.</p>

<p><strong>Onwards!</strong></p>

<h6 id="thenextnextsteps">The Next, Next Steps</h6>

<p>Over on this <a href="https://gpuopen.com">gpuopen</a> page, I was able to find some non-Linux operating system specific instructions.</p>

<p><a href="https://gpuopen.com/learn/amd-lab-notes/amd-lab-notes-rocm-installation-readme/">https://gpuopen.com/learn/amd-lab-notes/amd-lab-notes-rocm-installation-readme/</a></p>

<p>These commands seemed to get me past the post:</p>

<pre><code>$ export ROCM_REPO_BASEURL="https://repo.radeon.com/rocm/apt/5.4/"
$ export ROCM_REPO_COMP="ubuntu"
$ export ROCM_REPO_BUILD="main"
$ echo "deb [arch=amd64 trusted=yes] ${ROCM_REPO_BASEURL} ${ROCM_REPO_COMP} ${ROCM_REPO_BUILD}" &gt; /etc/apt/sources.list.d/rocm.list
$ sudo apt-get update
DEBIAN_FRONTEND=noninteractive sudo apt-get install -y \  
 libdrm-amdgpu* \
 initramfs-tools \
 libtinfo* \
 initramfs-tools \
 rocm-llvm \
 rocm-hip-runtime \
 rocm-hip-sdk \
 roctracer-dev
</code></pre>

<p>After which, I was able to run:</p>

<pre><code>$ sudo /opt/rocm/bin/rocminfo
</code></pre>

<h6 id="wherestheproof">Where's the Proof</h6>

<p>In this screenshot, you can see that Blender is now happily using HIP to render (and in fact, the fans on the GPU are now quieter... so it must not be working as hard).</p>

<p><img src="http://nosleep.ca/content/images/2023/10/Screenshot-from-2023-10-25-01-37-05.png" alt="Blender, on Ubuntu, using... AMD Radeon"></p>

<p>Good luck GPU-naut! :D</p>]]></content:encoded></item><item><title><![CDATA[Blynk vs. MIT's App Inventor... the sky's the limit!]]></title><description><![CDATA[<p>So, I've been playing with a lot of IOT stuff of late, and discovered the Blynk app, as well as MIT's App Inventor. Having been able to quickly ramp up both of them and get working prototypes together, I searched for other easy-to-use app development environments, and came across this</p>]]></description><link>http://nosleep.ca/blynk-vs-mits-app-inventor-the-skys-the-limit/</link><guid isPermaLink="false">debb6571-44be-418b-b239-fd862815fcb4</guid><dc:creator><![CDATA[Derek Cunningham]]></dc:creator><pubDate>Wed, 05 Feb 2020 03:18:08 GMT</pubDate><content:encoded><![CDATA[<p>So, I've been playing with a lot of IOT stuff of late, and discovered the Blynk app, as well as MIT's App Inventor. Having been able to quickly ramp up both of them and get working prototypes together, I searched for other easy-to-use app development environments, and came across this thread:</p>

<p><a href="https://forum.arduino.cc/index.php?topic=464327.0">https://forum.arduino.cc/index.php?topic=464327.0</a></p>

<p>The below is the reply I've posted to the thread, duplicated here primarily for my own benefit.</p>

<p>They both have their strengths.</p>

<p>First things first, costs: both are FREE. In every sense of the word. Blynk has a pay model in place, and it seems very reasonable. But, if you install the Blynk server, then connect your app to that, you get a very large number of "credits", and if you login to the web-based admin interface for the server, you'll find the credits are entirely editable for you. In that way, with a modicum of extra effort, you can use Blynk completely without cost. I used the docker container and it was up and running in a few minutes.</p>

<p>Also, the Blynk server and device code is entirely open source, more on that later.</p>

<p>Blynk development:</p>

<p>Blynk is entirely focused on IOT, or device-based (Arduino, Raspberry PI, ESP, etc.) development. What this means is that the app can add buttons, graphs, gauges, text boxes, etc., however there is no ability to edit the programming logic within the app, you have to write the programming logic/code and put the code in place on your destination device.</p>

<p>This is great in the sense that if you're used to, or focused on, IOT development, then you get to add a nice app-interface on top of your IOT project very quickly.</p>

<p>Where this may fall short, is generalized app development. You won't be using Blynk to make a catalogue of your plants, or a photo gallery, but you can use Blynk to monitor the moisture level of the sensor you have installed in your plant.</p>

<p>MIT App Inventor development:</p>

<p>No cost, entirely free mobile app development, with a high level of confidence given that it's been around for a long time and being backed by MIT, the author's of the MIT open-source license.</p>

<p>With App Inventor, rather than an IOT-focused app development environment, you get a general purpose app development environment. It's based on Google's blockly programming language, so all programming is done by dragging various blocks (they look like puzzle pieces) around.</p>

<p>AppInv has built-in support for database storage, and a straight forward layout system. It may lack a little bit in the asthetics, but blockly coding is a lot of fun.</p>

<p>There are extensions out there, I think I've seen a demo that allows voice-based programming, and I imagine the sky's the real limit there.</p>

<p>There's a variety of ideas I've had, and it's been like "sheesh, writing all that code will take forever...", but AppInv is opening those doors and should allow me to bang out a few of these ideas quickly (my first app, a road game we play as a family, took me 30 minutes or so).</p>

<p>And then, the convergence. AppInv has the ability to post to web-based API endpoints, and Blynk's open source server provides web-based API endpoints. Thus, with a still small level of effort, you could get the amazing versatility of AppInv coupled with the ease of Blynk's app-based IOT communication ability.</p>

<p>Whew! The sky's the limit!</p>]]></content:encoded></item><item><title><![CDATA[VueJS - Real life stories from the trenches of the web]]></title><description><![CDATA[<p>If you're in the Oshawa, Ontario, Canada area, I'm giving a talk on <a href="https://vuejs.org/">VueJS</a> on July 20th at the <a href="https://www.meetup.com/Oshawa-Code-Club/">Oshawa Code Club</a>. Pizza and pop included (I think). I promise to cover the full stack, too, so it's not just isolated to front-end development.</p>

<p>It may even be mildly interesting,</p>]]></description><link>http://nosleep.ca/vuejs-real-life-stories-from-the-trenches-of-the-web/</link><guid isPermaLink="false">0fab12ad-c849-4fe5-8fde-3105dba7ed90</guid><category><![CDATA[code]]></category><dc:creator><![CDATA[Derek Cunningham]]></dc:creator><pubDate>Mon, 27 Jun 2016 04:53:00 GMT</pubDate><media:content url="https://pbs.twimg.com/media/DC2Dg4oXkAANmEq.png" medium="image"/><content:encoded><![CDATA[<img src="https://pbs.twimg.com/media/DC2Dg4oXkAANmEq.png" alt="VueJS - Real life stories from the trenches of the web"><p>If you're in the Oshawa, Ontario, Canada area, I'm giving a talk on <a href="https://vuejs.org/">VueJS</a> on July 20th at the <a href="https://www.meetup.com/Oshawa-Code-Club/">Oshawa Code Club</a>. Pizza and pop included (I think). I promise to cover the full stack, too, so it's not just isolated to front-end development.</p>

<p>It may even be mildly interesting, but I can't make any promises to that effect. :)</p>

<p><a href="http://www.meetup.com/Oshawa-Code-Club/events/232122245/">http://www.meetup.com/Oshawa-Code-Club/events/232122245/</a></p>

<p>Originally posted on LinkedIn: <a href="https://www.linkedin.com/pulse/vuejs-real-life-stories-from-trenches-web-derek-cunningham">https://www.linkedin.com/pulse/vuejs-real-life-stories-from-trenches-web-derek-cunningham</a></p>

<p>Update: the code demoed at that talk is available here: <a href="https://github.com/cunninghamd/vuejs-expressjs-registration">https://github.com/cunninghamd/vuejs-expressjs-registration</a></p>]]></content:encoded></item><item><title><![CDATA[Git + Dropbox, The Easy Way]]></title><description><![CDATA[<p>There seems to be a lot of differing opinions out there on how best to handle git + dropbox.</p>

<p>My solution, is to keep it simple. Store git bundles in dropbox.</p>

<p>Further, I’ve added a hook for post-commit to dump the bundle right into dropbox. This way, I a) force</p>]]></description><link>http://nosleep.ca/git-dropbox-the-easy-way/</link><guid isPermaLink="false">2e0b5c4b-7283-4c3f-980d-3d2e8262dc9e</guid><category><![CDATA[code]]></category><dc:creator><![CDATA[Derek Cunningham]]></dc:creator><pubDate>Sat, 28 Sep 2013 04:31:00 GMT</pubDate><media:content url="https://static.pexels.com/photos/247791/pexels-photo-247791.png" medium="image"/><content:encoded><![CDATA[<img src="https://static.pexels.com/photos/247791/pexels-photo-247791.png" alt="Git + Dropbox, The Easy Way"><p>There seems to be a lot of differing opinions out there on how best to handle git + dropbox.</p>

<p>My solution, is to keep it simple. Store git bundles in dropbox.</p>

<p>Further, I’ve added a hook for post-commit to dump the bundle right into dropbox. This way, I a) force myself to commit more because I can’t lazily rely on dropbox syncing all saved files and b) assure that my files–nay, the whole repository!–is backed up into the cloud.</p>

<p>My <code>.git/hooks/post-commit</code> file looks like this:</p>

<pre><code>#!/bin/sh
cd ~/Documents/Code/BeerProject  
git bundle create ~/Dropbox/GitBundles/BeerProject.git.bundle master  
</code></pre>

<p>And that’s what I call, The Easy Way.</p>]]></content:encoded></item><item><title><![CDATA[Marcus Aurelius’ Meditations, Book 8, #36]]></title><description><![CDATA[<p>Emphasis mine:</p>

<blockquote>
  <p>Do not disturb yourself by picturing your life as a whole; do not assemble in your mind the many and varied troubles which have come to you in the past and will come again in the future, but ask yourself with regard to every present difficulty: <strong>‘What is</strong></p></blockquote>]]></description><link>http://nosleep.ca/marcus-aurelius-meditations-book-8-36/</link><guid isPermaLink="false">add93962-ca83-4979-b4a4-7997e6e00d17</guid><category><![CDATA[meditation]]></category><dc:creator><![CDATA[Derek Cunningham]]></dc:creator><pubDate>Fri, 27 Sep 2013 04:25:00 GMT</pubDate><media:content url="https://static.pexels.com/photos/235948/pexels-photo-235948.jpeg" medium="image"/><content:encoded><![CDATA[<img src="https://static.pexels.com/photos/235948/pexels-photo-235948.jpeg" alt="Marcus Aurelius’ Meditations, Book 8, #36"><p>Emphasis mine:</p>

<blockquote>
  <p>Do not disturb yourself by picturing your life as a whole; do not assemble in your mind the many and varied troubles which have come to you in the past and will come again in the future, but ask yourself with regard to every present difficulty: <strong>‘What is there in this that is unbearable and beyond endurance?’ You would be ashamed to confess it!</strong> And then remind yourself that it is not the future or what has passed that afflicts you, but always the present, and the power of this is much diminished if you take it in isolation and call your mind to task if it thinks that it cannot stand up to it when taken on its own.</p>
</blockquote>]]></content:encoded></item><item><title><![CDATA[Hacking the Cloud, with dropbox alternative Copy]]></title><description><![CDATA[<p>I’ve recently gotten inspired to start actively taking photos again, mostly due to a friend of mine getting heavily into photography. As such, I felt it was time to finally solve my backup issues, namely that I didn’t have any. In fact, I’ve “lost” our family photos</p>]]></description><link>http://nosleep.ca/hacking-the-cloud-with-dropbox-alternative-copy/</link><guid isPermaLink="false">3c5ab895-f17d-4979-bdf8-32336b9a6ba3</guid><category><![CDATA[code]]></category><category><![CDATA[economics]]></category><dc:creator><![CDATA[Derek Cunningham]]></dc:creator><pubDate>Fri, 27 Sep 2013 04:17:00 GMT</pubDate><media:content url="https://static.pexels.com/photos/136320/pexels-photo-136320.jpeg" medium="image"/><content:encoded><![CDATA[<img src="https://static.pexels.com/photos/136320/pexels-photo-136320.jpeg" alt="Hacking the Cloud, with dropbox alternative Copy"><p>I’ve recently gotten inspired to start actively taking photos again, mostly due to a friend of mine getting heavily into photography. As such, I felt it was time to finally solve my backup issues, namely that I didn’t have any. In fact, I’ve “lost” our family photos at least twice, and was able to recover them using hard drive recovery tools–but that is far from a disaster recovery plan!</p>

<p>First things first, I decided to commit myself to Aperture. I’ve dabbled in it once or twice since getting my macbook, but never really committed to it.</p>

<p>Having acquired Aperture, I needed a backup solution. “The Cloud” was the obvious answer (for me), but I’ve had little success with Google Drive in the past (the Mac app kept crashing on me), and found Dropbox’s prices to be more than I’d like to pay. Onwards to Google (searching)!</p>

<p>I found <a href="http://www.pcworld.com/article/2046783/four-excellent-dropbox-alternatives-for-your-small-business-storage-needs.html">this</a>.</p>

<p>Reading through the article, I was familiar with three of the four alternatives. <a href="https://copy.com/?r=m0lSoz">Copy</a> was new to me, so I investigated it further. The initial 15+5GB was a good place to start for me, so I signed up.</p>

<p>Having selected a new provider, I started to wonder if I could extend the referral plan using lifehacker’s tops for dropbox. So I looked around for Google Adwords credit. Not finding any, I went back to the drawing board.</p>

<p>Reading Hacker News, I wondered if <a href="https://copy.com/?r=m0lSoz">Copy</a> had been mentioned there. So I googled it, and I could find a recent reference. Thus, I posted this:</p>

<p><a href="https://news.ycombinator.com/item?id=6444541">Copy – a dropbox alternative that starts at 15GB + unlimited 5gb referrals</a> (that was the original title, or something like it, but the moderators edited down to just "Copy". I assume due to their terms of service, even though many articles violate that).</p>

<p>Within hours I started getting 5GB referrals, and it lasted into the next day. I now sit a comfortable 290GB (I’m hoping for those last 2 signups to get to 300GB) and my cloud needs will be met with Copy for the foreseeable future.</p>

<p>In fact, I’ve already uploaded 13GB of my 40GB Aperture library, and it hasn’t crashed yet, which is a great sign compared to Google Drive!</p>

<p><strong>Update as of June, 2017</strong> (actually, a lot more like sometime back in 2016 or earlier):</p>

<p>Aperture is toast, I now use Apple's new photos app exclusively.</p>

<p>Copy.com has closed down. I can't help but wonder if it was due to nerds <em>like me</em>. :)</p>]]></content:encoded></item><item><title><![CDATA[In [2013], the Matrix [Still] Has [Me]]]></title><description><![CDATA[<p style="text-align: center">  
  <b>In 1999, the Matrix Has You</b><br>
  Tagline from the original <a href="http://trailers.apple.com/trailers/wb/thematrix/trailer/">movie trailer</a> hosted on apple.com.
</p>

<p>I find it very depressing that my children will never fully appreciate the Matrix for the amazing futuristic movie that it <del>was</del> is.</p>

<p>Even by re-watching the trailer, it still seems set in the</p>]]></description><link>http://nosleep.ca/in-2013-the-matrix-still-has-me/</link><guid isPermaLink="false">3b1fdda0-17f9-44a2-81d9-bd87bfbf2b9f</guid><category><![CDATA[movies]]></category><dc:creator><![CDATA[Derek Cunningham]]></dc:creator><pubDate>Fri, 10 May 2013 04:04:00 GMT</pubDate><media:content url="http://orig05.deviantart.net/b513/f/2013/254/3/f/matrix_background_by_ali1182-d6lwzf7.png" medium="image"/><content:encoded><![CDATA[<img src="http://orig05.deviantart.net/b513/f/2013/254/3/f/matrix_background_by_ali1182-d6lwzf7.png" alt="In [2013], the Matrix [Still] Has [Me]"><p style="text-align: center">  
  <b>In 1999, the Matrix Has You</b><br>
  Tagline from the original <a href="http://trailers.apple.com/trailers/wb/thematrix/trailer/">movie trailer</a> hosted on apple.com.
</p>

<p>I find it very depressing that my children will never fully appreciate the Matrix for the amazing futuristic movie that it <del>was</del> is.</p>

<p>Even by re-watching the trailer, it still seems set in the far off future, it seems like cinematic sci-fi that’s fresh and tantalizing, the way the music of the Doors, despite being from the 70s, still astoundingly has a <em>nouveau</em> vibe to it. The Matrix has me, but I’ll never be able to impress on the next generation why it’s so amazing.</p>

<p>The depth of the story–probably largely evading me to this day–evidenced by the singluarly focused book comparing <em>The Matrix</em> with <em>The Bible</em>, even drawing inferences from the use of swearing in the movie: when the curse words Jesus Christ are used, they’re only used in reference to Neo, the protagonist of the film(s). (I’m unable to find a link to the book, unfortunately, but I digress, I’m talking about material that’s 1.3 decades old).</p>

<p>About a year ago I was sitting in my office lunch room and around the table were a number of teenagers (we hire the children of our employees for summer employment to help them pay for college). I was curious, so I asked the table: “what’s the best movie you’ve seen?” The overarching response was: <em>Batman: The Dark Knight</em>. OK, fair enough, it’s a great movie, so I followed up the question more poignantly: “what do you think of <em>The Matrix</em>?” The response in that case was: it was a good movie… for it’s time. <em>For it’s time?!</em> <em>The Matrix</em> is beyond the realm of time! (Well, except maybe for the gaudy Nokia phone–which I always wanted to own).</p>

<p>While I have difficulty with this, I have witnessed it from the other side. My father-in-law, with as much excitement as I’m sure I’ll convey to my children when they’re of-age to see <em>The Matrix</em>, sat me down to show me <em>The Big Chill</em>. It didn’t do anything for me then (I was in my early 20s at the time), although I might appreciate it more now. It was clear that my blasé response to the film was disappointing to him, much as I’m sure I’ll be disappointed when I finally show the then-nearly-three-decades-old <em>Matrix</em> to my daughters.</p>

<p>In the words of the title of the poem, I guess its: <em>The Way of All Flesh</em>.</p>

<p>How disappointing.</p>]]></content:encoded></item><item><title><![CDATA[PHP vs. Python for RESTful Web API]]></title><description><![CDATA[<p>… or maybe that should be the Slim Framework vs. ?? (something in python) for RESTful Web API.</p>

<p>My major concern regarding the backend framework selection is how cool parameterized queries work. PHP looks pretty straight forward, and using MySQLi seems to be the best practice, but there’s just something that</p>]]></description><link>http://nosleep.ca/php-vs-python-for-restful-web-api/</link><guid isPermaLink="false">75a7455f-66b4-4ada-a53d-486ab82d8770</guid><category><![CDATA[code]]></category><dc:creator><![CDATA[Derek Cunningham]]></dc:creator><pubDate>Thu, 25 Apr 2013 01:37:00 GMT</pubDate><media:content url="https://static.pexels.com/photos/53140/snake-ball-python-python-regius-beauty-53140.jpeg" medium="image"/><content:encoded><![CDATA[<img src="https://static.pexels.com/photos/53140/snake-ball-python-python-regius-beauty-53140.jpeg" alt="PHP vs. Python for RESTful Web API"><p>… or maybe that should be the Slim Framework vs. ?? (something in python) for RESTful Web API.</p>

<p>My major concern regarding the backend framework selection is how cool parameterized queries work. PHP looks pretty straight forward, and using MySQLi seems to be the best practice, but there’s just something that seems dated with them.</p>

<p>For Python, however, I was able to find <a href="http://stackoverflow.com/questions/775296/python-mysql-with-variables">this code</a>:</p>

<pre><code>some_dictionary_with_the_data = {  
    'name': 'awesome song',
    'artist': 'some band',
    etc...
}

cursor.execute ("""  
    INSERT INTO Songs (SongName, SongArtist, SongAlbum, SongGenre,
        SongLength, SongLocation)
    VALUES
    (%(name)s, %(artist)s, %(album)s, %(genre)s, %(length)s,
        %(location)s)
    """, some_dictionary_with_the_data)
</code></pre>

<p>Neat! Build a small array of variables, and pass that array to the string, nice!</p>

<p>In looking at RESTful Web APIs for python, I’ve momentarily given up. For now I’m going to get going on PHP with the Slim Framework, and if I need to change later, it shouldn’t be too painful.</p>]]></content:encoded></item><item><title><![CDATA[Revenge of the Cascadian IPA]]></title><description><![CDATA[<p>Tonight was bottling night–or more succinctly, adventures in bottling night.</p>

<p>First, I don’t like the hop bits that get left over from dry hopping, so I was looking for a way to filter them. My Tazo Awake tea comes in cotton tea bags, so I cut one open,</p>]]></description><link>http://nosleep.ca/revenge-of-the-cascadian-ipa/</link><guid isPermaLink="false">5f655193-9f12-48a0-aa3d-b3f43c023439</guid><category><![CDATA[beer]]></category><dc:creator><![CDATA[Derek Cunningham]]></dc:creator><pubDate>Wed, 24 Apr 2013 01:34:00 GMT</pubDate><media:content url="http://nosleep.ca/content/images/2017/06/pexels-photo-149613.jpeg" medium="image"/><content:encoded><![CDATA[<img src="http://nosleep.ca/content/images/2017/06/pexels-photo-149613.jpeg" alt="Revenge of the Cascadian IPA"><p>Tonight was bottling night–or more succinctly, adventures in bottling night.</p>

<p>First, I don’t like the hop bits that get left over from dry hopping, so I was looking for a way to filter them. My Tazo Awake tea comes in cotton tea bags, so I cut one open, soaked it and an elastic in sanitizer and stuck it on the end of my auto siphon. It started OK, but seemed to introduce a lot of air, and ended up getting clogged, plus, the air bubbles make me worry of oxidation. So I pulled it out, took off the tea bag and elastic and resumed siphoning.</p>

<p>Immediately after, I notice my bottling bucket is leaking! What the homebrew!</p>

<p>I quickly rinse my hands and forearms down in sanitizer and plunge into the fresh beer to tighten up the spigot. It’s a stop gap, but at least the leak has slowed to a drip.</p>

<p>After that, things went according to plan and experience. I enjoy filling bottles and capping them, so that was fun.</p>

<p>The beer smells amazing, and I’m eager for it to carbonate. It might even be ready for next week’s London Homebrewers Guild meeting.</p>]]></content:encoded></item><item><title><![CDATA[Learning Angular]]></title><description><![CDATA[<p>I’ve been looking to build a new website, which pending a name I’ll just call the Beer Project. In considering how to build it, I wanted something really simple, preferably something I’ve had a bit of experience with.</p>

<p>The first option was web2py. I really like the</p>]]></description><link>http://nosleep.ca/learning-angular/</link><guid isPermaLink="false">1b4567de-300f-4574-a4e9-fd2da7290ac1</guid><category><![CDATA[code]]></category><dc:creator><![CDATA[Derek Cunningham]]></dc:creator><pubDate>Tue, 23 Apr 2013 01:13:00 GMT</pubDate><media:content url="http://nosleep.ca/content/images/2017/06/wine-winery-burgundy-rioja-48848.jpeg" medium="image"/><content:encoded><![CDATA[<img src="http://nosleep.ca/content/images/2017/06/wine-winery-burgundy-rioja-48848.jpeg" alt="Learning Angular"><p>I’ve been looking to build a new website, which pending a name I’ll just call the Beer Project. In considering how to build it, I wanted something really simple, preferably something I’ve had a bit of experience with.</p>

<p>The first option was web2py. I really like the ideology of the platform, and spent a couple weekends trying to get it running on my webhosting provider. Having failed at that, I setup a nice system with port forwarding, etc., that I could code with at home, figuring if it ever went live I could just host with Amazon’s AWS or Google’s App Engine. When I sat down to start digging into some web2py code, I kept running into the “where to begin” mental roadblock.</p>

<p>After considering it further, the annoyance of web2py not running on my webhosting provider became too much, so I decided to flip over to CakePHP. I quickly setup CakePHP on my provider, added the debugging modules, etc. that it recommends, and felt I was off to a good start, so I focused on database design for awhile.</p>

<p>Then, I did something stupid. I was reading Hacker News one day, and decided it was time to figure out what all the fuss was regarding Backbone, Ember, CanJS and Angular.</p>

<p>WOW. Client-side MVC! I’ve been a huge fan of jquery for the past three years, and this concept sounded better. After reading about them, I tried to determine which was popular, and which looked like it’d be something I could invest in. CanJS seemed the most promising at the start, but the example code didn’t seem for me. Backbone and Ember sounded too low-level for me, which left me with Angular. Apparently it’s done by Google (actually, founded by a Google employee and another guy, now continually maintained by the same Google employee and a couple other googlers).</p>

<p>So I start reading over the docs, and I just end up feeling stupid. Over a decade of code experience, and I just can’t get my head wrapped around it. Enter today. I see this article:</p>

<p><a href="http://floatleft.com/notebook/diving-into-angularjs">Diving into AngularJS</a></p>

<p>His second paragraph struck a real nerve with me:</p>

<blockquote>
  <p>Initially I downloaded the Angular source and launched into trying to build something simple with it but I found this a really frustrating experience. I consider myself a pretty competent JS developer but nothing really worked and the concepts didn’t click. Making me feel stupid is a quick way to turn me off of something.</p>
</blockquote>

<p>After watching the same tutorial he watched, coupled with the <a href="https://github.com/ccoenraets/angular-cellar">Wine Cellar</a> angular app–which uses the <a href="http://www.slimframework.com/">Slim Framework</a> to provide REST web services, I’m now pretty damn excited to kickstart the Beer Project.</p>]]></content:encoded></item></channel></rss>