<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Calvin Webster]]></title><description><![CDATA[My space for space]]></description><link>http://calweb.github.io/</link><generator>Ghost</generator><lastBuildDate>Thu, 17 Dec 2015 00:43:30 GMT</lastBuildDate><atom:link href="http://calweb.github.io/rss/index.xml" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Hello Javascripters!!]]></title><description><![CDATA[<h2 id="hello-world-">hello world!</h2>
<p><img src="http://www.placecage.com/c/500/500" alt=""></p>
]]></description><link>/2015/12/16/hello-javascripters.html</link><guid isPermaLink="true">/2015/12/16/hello-javascripters.html</guid><category><![CDATA[meta]]></category><category><![CDATA[js]]></category><dc:creator><![CDATA[Calvin Webster]]></dc:creator><pubDate>Wed, 16 Dec 2015 16:07:36 GMT</pubDate></item><item><title><![CDATA[Blog about blog]]></title><description><![CDATA[<h2 id="my-personal-brand-of-ease-blogging-without-maintenance">My personal brand of ease, blogging without maintenance</h2>
<p>I&#39;ve been blogging on and off now for the past 16 years in some form or capacity[<a href="#1">1</a>].  It has afforded me personal and professional opportunities and allowed a good platform to just vent or get my voice out there in cyberspace.  I&#39;ve never been consistent, but it&#39;s almost like things just build up and I have to write it out.</p>
<p>This past year has been the most difficult in my life, but I&#39;m still here, thriving and enjoying all of the blessings that have come my way.  I have a lot to say, and to talk about my past year is big on that list, but I&#39;ll save that for a later post.</p>
<p>I thought I&#39;d write a quick post to talk about this blog and why I chose the technologies involved and why I think I&#39;ll keep up with writing more.</p>
<p>For the better part of the last 16 years I&#39;ve self hosted my blog either on Livejournal, Xanga, Wordpress or Jekyll/Octopress.  Through blogging I found linux, I found html, css, and finally javascript.  It was my drive to self host and have ultimate control of my blog that led me to learn and tinker.  So blogging, for me, has been not only an exercise in saying what&#39;s on my mind and releasing those thoughts, ideas, and inspirations, but also a playground for me to learn[<a href="#2">2</a>].</p>
<p>Fast-forward to now.  My patience/time is very limited and maintenance of a website is something that will fall by the wayside if it&#39;s left to my own will.  I used to own <a href="http://calvin.io">calvin.io</a>, but I didn&#39;t renew and a domain squatter now owns that domain.  No biggie, I say, but it definitely shows my lack of keeping up with simple things like that (renewing a domain name).</p>
<p>I really liked using <a href="http://octopress.org/">Octopress</a> which is a static site generator based on <a href="https://jekyllrb.com/">Jekyll</a>, but after a while, my ruby environment kept breaking...and, of course, one thing that really is laborious, is keeping up with that sort of thing if I rarely write ruby apps these days.</p>
<p>Enter <a href="https://ghost.org">Ghost</a>.
<img src="/assets/images/Ghost-Logo-Dark.svg" alt=""></p>
<p>This awesome node-based blogging/content management platform is something I can definitely play with, but I don&#39;t want to maintain a deployment and use a server, and if I can help it, I&#39;d love to just host my blog on github pages; I really did like the static file generation of Jekyll, but hated to change out themes or have to update my ruby environment...even with rvm, it felt like that&#39;s all I was doing, especially if I wanted to add a feature.</p>
<p>So it was after checking out <a href="https://staticsitegenerators.net/">this awesome list of static site generators</a> that I found this relatively young project called <a href="https://github.com/mixu/ghost-render">ghost-render</a>.  Because it shared the name of the Ghost platform, I wanted to see what it generated.</p>
<p>Turns out its pretty freaking awesome!</p>
<p>All you need to basically do is</p>
<ol>
<li>globally install ghost-render via npm<pre class="hljs"><code>npm <span class="hljs-operator"><span class="hljs-keyword">install</span> -<span class="hljs-keyword">g</span> ghost-render</span></code></pre></li>
<li>make your blog folder/repo<pre class="hljs"><code>mkdir myB<span class="hljs-built_in">log</span>
<span class="hljs-built_in">cd</span> myB<span class="hljs-built_in">log</span></code></pre></li>
<li>clone a desireable, already made ghost site theme - mine:<pre class="hljs"><code>git <span class="hljs-keyword">clone</span> <span class="hljs-title">git</span>@github.com:daleanthony/uno.git</code></pre></li>
<li>Then, in the root of your blog folder, make a <code>settings.json</code> file, here&#39;s mine:<pre class="hljs"><code>{
&quot;<span class="hljs-attribute">blog</span>&quot;: <span class="hljs-value">{
 &quot;<span class="hljs-attribute">url</span>&quot;: <span class="hljs-value"><span class="hljs-string">&quot;<a href="http://calweb.github.io">http://calweb.github.io</a>&quot;</span></span>,
 &quot;<span class="hljs-attribute">title</span>&quot;: <span class="hljs-value"><span class="hljs-string">&quot;Calvin Webster&quot;</span></span>,
 &quot;<span class="hljs-attribute">description</span>&quot;: <span class="hljs-value"><span class="hljs-string">&quot;My space for space&quot;</span></span>,
 &quot;<span class="hljs-attribute">logo</span>&quot;: <span class="hljs-value"><span class="hljs-string">&quot;<a href="https://avatars.githubusercontent.com/u/115030?v=3">https://avatars.githubusercontent.com/u/115030?v=3</a>&quot;</span></span>,
 &quot;<span class="hljs-attribute">cover</span>&quot;: <span class="hljs-value"><span class="hljs-string">&quot;assets/images/coverArt.jpg&quot;</span></span>,
 &quot;<span class="hljs-attribute">social</span>&quot;: <span class="hljs-value">{
   &quot;<span class="hljs-attribute">twitter</span>&quot;: <span class="hljs-value"><span class="hljs-string">&quot;calweb&quot;</span></span>,
   &quot;<span class="hljs-attribute">github</span>&quot;: <span class="hljs-value"><span class="hljs-string">&quot;calweb&quot;</span></span>,
   &quot;<span class="hljs-attribute">linked</span>&quot;: <span class="hljs-value"><span class="hljs-string">&quot;calweb&quot;</span></span>,
   &quot;<span class="hljs-attribute">instagram</span>&quot;: <span class="hljs-value"><span class="hljs-string">&quot;calweb&quot;</span>
 </span>}</span>,
 &quot;<span class="hljs-attribute">google_analytics</span>&quot;: <span class="hljs-value"><span class="hljs-string">&quot;UA-8904260-8&quot;</span></span>,
 &quot;<span class="hljs-attribute">disqus_shortname</span>&quot;: <span class="hljs-value"><span class="hljs-string">&quot;calweb&quot;</span>
</span>}</span>,
&quot;<span class="hljs-attribute">authors</span>&quot;: <span class="hljs-value">{
 &quot;<span class="hljs-attribute">default</span>&quot;: <span class="hljs-value">{
   &quot;<span class="hljs-attribute">name</span>&quot;: <span class="hljs-value"><span class="hljs-string">&quot;Calvin Webster&quot;</span></span>,
   &quot;<span class="hljs-attribute">bio</span>&quot;: <span class="hljs-value"><span class="hljs-string">&quot;ordinary guy who is extraordinarily curious about our world. born in hawaii, military family, loves beach, nature, and people. Instructor @theironyard&quot;</span></span>,
   &quot;<span class="hljs-attribute">website</span>&quot;: <span class="hljs-value"><span class="hljs-string">&quot;<a href="http://calweb.github.io/author/calvin">http://calweb.github.io/author/calvin</a>&quot;</span></span>,
   &quot;<span class="hljs-attribute">image</span>&quot;: <span class="hljs-value"><span class="hljs-string">&quot;<a href="https://avatars.githubusercontent.com/u/115030?v=3">https://avatars.githubusercontent.com/u/115030?v=3</a>&quot;</span></span>,
   &quot;<span class="hljs-attribute">cover</span>&quot;: <span class="hljs-value"><span class="hljs-string">&quot;<a href="http://lorempixel.com/1100/425/animals/">http://lorempixel.com/1100/425/animals/</a>&quot;</span></span>,
   &quot;<span class="hljs-attribute">slug</span>&quot;: <span class="hljs-value"><span class="hljs-string">&quot;calvin&quot;</span>
 </span>}
</span>}
</span>}</code></pre></li>
<li>you&#39;ll need to create the folder of your blog content, in <a href="https://daringfireball.net/projects/markdown/">markdown</a>, with folders that signify the <code>{year}/{month}/{day}/myPost.md</code>.  I made a small bash script to automate this when I want to create a new post, here:</li>
</ol>
<script src="https://gist.github.com/calweb/01f2de9b04c55ae91cfa.js"></script>

<ol>
<li>Then, once you&#39;re happy with your post(s), simply build out the static site using ghost-render with some flags, like this:</li>
</ol>
<pre class="hljs"><code>ghost-render --<span class="hljs-tag">input</span> ./_site/ --settings ./settings<span class="hljs-class">.json</span> --theme ./uno --output ../calweb<span class="hljs-class">.github</span><span class="hljs-class">.io</span></code></pre><p>To help break down what ^^ is doing</p>
<ul>
<li><code>ghost-render</code> is the utility to build the static site</li>
<li><code>--input ./_site/</code> is the flag for where are the markdown files are located, which are in my <code>_site</code> directory</li>
<li><code>--settings ./settings.json</code> holds the main configuration for my Ghost-theme, like name, photos, social links</li>
<li><code>--theme ./uno</code> is the unaltered theme I cloned from github.  There are tons of ghost themes to choose from. (this is huge for me as I can just clone another theme and change the whole site)</li>
<li><code>--output ../calweb.github.io</code> and finally where all of the static html files will live, with the appropriate file structure.</li>
</ul>
<p>And there you have it, a blog is created and its merely a folder of static html/js/css files, but I have access to any existing ghost theme or I could make/modify my own.  I dont have to login, manage deployments, maintain any environments other than the one I use all the time.</p>
<p>So....I guess this post got a little longer than I thought.  But the basic reason I chose ghost-render is that its super simple to create posts, make files, push to github and done!  I can spend more time in an editor, writing markdown.  It&#39;s not perfect as I need to write scripts to help me do tasks like making new posts or building the site after some updates, but once I do that, it&#39;s pretty simple and I just have a static site i can publish.</p>
<p>Maybe this is a new beginning to more blogging!</p>
<hr>
<p><a name="1">[1]</a> : <a href="http://calweb.blogspot.com/">Sol Net</a> is the last remnant of my old digital footprint, but probably for the better ;)
<a name="2">[2]</a> : I am sitting here right now trying to add a markdown footnote, but can&#39;t so I&#39;m looking into changing the Markdown Parser that has that feature in <a href="https://github.com/mixu/ghost-render">ghost-render</a> called <a href="https://github.com/chjj/marked">marked</a> with <a href="https://github.com/markdown-it/markdown-it">markdown-it</a> so that I can...but alas, its trying to call string methods on arrays of the md tokens and I should probably finish this post, instead of hacking around.</p>
]]></description><link>/2015/12/15/blog-about-blog.html</link><guid isPermaLink="true">/2015/12/15/blog-about-blog.html</guid><category><![CDATA[meta]]></category><category><![CDATA[reflection]]></category><dc:creator><![CDATA[Calvin Webster]]></dc:creator><pubDate>Tue, 15 Dec 2015 16:07:36 GMT</pubDate></item><item><title><![CDATA[How to make a voice controlled drone]]></title><description><![CDATA[<h2 id="build-a-voice-controlled-rolling-spider-with-nodejs-socket-io-and-annyang-js">Build a voice controlled rolling-spider with nodejs, socket.io, and annyang.js</h2>
<p>Drones are becoming more popular these days, and it&#39;s getting easier to find one at a reasonable cost.</p>
<p>For $99, you can buy a <a href="http://www.amazon.com/Parrot-MiniDrone-Rolling-Spider-Red/dp/B00KZM53ZK">Parrot Rolling Spider</a> at Best Buy or Amazon.  </p>
<p>And what&#39;s awesome about that is that they&#39;re controlled with bluetooth technology. And what&#39;s even more awesome is people like <a href="https://github.com/voodootikigod/node-rolling-spider">Voodootikigod</a> did a bunch of ground work to translate the bluetooth signals from the mini-drone and made a node module that we can use to control our drone in javascript.</p>
<p>To get started, there are a few requirements to successfully use this demo:</p>
<ul>
<li><a href="http://nodejs.org">NodeJS</a></li>
<li>Bluetooth enabled computer</li>
<li><a href="http://www.amazon.com/Parrot-MiniDrone-Rolling-Spider-Red/dp/B00KZM53ZK">Parrot Rolling Spider</a></li>
</ul>
<p>The basic idea is we&#39;re going to use the <a href="http://www.sitepoint.com/introducing-web-speech-api/">Web Speech API</a> via annyangjs in the browser which will then emit a message through websockets, which finally will use the rolling-spider library to send bluetooth commands to our mini drone.</p>
<p>So, to get started, we just want to build a simple nodejs application that will serve up an html page. (i use express for convenience, but you could be more simple than that as well).</p>
<p><code>app.js</code> file:</p>
<pre class="hljs"><code><span class="hljs-keyword">var</span> express = require(<span class="hljs-string">&#39;express&#39;</span>);
<span class="hljs-keyword">var</span> app = express();
<span class="hljs-keyword">var</span> server = require(<span class="hljs-string">&#39;http&#39;</span>).Server(app);

app.<span class="hljs-keyword">set</span>(<span class="hljs-string">&#39;port&#39;</span>, process.env.PORT || <span class="hljs-number">3000</span>);
app.<span class="hljs-keyword">use</span>(express.<span class="hljs-keyword">static</span>(<span class="hljs-string">&#39;public&#39;</span>));
app.<span class="hljs-keyword">get</span>(<span class="hljs-string">&#39;/&#39;</span>, <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-params">(req, res)</span> </span>{
  res.sendFile(__dirname + <span class="hljs-string">&#39;/public/index.html&#39;</span>)
});


server.listen(app.<span class="hljs-keyword">get</span>(<span class="hljs-string">&#39;port&#39;</span>), <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-params">()</span> </span>{
  console.log(<span class="hljs-string">&#39;server listening on &#39;</span> + app.<span class="hljs-keyword">get</span>(<span class="hljs-string">&#39;port&#39;</span>));
});</code></pre><p>Basically all this <code>app.js</code> file is doing is serving index.html on port 3000, as of now, but in order for us to listen through web sockets, we need to set that up:</p>
<pre class="hljs"><code><span class="hljs-keyword">var</span> express = require(<span class="hljs-string">&#39;express&#39;</span>);
<span class="hljs-keyword">var</span> app = express();
<span class="hljs-keyword">var</span> server = require(<span class="hljs-string">&#39;http&#39;</span>).Server(app);
<span class="hljs-keyword">var</span> io = require(<span class="hljs-string">&#39;socket.io&#39;</span>)(server);

<span class="hljs-comment">// here we add our node-rolling-spider module as well and create an instance</span>
<span class="hljs-keyword">var</span> Drone = require(<span class="hljs-string">&#39;rolling-spider&#39;</span>);

<span class="hljs-keyword">var</span> spidey = <span class="hljs-keyword">new</span> Drone(process.env.UUID)

app.<span class="hljs-keyword">set</span>(<span class="hljs-string">&#39;port&#39;</span>, process.env.PORT || <span class="hljs-number">3000</span>);
app.<span class="hljs-keyword">use</span>(express.<span class="hljs-keyword">static</span>(<span class="hljs-string">&#39;public&#39;</span>));
app.<span class="hljs-keyword">get</span>(<span class="hljs-string">&#39;/&#39;</span>, <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-params">(req, res)</span> </span>{
  res.sendFile(__dirname + <span class="hljs-string">&#39;/public/index.html&#39;</span>)
});


server.listen(app.<span class="hljs-keyword">get</span>(<span class="hljs-string">&#39;port&#39;</span>), <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-params">()</span> </span>{
  console.log(<span class="hljs-string">&#39;server listening on &#39;</span> + app.<span class="hljs-keyword">get</span>(<span class="hljs-string">&#39;port&#39;</span>));
})

io.on(<span class="hljs-string">&#39;connection&#39;</span>, <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-params">(socket)</span> </span>{
  <span class="hljs-comment">// we&#39;ll be adding here shortly</span>

});</code></pre><p>Now that we have an instance of our drone, the rolling spider module has a very straightforward api.  So if you want to turn left, you simply do something like <code>drone.turnLeft({STEPS: 20})</code> or takeoff <code>drone.takeoff()</code></p>
<p>I&#39;ve abstracted away all of the commands to takeoff, turn, and flip into a separate file called <code>droneControl.js</code>.  </p>
<p>This is what our drone controlling code looks like:</p>
<pre class="hljs"><code><span class="hljs-built_in">module</span>.exports = (<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{
<span class="hljs-pi">  &#39;use strict&#39;</span>;
  <span class="hljs-keyword">var</span> ACTIVE = <span class="hljs-literal">true</span>;
  <span class="hljs-keyword">var</span> STEPS = <span class="hljs-number">5</span>;
  <span class="hljs-keyword">var</span> commands = {
    left: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">drone</span>) </span>{
      <span class="hljs-built_in">console</span>.log(<span class="hljs-string">&#39;going left&#39;</span>);
      drone.turnLeft({ steps: <span class="hljs-number">20</span> });
      <span class="hljs-keyword">this</span>.cooldown();
    },
    right: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">drone</span>) </span>{
      <span class="hljs-built_in">console</span>.log(<span class="hljs-string">&#39;going right&#39;</span>);
      drone.turnRight({ steps: <span class="hljs-number">20</span> });
      <span class="hljs-keyword">this</span>.cooldown();
    },
    up: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">drone</span>) </span>{
      <span class="hljs-built_in">console</span>.log(<span class="hljs-string">&#39;up up&#39;</span>);
      drone.up({ steps: STEPS <em> <span class="hljs-number">2.5</span> });
      <span class="hljs-keyword">this</span>.cooldown();

    },
    down: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">drone</span>) </span>{
      <span class="hljs-built_in">console</span>.log(<span class="hljs-string">&#39;down down&#39;</span>);
      drone.down({ steps: STEPS </em> <span class="hljs-number">2.5</span> });
      <span class="hljs-keyword">this</span>.cooldown();
    },
    forward: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">drone</span>) </span>{
      <span class="hljs-built_in">console</span>.log(<span class="hljs-string">&#39;going forward&#39;</span>);
      drone.forward({ steps: <span class="hljs-number">20</span> });
      <span class="hljs-keyword">this</span>.cooldown();
    },
    backward: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">drone</span>) </span>{
      <span class="hljs-built_in">console</span>.log(<span class="hljs-string">&#39;going backward&#39;</span>);
      drone.backward({ steps: <span class="hljs-number">20</span> });
      <span class="hljs-keyword">this</span>.cooldown();
    },
    flip: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">drone</span>) </span>{
      <span class="hljs-built_in">console</span>.log(<span class="hljs-string">&#39;flippin awesome!&#39;</span>);
      drone.frontFlip({ steps: STEPS });
      <span class="hljs-keyword">this</span>.cooldown();
    },
    launch: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">drone</span>) </span>{
      drone.connect(<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{
        drone.setup(<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{
          <span class="hljs-built_in">console</span>.log(<span class="hljs-string">&#39;Prepare for take off! &#39;</span>, drone.name);
          drone.flatTrim();
          drone.startPing();
          drone.flatTrim();

          drone.on(<span class="hljs-string">&#39;battery&#39;</span>, <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{
            <span class="hljs-built_in">console</span>.log(<span class="hljs-string">&#39;Battery: &#39;</span> + drone.status.battery + <span class="hljs-string">&#39;%&#39;</span>);
            drone.signalStrength(<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">err, val</span>) </span>{
              <span class="hljs-built_in">console</span>.log(<span class="hljs-string">&#39;Signal: &#39;</span> + val + <span class="hljs-string">&#39;dBm&#39;</span>);
            });

          });
          setTimeout(<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{
            drone.takeOff();
            ACTIVE = <span class="hljs-literal">true</span>;
          }, <span class="hljs-number">1000</span>);

        });
      });

    },
    land: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">drone</span>) </span>{
      <span class="hljs-built_in">console</span>.log(<span class="hljs-string">&#39;landing!!&#39;</span>);
      drone.land();
      setTimeout(<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{
      process.exit();
      }, <span class="hljs-number">3000</span>);
    },
    cooldown: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{
      ACTIVE = <span class="hljs-literal">false</span>;
      setTimeout(<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{
        ACTIVE = <span class="hljs-literal">true</span>;
      }, STEPS * <span class="hljs-number">12</span>);
    },
    shit: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">drone</span>) </span>{
      drone.emergency();
      setTimeout(<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{
        process.exit();
      }, <span class="hljs-number">3000</span>);
    }
  };
  <span class="hljs-keyword">return</span> <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">droneInstance, action</span>) </span>{
    <span class="hljs-keyword">return</span> commands[action](droneInstance)
  };

})();</code></pre><p>I did this to make it factor out the controlling code from the socket listeners, so you could use it directly in <code>app.js</code> like this:</p>
<pre class="hljs"><code>var droneControl = require<span class="hljs-list">(&#39;./droneControl&#39;)</span><span class="hljs-comment">;</span>

droneControl<span class="hljs-list">(<span class="hljs-keyword">spidey</span>, <span class="hljs-quoted">&#39;launch</span>&#39;)</span><span class="hljs-comment">;</span>
droneControl<span class="hljs-list">(<span class="hljs-keyword">spidey</span>, <span class="hljs-quoted">&#39;left</span>&#39;)</span><span class="hljs-comment">;</span></code></pre><p>Doing this allows us to write one (or two) socket listeners, so below is our final <code>app.js</code>:</p>
<pre class="hljs"><code><span class="hljs-keyword">var</span> express = <span class="hljs-built_in">require</span>(<span class="hljs-string">&#39;express&#39;</span>);
<span class="hljs-keyword">var</span> app = express();
<span class="hljs-keyword">var</span> server = <span class="hljs-built_in">require</span>(<span class="hljs-string">&#39;http&#39;</span>).Server(app);
<span class="hljs-keyword">var</span> io = <span class="hljs-built_in">require</span>(<span class="hljs-string">&#39;socket.io&#39;</span>)(server);
<span class="hljs-keyword">var</span> Drone = <span class="hljs-built_in">require</span>(<span class="hljs-string">&#39;rolling-spider&#39;</span>);
<span class="hljs-keyword">var</span> droneControl = <span class="hljs-built_in">require</span>(<span class="hljs-string">&#39;./droneControl&#39;</span>);

<span class="hljs-keyword">var</span> choppah = <span class="hljs-keyword">new</span> Drone(process.env.UUID);
app.set(<span class="hljs-string">&#39;port&#39;</span>, process.env.PORT || <span class="hljs-number">3000</span>);
app.use(express.static(<span class="hljs-string">&#39;public&#39;</span>));
app.get(<span class="hljs-string">&#39;/&#39;</span>, <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">req, res</span>) </span>{
  res.sendFile(__dirname + <span class="hljs-string">&#39;/public/index.html&#39;</span>)
});


server.listen(app.get(<span class="hljs-string">&#39;port&#39;</span>), <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{
  <span class="hljs-built_in">console</span>.log(<span class="hljs-string">&#39;server listening on &#39;</span> + app.get(<span class="hljs-string">&#39;port&#39;</span>));
})

io.on(<span class="hljs-string">&#39;connection&#39;</span>, <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">socket</span>) </span>{
  socket.on(<span class="hljs-string">&#39;choppah&#39;</span>, <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">data</span>) </span>{
    <span class="hljs-built_in">console</span>.log(<span class="hljs-string">&#39;choppha!&#39;</span>, data.action);
    droneControl(choppah, data.action);
  });
  socket.on(<span class="hljs-string">&#39;choppah:launch&#39;</span>, <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{
    droneControl(choppah, <span class="hljs-string">&#39;launch&#39;</span>)
  })
});</code></pre><p>Now that we have our nodejs side complete, we simply need to create an <code>index.html</code> and <code>main.js</code>.</p>
<p>For the voice control, we are using annyangjs which basically will wrap the Web Speech API native in chrome and gives us an easy way to write commands to listen for to trigger our socket emitters.</p>
<p>Here&#39;s the <code>index.html</code>:</p>
<pre class="hljs"><code><span class="hljs-doctype">&lt;!DOCTYPE html&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-title">html</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-title">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">meta</span> <span class="hljs-attribute">charset</span>=<span class="hljs-value">&quot;utf-8&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">title</span>&gt;</span>chopper!<span class="hljs-tag">&lt;/<span class="hljs-title">title</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-title">head</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-title">body</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">h1</span>&gt;</span>hello choppa!<span class="hljs-tag">&lt;/<span class="hljs-title">h1</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">script</span> <span class="hljs-attribute">src</span>=<span class="hljs-value">&quot;//cdnjs.cloudflare.com/ajax/libs/annyang/2.0.0/annyang.min.js&quot;</span>&gt;</span><span class="undefined">

    </span><span class="hljs-tag">&lt;/<span class="hljs-title">script</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">script</span> <span class="hljs-attribute">src</span>=<span class="hljs-value">&quot;<a href="https://cdn.jsdelivr.net/socket.io-client/1.3.2/socket.io.js">https://cdn.jsdelivr.net/socket.io-client/1.3.2/socket.io.js</a>&quot;</span>&gt;</span><span class="undefined">

    </span><span class="hljs-tag">&lt;/<span class="hljs-title">script</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-title">script</span> <span class="hljs-attribute">src</span>=<span class="hljs-value">&quot;main.js&quot;</span> <span class="hljs-attribute">charset</span>=<span class="hljs-value">&quot;utf-8&quot;</span>&gt;</span><span class="undefined"></span><span class="hljs-tag">&lt;/<span class="hljs-title">script</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-title">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-title">html</span>&gt;</span></code></pre><p>And finally, <code>main.js</code> which detects voice commands and emits them with socket.io:</p>
<pre class="hljs"><code><span class="hljs-keyword">var</span> socket = <span class="hljs-built_in">require</span>(<span class="hljs-string">&#39;socket.io-client&#39;</span>)(<span class="hljs-string">&#39;<a href="http://localhost:3000">http://localhost:3000</a>&#39;</span>);

<span class="hljs-keyword">var</span> commands = {
    <span class="hljs-string">&#39;get to the choppa&#39;</span>: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">data</span>) </span>{
      socket.emit(<span class="hljs-string">&#39;choppah:launch&#39;</span>, {msg: <span class="hljs-string">&quot;get to da choppa!&quot;</span>});
    },
    <span class="hljs-string">&#39;go *action&#39;</span>: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">action</span>) </span>{
      <span class="hljs-built_in">console</span>.log(<span class="hljs-string">&quot;action: &quot;</span>, action);
      socket.emit(<span class="hljs-string">&#39;choppah&#39;</span>, {action: action});
    }
  };

  annyang.addCommands(commands);
  annyang.start();</code></pre><p>Now, you just need to run your app and fire up your browser, then talk to it!</p>
<p>Start the app:
<code>node app.js</code></p>
<p>Open Browser (I&#39;m using Chrome)
<code>http://localhost:3000</code></p>
<p>Then say, &#39;get to da choppa&#39; to launch, and <code>go left</code>, <code>go up</code>, and any other directional commands.  To stop the app and land the mini drone, simply say - &#39;go land&#39;;</p>
<p><a href="https://github.com/calweb/choppah">Here&#39;s the demo code</a></p>
]]></description><link>/2015/11/27/get-to-da-choppah.html</link><guid isPermaLink="true">/2015/11/27/get-to-da-choppah.html</guid><category><![CDATA[drone]]></category><category><![CDATA[rolling-spider]]></category><category><![CDATA[javascript]]></category><category><![CDATA[tutorial]]></category><dc:creator><![CDATA[Calvin Webster]]></dc:creator><pubDate>Fri, 27 Nov 2015 15:05:04 GMT</pubDate></item><item><title><![CDATA[Random things that could be better]]></title><description><![CDATA[<p><img src="http://weknowmemes.com/wp-content/uploads/2011/05/rage-guy-original.png" alt=""></p>
<p>So I was thinking today&#8230;well, I like to think that I think everyday, but in this case&#8230;my thinking has had a backlog of sorts.  I feel like I need to write this out as a sort of therapy to release my pressure valve.</p>
<p>Life is great for me right now, but &#8230;</p>
<p>Certain things that either have been annoying me or could be better have been bubbling up, but these &#8216;things&#8217; have no particular distinction of being related, save for them being annoying or have the potential to be better&#8230;</p>
<h3 id="why-doesn-t-chick-fil-a-have-a-self-serve-soda-dispenser-like-everyone-else-">Why doesn&#39;t Chick-fil-a have a self-serve soda dispenser like everyone else?</h3>
<p>You could probably make a good business case for why not:</p>
<ul>
<li>More efficient spending on soda syrup because less people will make effort to get refill</li>
<li>More interaction with customers face-to-face</li>
<li>Less mess to clean up</li>
</ul>
<p>Things that annoy me about it:</p>
<ul>
<li>Giant ice cubes fill the cup, leaving about 2.5 gulps of drink</li>
<li>I like diet coke, but everyone always hears, &#8216;coke&#8217;</li>
<li>Having to wait a long time when I&#8217;m thirsty</li>
</ul>
<p>The long and short of it is basically that&#8230;.I&#8217;ve been conditioned with every other fast food place that I can self serve and create my own concoction (sometimes I put fruit punch with my diet coke&#8230;.or have sprite with rootbeer).  I value this.</p>
<p>I also get annoyed when I am going through the drive thru getting ready to go on a long trip, only to run out of my caffeinated soda 3 blocks away from leaving the place.</p>
<p>The problem I see:</p>
<p> When you have to go back to get a refill, it clogs up the process and the area in which others are waiting to be served&#8230;people bump each other, children going up for refills get overlooked, parents going up on behalf of more than a few are left waiting in the sidelines&#8230;it just seems to get messy, which is probably why I never feel relaxed when dining in Chick-fil-a&#8230;there just seems to be so much traffic.</p>
<h3 id="amazon-you-could-do-better-with-your-hd-purchases-in-instant-video-and-probably-in-theory-get-more-people-to-convert-from-standard">Amazon, you could do better with your HD purchases in Instant Video and probably, in theory, get more people to convert from Standard</h3>
<p> I probably spend way more money than I should at Amazon, especially with Instant Video, but I don&#8217;t feel like Im alone in this as they make it amazingly easy to purchase their products, but the thing about it is&#8230;.</p>
<p> I always balk at buying HD video as opposed to the standard offering that is right beside it, and when I say balk, I mean I usually never buy the HD&#8230;but sometimes&#8230;especially if I were to get a larger tv or brand new HD flatscreen, I would consider purchasing the HD version of something I already bought&#8230;..but I don&#8217;t want to have 2 copies of the same thing.  It &#8216;feels&#8217; like I would be wasting my money.</p>
<p> So if I were Amazon&#8230;and I am not, but if I were, and I wanted to sell more HD Instant video, I would probably consider providing something like an upgrade option if the customer already owns the Standard format version.  So if I owned Pawn Stars (yes I do), and I bought the standard for $1.99&#8230;.then it might make sense to allow the customer to &#8216;upgrade&#8217; to the HD format for only a dollar more, instead of paying the full $2.99.  Doesn&#8217;t that make a lot more sense?</p>
<p> It just seems like a big missed opportunity if you wanted to convert more people to HD instant video. #amiright</p>
<h3 id="i-really-wish-more-people-used-primary-sources">I really wish more people used primary sources</h3>
<p> Facebook is probably the impetus for this one, but seriously&#8230;.question the information and where it came from!</p>
<p> A lot of people like to call our social media a &#8216;fire-hose&#8217; or something to the effect of a large ocean or web or something, but the fact is: A METRIC ASS-TON OF INFORMATION IS BLASTED INTO YOUR EYEBALLS, EARS&#8230;all the time!</p>
<p> my favorite quote:</p>
 <blockquote>What information consumes is rather obvious: it consumes the attention of its recipients. Hence a wealth of information creates a poverty of attention, and a need to allocate that attention efficiently among the overabundance of information sources that might consume it. - Herbert Simon</blockquote>

<p> I suppose what I&#8217;m really getting at is not totally related to using primary sources, but evaluating the information you post.</p>
<p> To me, primary sources are the highest quality information you can get.  My opinions on my blog are a primary source, peer-reviewed scientific articles are usually primary sources, taking a picture at an event is a primary source.</p>
<p> Here&#8217;s a great example that I&#8217;ve seen in my feed a few times: <a href="http://www.theepochtimes.com/n3/513771-girl-killed-herself-live-on-cam-just-after-dad-husband-seen-her-while-doing-this-a-facebook-scam/">http://www.theepochtimes.com/n3/513771-girl-killed-herself-live-on-cam-just-after-dad-husband-seen-her-while-doing-this-a-facebook-scam/</a></p>
<h3 id="shared-facebook-accounts">Shared Facebook accounts</h3>
<p>I think the theme here is honesty, but moreso it&#8217;s goes back to primary sources.  I know some people do shared accounts as a gesture of oneness with their significant other, but I don&#8217;t really see the benefit.</p>
<p>I love my wife, and we are one couple, one unity under God, but we still are individuals, and when I speak, I may not be speaking for her and I want her to speak for herself.</p>
<p>It ultimately seems deceiving because I rarely know who is speaking from the account, and it&#8217;s just weird!</p>
<h3 id="whatevs-right">Whatevs, right</h3>
<p>Who cares, right?  Really though, there are so many day to day things that could be better, could be worse.  I just thought to highlight a few of them here.</p>
]]></description><link>/2014/02/14/random-things-that-could-be-better.html</link><guid isPermaLink="true">/2014/02/14/random-things-that-could-be-better.html</guid><category><![CDATA[random]]></category><category><![CDATA[improvement]]></category><dc:creator><![CDATA[Calvin Webster]]></dc:creator><pubDate>Fri, 14 Feb 2014 15:05:04 GMT</pubDate></item><item><title><![CDATA[Just Flour and Water]]></title><description><![CDATA[<div class="entry-content"><p><a href="http://www.flickr.com/photos/calweb/9411148263/" title="Homemade pasta by Calweb, on Flickr"><img src="http://farm3.staticflickr.com/2822/9411148263_2f75f2e275.jpg" width="500" height="500" alt="Homemade pasta"></a></p>

<p>It&#8217;s funny how almost a year goes by and no updates&#8230;so I thought to put something up here just to go through the motions of actually updating my blog&#8230;.</p>

<p>Have you ever made homemade glue when you were younger?  You know&#8230;the flour and water variety?</p>

<p>Those who know me, also know that I like cooking, but I tend to just &#8216;wing it&#8217;&#8230;and add things to a recipe as I taste, which is probably why I never was that great at baking or making candy.</p>

<!--more-->


<p>The thing is, I&#8217;ve had a recent revelation on something awesome I can cook all the time, and it&#8217;s really easy!!</p>

<p>It&#8217;s called pasta!  Just flour and water, or flour and eggs, or flour and eggs and tomato paste.</p>

<p>And to make it really easy, it&#8217;s a 2:1 ratio, or thereabouts!  I mean, you mix until it turns into a dough ball, then you beat it up until it&#8217;s all stretchy!</p>

<p>You can use plain flour or a blend of both semolina and regular, bleached flour in a 1:1 ratio.</p>

<p>Here&#8217;s my recipe that I stole of some site, or off of some packaging that works great!</p>

<h3>Calvin&#8217;s Copied Pasta Recipe:</h3>

<ul>
    <li>1 cup Red Mill Brand Semolina flour</li>
    <li>1 cup All Purpose flour</li>
    <li> 1 teaspoon salt</li>
    <li>1 cup (roughly) water</li>
    <li>1 tablespoon Olive Oil</li>
</ul>


<h3>Directions:</h3>

<ol>
    <li>Sift or mix flour(s) with salt until well mixed and fluffy</li>
    <li>Make pyramid on clean surface and then make volcano hold in middle (for wet ingredients)</li>
    <li>Pour water or lightly beaten eggs and olive oil into volcano crater in middle</li>
    <li>Carefully cave in and mix volcano walls into wet center, slowly using hands (TIP: better less liquid first, then add as needed)</li>
    <li>Once dough sticks together, but not to your fingers, start making into ball and kneading</li>
    <li>Knead for at least 15 minutes either by hand or mixer with dough hook until dough is smooth and elastic (TIP: this is important as it will be brittle if not kneaded enough)</li>
    <li>Let dough rest for at least 20 minutes</li>
    <li>Begin making pasta!</li>
</ol>


<p>Seeing as how my wife is Italian, I&#8217;m sure to impress my in-laws next time they come over for dinner! :)</p>

<p>I made this recipe with just water for cavatelli&#8217;s (sorry, no picture), but it was pretty time intensive as you need to pinch off tiny balls and thumb press and stretch, which takes a while, but they were Delicious!!!
The picture above shows the finished product with spaghetti noodles made with eggs and run through a pasta cutter.</p>

<p>Delish!  Who would&#8217;ve thought that pasta would be so easy to make!  I now have started making this at least once a week, well, for the past 2 weeks&#8230;.but I see this happening regularly.</p>
</div>
]]></description><link>/2013/08/01/just-flour-and-water.html</link><guid isPermaLink="true">/2013/08/01/just-flour-and-water.html</guid><category><![CDATA[food]]></category><category><![CDATA[recipe]]></category><category><![CDATA[pasta]]></category><dc:creator><![CDATA[Calvin Webster]]></dc:creator><pubDate>Thu, 01 Aug 2013 14:05:04 GMT</pubDate></item><item><title><![CDATA[Luca is almost 6 months!]]></title><description><![CDATA[<iframe width="640" height="360" src="http://www.youtube.com/embed/rFbdtrl2ACY" frameborder="0" allowfullscreen></iframe>

<p>I love a lot of things, a lot of people especially, but besides Anne Marie, I don&#8217;t know how I could love my little son more&#8230;I feel like I&#8217;m going to explode!</p>
]]></description><link>/2013/02/21/luca-is-almost-6-months.html</link><guid isPermaLink="true">/2013/02/21/luca-is-almost-6-months.html</guid><category><![CDATA[family]]></category><dc:creator><![CDATA[Calvin Webster]]></dc:creator><pubDate>Thu, 21 Feb 2013 15:05:04 GMT</pubDate></item><item><title><![CDATA[Power and Economic Development in the Charleston Tech Community]]></title><description><![CDATA[<p><img src="http://farm5.staticflickr.com/4128/5174995086_4067c16676_z.jpg" alt="BarCampCHS 2010 Topic Board by Patrick L Archibald, on Flickr"></p>
<p>I&#8217;ve been in a weird mood lately.  This past weekend I attended the local Linux Users group and chatted about free software. Yesterday I heard about Aaron Swartz commiting suicide and have mixed, albeit, sad feelings about that. And this morning, following a recent conference announcement from the Charleston Digital Corridor&#8217;s (CDC) Code Show, I saw a few comments that had me thinking about the state of our tech community and what it means to me.</p>
<!--more-->
<p>Chalk it up to being sentimental and super invested in the local tech community I&#8217;ve grown with here in Charleston for the past 5 years, but I got a little defensive about one of the announcement tweets,</p>
<blockquote>Introducing #Chs&#8217; 1st #Software #TechConference: CODEshow 3/14 with @MongoDB, @AngularJS, @Nodejs. <a href="http://www.chscodeshow.com">http://www.chscodeshow.com</a>  #chstech #SETech #SC<footer><strong>@chscodes</strong> <cite><a href='https://twitter.com/chscodes/status/290818518084108289]'>twitter.com/chscodes/status/&hellip;</a></cite></footer></blockquote>


<p>My gut dissapointment was later validated from 2 people I really respect and are super involved in the local tech community:</p>
<p><blockquote>@CHSdigital 1st techconference, really?<footer><strong>@amblin</strong> <cite><a href='https://twitter.com/amblin'>twitter.com/amblin/&hellip;</a></cite></footer></blockquote></p>
<p>and then</p>
<p><blockquote>@amblin @CHSdigital and I&#8217;m a bit disappointed that I never saw any kind of call for talk submissions.<footer><strong>@russellbryant</strong> <cite><a href='https://twitter.com/russellbryant'>twitter.com/russellbryant/&hellip;</a></cite></footer></blockquote></p>
<p>Being really involved with Barcamp and being part of building it up as a mostly tech focused conference is what dissapointed me in that the CDC didn&#8217;t really acknowledge that.</p>
<p>This &#8216;gut&#8217; dissapointment started to evolve to more of an understanding of 2 distinct camps and the motivations behind this conference and one like Barcamp Charleston, which is a pure community event.</p>
<h3>I see two very distinct roles of the Charleston &#8216;Tech&#8217; Community:</h3>

<p> One role is very distinctly what you would consider &#8216;grassroots&#8217;, meaning individuals, people wanting to connect and share and learn from one another.  Of course they want to raise the bar of our local #chs, but moreso want to identify, socialize, learn, and share the wonderful things that we bring to enrich this community.</p>
<p> A different role, in my mind anyway, is really and primarily about driving economic growth in our knowledge economy&#8230;aka economic development.  They want to realize our &#8216;Silicon Harbor&#8217; by supporting the growth of companies and supporting the ones here&#8230;as well as raising the profile of Charleston so as to attract more companies to call here HOME. Having a conference with nationally known speakers can only help the profile of our city and get a conversation going to a broader stage, especially knowing the &#8216;sell&#8217; of #chs is an easy one.</p>
<p> Understanding these two &#8216;roles&#8217; helps me put things in perspective, but still doesn&#8217;t completely iron out why the announcement tweet turned me the wrong way&#8230;</p>
<h3 id="which-turned-a-little-more-with-2-more-responses-from-chscodes">which turned a little more with 2 more responses from @chscodes</h3>
<p> In reponse to @amblin asking if it really was the first software tech conference:</p>
<p> <blockquote>@amblin This is the first conference in #CHS focused exclusively on software.<footer><strong>@chsdigital</strong> <cite><a href='https://twitter.com/chsdigital'>twitter.com/chsdigital/&hellip;</a></cite></footer></blockquote></p>
<p> And in response to @russellbryant about open calls to speak:</p>
<p> <blockquote>@russellbryant @amblin We&#8217;ll be doing a local-focused event again later in the year. This is designed 2 bring national speakers to #Chs.<footer><strong>@chscodes</strong> <cite><a href='https://twitter.com/chscodes'>twitter.com/chscodes/&hellip;</a></cite></footer></blockquote></p>
<p>To me, @chscodes missed the point of their questions and responded more in a tone of a parent telling their children to calm down, we&#8217;re giving something to the community soon, but this is bringing more knowledgeable/known people to charleston.</p>
<p>The thing is, Russell Bryant is a rockstar amongst geeks&#8230;he currently is a Principle software engineer at Red Hat and plays a very invluential role in Red Hat&#8217;s Open Stack project&#8230;.and before that, he helped lead core development of Asterisk - &#8216;The world&#8217;s most widely adopted open source communications platform&#8217;.  If that&#8217;s not national, not sure what is.</p>
<p>And I&#8217;m not trying to take away anything from the Codeshow&#8230;I really want to go and am excited they are showcasing some technologies that I really care about and use all the time.  In fact, I&#8217;m really happy with the state of Charleston&#8217;s tech community; I really feel like there is such diversity of not only opportunities to learn, but a whole lot of talented and nice people to learn from as well as companies to work for.</p>
<p>I feel very strongly about the mission of the Charleston Digital Corridor (CDC) in that they help nurture and grow smaller companies and help broadcast and find talent via the networking and being a hub.  They work hard, very hard.  Codecamp and tech talks&#8230;they do a lot, but there&#8217;s always room to improve.</p>
<p>Through many community tech events and local user groups, we&#8217;ve embraced celebrating the talents and local capital we have in Charleston and we&#8217;ve demonstrated that there&#8217;s Power in that.  Power to come together and strengthen our tech community. Power to connect and power to learn from one another.</p>
<p>It&#8217;s just that my drive to learn and connect with more cool geeks doesn&#8217;t bring jobs to the community.</p>
<p>I&#8217;m also not naieve enough to ignore the importance of building up the companies we have here in Charleston and attracting new ones.  I&#8217;m certain there&#8217;s a lot of factors that go into making a decision to locate your company to a specific area&#8230;and I feel like a very important one, at least for attracting talent, is having a solid tech community outside of just the local companies in the area.</p>
<p>I&#8217;m not anyone special or have any super talent that would be considered &#8216;national&#8217;, and I realize I may be speaking from a narrow perspective since I don&#8217;t regularly keep pace with all the CDC and the local &#8216;grassroots tech community&#8217; happenings, like Code Retreat which sounds like an awesome &#8216;grassroots tech community&#8217; event that was put on by the CDC.</p>
<p>My main reason for rambling tonight is to get my thoughts out there (I start a lot of posts that never get finished)&#8230;and also just to provide some feedback to the CDC to maybe start a dialog with the larger &#8216;grassroots tech community&#8217; to get a better understanding of each other&#8230;because I believe there is POWER in that and think that each party can enrich the other&#8217;s &#8216;primary goals&#8217;</p>
]]></description><link>/2013/01/14/power-and-economic-development-in-the-charleston-tech-community.html</link><guid isPermaLink="true">/2013/01/14/power-and-economic-development-in-the-charleston-tech-community.html</guid><category><![CDATA[chstech]]></category><dc:creator><![CDATA[Calvin Webster]]></dc:creator><pubDate>Mon, 14 Jan 2013 10:25:35 GMT</pubDate></item><item><title><![CDATA[It's a boy, meet Luca Alexander Webster]]></title><description><![CDATA[<iframe width="640" height="360" src="http://www.youtube.com/embed/Tkl44xazDYI" frameborder="0" allowfullscreen></iframe>

<p>It&#8217;s official!  We have (well, have had now for 2 1/2 months) a beautiful baby boy named Luca Alexander Webster, weighing in at 6lbs 12oz.</p>
<p>Needless to say things have stayed busy, especially for Anne Marie, but I&#8217;m so excited to be a father and ready to fill out my new role.  In the video above, he is less than an hour old and recovering from being intubated as he was not breathing initially when he came out.</p>
<!--more-->
<p><img src="http://farm9.staticflickr.com/8066/8191478409_fdebb0feb8.jpg" alt=""></p>
<p>The time has flown by!  What is really cool is that I&#8217;m finding he has a cute little personality and soooo many facial expressions. All the joys people mention when having a new little one are true, and it&#8217;s hard to describe how awesome it really is to hold your own, your little one.</p>
<p>Besides having a lot of reflux, he sleeps really well and is a playful baby. He&#8217;s not really cooing yet, but he smiles and acts like he is riding a bicycle if you lay him flat.  He defnitely will be an active child!</p>
<p>I can&#8217;t wait to start documenting more as he grows and grows.</p>
<p>I&#8217;m finding that I am thinking about things that didn&#8217;t really matter to me before like what are the nearest schools or what am I doing to be ready for when he walks&#8230;.or even what could he pull out of the walls that may hurt him.  Are there schools nearby that will be a good fit? Do we want to do Montessori?  Who will he be when he grows up?  Will he like who I am as a person?</p>
<p>I know some of that is a little silly, but still, its like my life got so much bigger (in a really good way)&#8230;and I want to make sure I make as much room and prepare as much as I can so I can allow as much growth, love, and happiness as possible.</p>
<p>The little guy is amazing and I can&#8217;t wait for all of my friends and family to meet him!</p>
<p>Here he is as a Ninja on Halloween:</p>
<p><img src="http://farm9.staticflickr.com/8463/8143704874_5b6f6c8f07.jpg" alt=""></p>
<p>And his angry face when he wants to be held:</p>
<p><img src="http://farm9.staticflickr.com/8070/8198046318_87cf556c8f.jpg" alt=""></p>
]]></description><link>/2012/11/16/its-a-boy-meet-luca-alexander-webster.html</link><guid isPermaLink="true">/2012/11/16/its-a-boy-meet-luca-alexander-webster.html</guid><category><![CDATA[family]]></category><dc:creator><![CDATA[Calvin Webster]]></dc:creator><pubDate>Fri, 16 Nov 2012 15:05:04 GMT</pubDate></item><item><title><![CDATA[More of a man...]]></title><description><![CDATA[<p><img src="http://farm7.staticflickr.com/6112/6329588043_3ccafd063f.jpg" alt="">
It&#8217;s been close to a year that I married my best friend and the person that inspires me everyday to be a better person.
Nearly 5 years ago I packed all my stuff up and moved to Charleston to find better opportunities both for life in general and to further my career in the world of web/software development.</p>
<p>I can honestly say that on all fronts, I couldn&#8217;t be in a better position than I am now.</p>
<p>I married and became best friends with an amazing women, I have a baby on the way (less than 5wks now)&#8230;and I work at one of the best software development shops in SC.</p>
<!--more-->
<p><img src="http://farm8.staticflickr.com/7127/7771573350_41ed348f20_o.jpg" alt=""></p>
<p>Personally and professionally, I&#8217;m loving life.  And with the upcoming birth of our first child, I&#8217;ve been reflecting a lot on where I&#8217;ve been and where I want to be.</p>
<p>I find that I&#8217;ve been spending a lot of time worrying about how I will be as a father and will I be able to keep the pace with the demands of a new child.  I&#8217;ve let myself go health-wise and have become &#8216;more of a man&#8217; from not paying attention to what I eat and the exercise I need to be healthy.  This, as I&#8217;m starting to realize, needs to change.</p>
<p>Changing these habits of eating and now exercising has been hard because I&#8217;ve been so unbalanced in my daily life, neglecting to really balance my personal needs.</p>
<p>I am aiming to change these bad habits and achieve more balance by honestly carving out time everyday to spend being active, whether it be a hike, the gym, or a fierce game of raquetball.</p>
<p>Time has been flying by and it&#8217;s time for me to start making sure I will be around for a while!</p>
]]></description><link>/2012/08/13/more-of-a-man-dot-dot-dot.html</link><guid isPermaLink="true">/2012/08/13/more-of-a-man-dot-dot-dot.html</guid><category><![CDATA[reflection]]></category><category><![CDATA[improvement]]></category><dc:creator><![CDATA[Calvin Webster]]></dc:creator><pubDate>Mon, 13 Aug 2012 14:05:04 GMT</pubDate></item><item><title><![CDATA[Mobile Hackathon]]></title><description><![CDATA[<p><img src="http://www.sparcedge.com/wp-content/uploads/2011/08/hackathon-2012.png" alt="">
It&#8217;s about to get real folks!</p>
<p>I&#8217;m really excited to say that doing the <a href="http://hackathon.sparcedge.com">Sparc mobile hackathon</a> will satisfy another goal of mine to become a better developer as well as learning mobile development.</p>
<p>I won&#8217;t be doing it on my own, but have 2 pretty awesome and super experienced devs, Adam Mack and Beth Bradshaw.  Together we are the Ninjaneers!</p>
<p>Not only will we be having some awesome times pushing our knowledge to new heights, but we will be joining many other awesome developers in the cause.</p>
<!--more-->
<iframe width="560" height="315" src="http://www.youtube.com/embed/6wiv3jOaZ5w" frameborder="0" allowfullscreen></iframe>


<p>Being a UI Developer, I sometimes feel pretty intimidated when I start diving into the deeper layers of software development, and although I&#8217;ve made it this far in my career, I always feel somewhat lacking in my knowledge and skill and feel like it&#8217;s something that I always want to improve upon.  Thankfully, I will be teaming with Adam and Beth as I both look up to them and hope that their ninja skills rubb off on me.</p>
<p>There are only a few remaining items left to figure out before the hackathon begins&#8230;and that would be our ninjaneer uniforms and whether or not we are going to go native and use objective c or use Apache Cordova/Phonegap.</p>
<p>Seeing as how everyday I pretty much live in javascript, I&#8217;m inclined to want to use a framework, but both Adam and Beth are seasoned programmers in Java and C, so it would probably make sense for them to want to code native.</p>
<p>They have both showed interest in using framework like Cordova, so I&#8217;m a little excited, but also am a little curious about writing a native app too.</p>
<p>I guess we will see as we&#8217;re going to start doing our coding workouts together to hopefully warm up and be in &#8216;shape&#8217; for the event.</p>
<p>Some of the things we&#8217;ll be practicing:</p>
<ul>
<li>Accessing the device&#8217;s hardware (eg. camera, gps/location, gyro/vibrate)</li>
<li>Using the local data storage</li>
<li>Consuming data via web services</li>
<li>User Interface and Orientation</li>
</ul>
<p>We only have a few weeks left so it&#8217;s a tall order, but if we can just scratch the surface, I think we&#8217;ll be in good shape!</p>
<p>The cool thing about using a framework, is if we have time, we could potentially port it to other devices, like Android and Windows Phone :)</p>
<p>So here&#8217;s to some awesomeness going down!
</div></p>
]]></description><link>/2012/08/09/mobile-hackathon.html</link><guid isPermaLink="true">/2012/08/09/mobile-hackathon.html</guid><category><![CDATA[chstech]]></category><category><![CDATA[improvement]]></category><dc:creator><![CDATA[Calvin Webster]]></dc:creator><pubDate>Thu, 09 Aug 2012 14:05:04 GMT</pubDate></item><item><title><![CDATA[... I'm blogging again]]></title><description><![CDATA[<h2 id="excited-to-start-again-and-chasing-unicorns">excited to start again and chasing unicorns</h2>
<p><img src="http://farm9.staticflickr.com/8425/7734843740_4a1e70df20_n.jpg" alt="Chasing Unicorns"></p>
<p>So I&#8217;ve been on hiatus from blogging and haven&#8217;t really done it for the past few years, but I feel like lately I have a lot more to say.</p>
<p>Just in the past year I&#8217;ve gone through a lot of transformations from being a husband, and now (soon to be), father.  This is so amazing to me and I&#8217;d like to share.</p>
<p>I&#8217;ve also made a lot of new friends and have been pushing my development knowledge to new levels, mostly due to my work at SPARC and the amazing coworkers I have there.</p>
<p>Stay tuned as I begin documenting my adventures!</p>
]]></description><link>/2012/08/08/and-dot-dot-dot-im-blogging-again.html</link><guid isPermaLink="true">/2012/08/08/and-dot-dot-dot-im-blogging-again.html</guid><category><![CDATA[meta]]></category><category><![CDATA[random]]></category><category><![CDATA[improvement]]></category><dc:creator><![CDATA[Calvin Webster]]></dc:creator><pubDate>Wed, 08 Aug 2012 14:05:04 GMT</pubDate></item><item><title><![CDATA[I was smart all my life until...]]></title><description><![CDATA[<p>&#8230;you realize you&#8217;ve been in a bubble.  As most of my friends know, I&#8217;ve started a new job at <a href="http://www.sparcedge.com">SPARC</a>, a local software dev firm&#8230;but everytime I go into work, I feel like a little baby crawling on the floor or pooping in my pants!</p>
<p>From evented javascript design to being on the front lines of enterprise app development, there&#8217;s a lot to learn.  The people are all amazing, humble, and so extremely talented that it bends my perception of what I thought I knew.  Exaggeration aside, I am excited to learn and grow in this space and hope that I too can become proficient enough to be &#8216;smart&#8217;&#8230;.. this is some additions</p>
]]></description><link>/2011/08/11/i-was-smart-all-my-life-until.html</link><guid isPermaLink="true">/2011/08/11/i-was-smart-all-my-life-until.html</guid><category><![CDATA[random]]></category><category><![CDATA[improvement]]></category><dc:creator><![CDATA[Calvin Webster]]></dc:creator><pubDate>Thu, 11 Aug 2011 14:05:04 GMT</pubDate></item></channel></rss>