<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>daverupert.com</title>
    <description></description>
    <link>http://daverupert.com</link>
    <atom:link href="/atom.xml" rel="self" type="application/rss+xml" />
    
      <item>
        <title>Hidden Expectations</title>
        <description>&lt;p&gt;This job never came with a manual. If you’re like me, you got into the business of building websites writing bad teenage poetry or photoshopping crude posters for your band. Eventually, you learned the skills to put your creation on the Web and became addicted to the thrill of instant self-publication.&lt;/p&gt;

&lt;p&gt;Over the years I’ve come to realize that most difficult part of making websites isn’t the code, it’s the “hidden expectations”, the unseen aspects I didn’t know were my responsibility when I started: Accessibility, Security, Performance, and Empathy.&lt;/p&gt;

&lt;h2 id=&quot;accessibility&quot;&gt;Accessibility&lt;/h2&gt;
&lt;p&gt;Sir Tim Berners-Lee &lt;em&gt;designed&lt;/em&gt; the Web to deliver Hypertext to any computer, on any hardware, anywhere in the world. Behind a myriad of devices are a myriad of people with none or any combination of visual, auditory, cognitive, and/or motor disabilities. Modern accessibility abides by the  &lt;a href=&quot;http://www.w3.org/TR/UNDERSTANDING-WCAG20/intro.html#introduction-fourprincs-head&quot;&gt;POUR&lt;/a&gt; acronym, which (to oversimplify) expects your website to be screen-readable, keyboard-navigable, have easy-to-read content with a sensible document structure, and be usable on any device.&lt;/p&gt;

&lt;p&gt;It’s all too easy to mess this up. You can make a tabbed interface with three lines of JavaScript or a checkbox hack, but it would likely be unusable for non-sighted users. You can make custom-styled &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;select&amp;gt;&lt;/code&gt; boxes using &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;div&amp;gt;&lt;/code&gt; elements, but sacrifice all the accessibility features of the native form control. Our cleverest implementations often fall short.&lt;/p&gt;

&lt;p&gt;And it’s complicated. If I’ve learned anything from 3 years of &lt;a href=&quot;http://a11yproject.com&quot;&gt;The Accessibility Project&lt;/a&gt;, it’s easy to get discouraged by such a nuanced field. Just when I’m ready to quit trying, I remember that (by some estimates) 1 out of 5 people –whether temporary or permanent– count on us doing a good job at Accessibility.&lt;/p&gt;

&lt;h2 id=&quot;security&quot;&gt;Security&lt;/h2&gt;
&lt;p&gt;Security and its twin sister Privacy have made quite a few headlines in the last few years: Heartbleed, Shellshock, DNCLeaks, and a rash of security breaches for many major online retailers. The consequence? Our personal information leaking out like sewage into the Dark Web.&lt;/p&gt;

&lt;p&gt;Those of us building websites probably all need a better working knowledge of common attack vectors: XSS, CSRF, click-jacking, Social Engineering, etc. And how to defend against those dark arts: &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;SSL&lt;/a&gt;, &lt;a href=&quot;http://enable-cors.org/&quot;&gt;enable CORS&lt;/a&gt; on both the client and server, strict &lt;a href=&quot;https://content-security-policy.com/&quot;&gt;Content Security Policies&lt;/a&gt;, encrypting all sensitive data, and anonymizing any personally identifiable information (PII). We need to 2-factor authenticate everything. Our sites, its systems, its data, its settings need to be secure by default. Similar to how cars have seatbelts.&lt;/p&gt;

&lt;p&gt;Designers may be quick to wring their hands of such a complex and technical responsibility as a problem for neckbeards to solve. However, Security and Privacy start with design. In a talk titled “&lt;a href=&quot;http://vimeo.com/68470326&quot;&gt;How Designers Destroyed the World&lt;/a&gt;”, Mike Monteiro retells the story of a woman who’s sexual orientation was unintentionally revealed to her conservative father due to a flaw in Facebook’s privacy settings. Monteiro makes a convincing argument that situations like this are not a technical problem, they are a design problem.&lt;/p&gt;

&lt;p&gt;So Security and Privacy are actually all of our problems. Personally, I expect this space to heat up now that high profile political and corporate hacks are happening on the regular.&lt;/p&gt;

&lt;h2 id=&quot;performance&quot;&gt;Performance&lt;/h2&gt;
&lt;p&gt;Web Performance is a hot topic. Faster websites make happier users, who click more links, who generate more revenue. It’s the perfect meeting point between User Experience and Business Analytics.&lt;/p&gt;

&lt;p&gt;Performance is measurable, but not visible. Web Performance is almost a &lt;em&gt;feeling&lt;/em&gt; that we use metrics to diagnose. It’s difficult to keep top of mind. Performance tends to be the last step of our build cycle yet design decisions that directly impact overall performance happened months ago.&lt;/p&gt;

&lt;p&gt;To top it all off, &lt;a href=&quot;http://timkadlec.com/2014/01/fast-enough/#comment-1200946500&quot;&gt;our standards are probably too lax&lt;/a&gt;. &lt;a href=&quot;http://daverupert.com/2016/07/a-standard-system-of-measurements/&quot;&gt;How we measure, describe, and collectively perceive “fast”&lt;/a&gt; probably needs rehabilitation as well.&lt;/p&gt;

&lt;p&gt;It’s hard work to stay on the bleeding edge of speed. Everything changes every six months. It takes a mix of server, front-end, automation, and teamwork kung-fu but the good news is that Performance can be 💸 very rewarding 💸.&lt;/p&gt;

&lt;h2 id=&quot;empathy&quot;&gt;Empathy&lt;/h2&gt;
&lt;p&gt;All of these can be summed up in a simple word; Empathy. Design is ultimately about making connections with people. Dealing with humans (who have emotions and unlimited number of contexts) requires empathy for what they might be experiencing.&lt;/p&gt;

&lt;p&gt;In their book &lt;a href=&quot;https://abookapart.com/products/design-for-real-life&quot;&gt;Design for Real Life&lt;/a&gt;, Eric Meyer and Sarah Watcher-Boettcher set the bar for Empathy fairly high. I think it’s a good bar. They introduce the idea of “stress tests”, that is to say, does our design and software serve people who aren’t in an ideal state? Do our animations or witty bot responses frustrate users who have zero fucks to give? In most situations I’d wager; Yes.&lt;/p&gt;

&lt;p&gt;It’s difficult to sustain the level of empathy required to build software that actual real, emotional people use. The Web’s greatest strength, human connectivity, requires that empathy. Mastering Empathy means we can make the Web and possibly the world a better place for everyone.&lt;/p&gt;

&lt;h2 id=&quot;managing-the-hidden-things&quot;&gt;Managing the Hidden Things&lt;/h2&gt;

&lt;p&gt;It takes a level of constant vigilance to manage the hidden things correctly. Accessibility, performance, security, and content audits easily slip through the cracks as budgets and timelines slim down. “Get it done” trumps “Do it right”. In fact, “Do it right” is a bit of a problematic call-to-arms, because the moral implication has an air of religiosity to it. What’s “moral” and “right” to one person may be different to another. Unfortunately, “Function well and protect the individual legal rights and dignity of every user” doesn’t make a good soundbyte.&lt;/p&gt;

&lt;p&gt;The only way I’ve found to deal with the immense responsibility of these hidden expectations is to take each task up for a season. I personally feel myself embarking on a season of Security. Lo, heavy is the tin foil hat…&lt;/p&gt;

&lt;p&gt;Becoming a generalist in these areas can be difficult. Discovering who to trust and what information is current is half the battle. To add insult to injury, some communities (like Security and Accessibility) have vocal minorities that reject novices becuase they have the potential to create more problems than solutions. So be careful, thar be dragons.&lt;/p&gt;

&lt;p&gt;If there’s any silver lining, it’s that more practice makes it easier to be more mindful. Over time, it’s less difficult to jump back into a different mindset if you’ve dedicated yourself to one for a season. If you have a team doing these things, it’ll be easier to remember too.&lt;/p&gt;

&lt;p&gt;It’s important to know your blindspots. When in doubt hire a professional dedicated to one of these trades for help. Don’t neglect the things you cannot see or measure.&lt;/p&gt;
</description>
        <pubDate>Mon, 01 Aug 2016 00:00:00 -0500</pubDate>
        <link>http://daverupert.com/2016/08/hidden-expectations/</link>
        <guid isPermaLink="true">http://daverupert.com/2016/08/hidden-expectations/</guid>
      </item>
    
      <item>
        <title>Solvable Chunks: One Week Video Game</title>
        <description>&lt;p&gt;&lt;img src=&quot;/images/posts/2016/global-defense.gif&quot; alt=&quot;Screen capture of Global Defense&quot; /&gt;&lt;/p&gt;

&lt;p&gt;‘Twas late Sunday night and I got an idea for a multiplayer HTML5 game using canvas, web sockets, and gyroscopes. I tossed and turned mulling it over. On Friday night Chris Coyier and I were scheduled to do a live &lt;a href=&quot;http://shoptalkshow.com&quot;&gt;Shop Talk Show&lt;/a&gt; at &lt;a href=&quot;http://webdesignday.com/&quot;&gt;Web Design Day&lt;/a&gt; in Pittsburgh. As I lay awake staring at the ceiling, I realized I might be able to pull it off. I would call it Global Defense!&lt;/p&gt;

&lt;p&gt;&lt;a class=&quot;button&quot; href=&quot;http://globaldefense.club&quot;&gt;Play Global Defense&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;solvable-chunks&quot;&gt;Solvable Chunks&lt;/h2&gt;

&lt;p&gt;To build the game I broke the project up in to something I call “Solvable Chunks”. Breaking a design or idea into smaller pieces, while maintaining a big picture, allows you to prototype each piece of necessary functionality with the aim to inform your design and timeline.&lt;/p&gt;

&lt;p&gt;To me, a solvable chunk is a problem I think I can solve in about 4 hours. The 4 hours is relevant because -as a parent- it’s roughly the amount of time I have after my kids go to bed. It’s also the length of a morning or afternoon where you can prototype while pretending to check your email. Solvable chunks is maybe something we do naturally, but applying a light framework around it has really helped me quickly create and maintain momentum.&lt;/p&gt;

&lt;p&gt;When working on a chunk, I’m always aware that a problem can give birth to a myriad of baby problems. Knowing that, over thinking or scoping anything beyond that first or third chunk is futile because what I discover in those early stages will dramatically affect what happens in later stages. I have the big idea in mind, but I let those later stages be intentionally vague.&lt;/p&gt;

&lt;p&gt;Solvable is important too. At all costs you want to keep momentum on a prototype. Keeping problems small and solvable helps you do this. Losing momentum means it will be more difficult to jump back into solving complex tasks. If by the end of 4 or 8 hours you’re still not finished, that’s okay. You should now have a better idea of what it would take to finish and if the current design is endangering the timeline.&lt;/p&gt;

&lt;p&gt;At the end of your chunk, share and document your learnings with your team. If you’re working solo, keep a development journal you can reference later.&lt;/p&gt;

&lt;p&gt;Using prototypes you’ll be able to make better timeline estimates if you do a little bit of the work up front. You can choose to keep iterating, redesign to be something more minimal and timeline efficient, or adjust the timeline.&lt;/p&gt;

&lt;p&gt;The following is a night-by-night, chunk-by-chunk, breakdown of how I built Global Defense.&lt;/p&gt;

&lt;h3 id=&quot;monday-asteroids&quot;&gt;Monday: Asteroids&lt;/h3&gt;

&lt;p data-height=&quot;300&quot; data-theme-id=&quot;11781&quot; data-slug-hash=&quot;9a857c7e89dfb37cfb508a865a73f6eb&quot; data-default-tab=&quot;result&quot; data-user=&quot;davatron5000&quot; data-embed-version=&quot;2&quot; class=&quot;codepen&quot;&gt;See the Pen &lt;a href=&quot;https://codepen.io/davatron5000/pen/9a857c7e89dfb37cfb508a865a73f6eb/&quot;&gt;Global Defense v1: Make asteroids fall&lt;/a&gt; by Dave Rupert (&lt;a href=&quot;http://codepen.io/davatron5000&quot;&gt;@davatron5000&lt;/a&gt;) on &lt;a href=&quot;http://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I didn’t know much about drawing in canvas, so my first chunk was learning to draw falling-circle shaped asteroids. Circles have &lt;code class=&quot;highlighter-rouge&quot;&gt;x&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;y&lt;/code&gt;, and &lt;code class=&quot;highlighter-rouge&quot;&gt;radius&lt;/code&gt; attributes. Making them fall from the top was simply a matter of increasing the &lt;code class=&quot;highlighter-rouge&quot;&gt;y&lt;/code&gt; value every frame and splicing the asteroid object from the asteroids array when it hit the bottom of the screen.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;// Move the Asteroids
for(var i = 0; i&amp;lt; asteroids.length; i++ ) {
  var asteroid = asteroids[i];
  asteroid.y += 1;

  if( asteroid.y &amp;gt; h ) {
    asteroids.splice(i, 1);
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;// Draw the Asteroids
for(var i = 0; i&amp;lt; asteroids.length; i++ ) {
  var asteroid = asteroids[i];

  ctx.beginPath();
  ctx.strokeStyle = &#39;#0CF&#39;;
  ctx.arc( asteroid.x, asteroid.y, asteroid.radius,  0, 2 * Math.PI );
  ctx.stroke();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h3 id=&quot;tuesday-shooting&quot;&gt;Tuesday: Shooting&lt;/h3&gt;

&lt;p data-height=&quot;300&quot; data-theme-id=&quot;11781&quot; data-slug-hash=&quot;045719f8e925a28a418a86372508c065&quot; data-default-tab=&quot;result&quot; data-user=&quot;davatron5000&quot; data-embed-version=&quot;2&quot; class=&quot;codepen&quot;&gt;See the Pen &lt;a href=&quot;https://codepen.io/davatron5000/pen/045719f8e925a28a418a86372508c065/&quot;&gt;Global Defense v2: Make bullets shoot&lt;/a&gt; by Dave Rupert (&lt;a href=&quot;http://codepen.io/davatron5000&quot;&gt;@davatron5000&lt;/a&gt;) on &lt;a href=&quot;http://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I originally wanted lasers to shoot the asteroids like Missile Command or Asteroids, but as I thought about it some I realized a “bullet” is really just a tiny asteroid that goes up instead of down! I already had the code for this, so I inverted my asteroid code to make bullets.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;// Move the Bullets
for(var i = 0; i&amp;lt; bullets.length; i++ ) {
  var bullet = bullets[i];
  bullet.y -= 2;

  if( bullet.y &amp;lt; 0 ) {
    bullets.splice(i, 1);
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Allowing the code from the prototype to inform the design saved me lots of time and I attribute this to being the reason the project was successful.&lt;/p&gt;

&lt;h3 id=&quot;wednesday-collision-damage-and-the-planet&quot;&gt;Wednesday: Collision, Damage, and the Planet&lt;/h3&gt;

&lt;p data-height=&quot;300&quot; data-theme-id=&quot;11781&quot; data-slug-hash=&quot;23cb8949685d3da22c4d14b9b017195f&quot; data-default-tab=&quot;result&quot; data-user=&quot;davatron5000&quot; data-embed-version=&quot;2&quot; class=&quot;codepen&quot;&gt;See the Pen &lt;a href=&quot;https://codepen.io/davatron5000/pen/23cb8949685d3da22c4d14b9b017195f/&quot;&gt;Global Defense v3: Aim, Collision, and Damage&lt;/a&gt; by Dave Rupert (&lt;a href=&quot;http://codepen.io/davatron5000&quot;&gt;@davatron5000&lt;/a&gt;) on &lt;a href=&quot;http://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now I needed the bullets to destroy the asteroids. Searching the web for “canvas circle collision detection” took me to an &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Games/Techniques/2D_collision_detection&quot;&gt;MDN article about 2D game development&lt;/a&gt;. There was my answer in JavaScript. I had to modify it a bit, but it worked and bullets could now &lt;code class=&quot;highlighter-rouge&quot;&gt;splice()&lt;/code&gt; asteroids.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;// Detect Bullet/Asteroid Collisions
for(var i = 0; i&amp;lt; bullets.length; i++ ) {
  var bull = bullets[i];

  for ( var j = 0; j &amp;lt; asteroids.length; j++) {
    var ast = asteroids[j];
    var dx = bull.x - ast.x;
    var dy = bull.y - ast.y;
    var distance = Math.sqrt(dx * dx + dy * dy);

    if (distance &amp;lt; bull.radius + ast.radius) {
      // Collision detected!
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Yay free code! The code-informed design decision to switch to circles already started paying off in speed.&lt;/p&gt;

&lt;p&gt;Damage was an easy patch. Each asteroid would get a randomized &lt;code class=&quot;highlighter-rouge&quot;&gt;hp&lt;/code&gt; (hitpoint) attribute. And the &lt;code class=&quot;highlighter-rouge&quot;&gt;radius&lt;/code&gt; on each &lt;code class=&quot;highlighter-rouge&quot;&gt;draw()&lt;/code&gt; cycle would now be based on the &lt;code class=&quot;highlighter-rouge&quot;&gt;hp * asteroidSizeModifier&lt;/code&gt;. After every collision, damage would be applied, affecting the &lt;code class=&quot;highlighter-rouge&quot;&gt;radius&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;if (distance &amp;lt; bull.radius + ast.radius) {
  // Collision detected! Remove bullet.
  bullets.splice( i, 1 );

  // Make asteroid take damage
  if(ast.hp - 1 === 0) {
    asteroids.splice( j, 1 );
  } else {
    ast.hp = ast.hp - 1;
    ast.radius = ast.hp * asteroidSizeModifier;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;The last chunk was the planet. After some thinking, I realized planets are just very large asteroids! I already had this code and the collision detection. It came together quickly. Again, that code-informed design decision was paying off in dividends.&lt;/p&gt;

&lt;h2 id=&quot;thursday-math-and-socketio&quot;&gt;Thursday: Math and Socket.io&lt;/h2&gt;

&lt;p&gt;On Thursday I was traveling all day on a plane to Web Design Day. This worked out well for the project because I had to pull it off of CodePen to my &lt;code class=&quot;highlighter-rouge&quot;&gt;localhost&lt;/code&gt; begin web socket work using Node and &lt;a href=&quot;http://socket.io/&quot;&gt;Socket.io&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2016/global-defense-math.png&quot; alt=&quot;Screenshot of hand written math equations&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I started by doing a lot of High School level math. I’m surprised I didn’t get escorted off the plane. Eventually I understood &lt;code class=&quot;highlighter-rouge&quot;&gt;Math.tan()&lt;/code&gt; and &lt;code class=&quot;highlighter-rouge&quot;&gt;y=mx+b&lt;/code&gt; enough to hook give the bullet a slope as it travelled upwards based on my Surface’s gyroscope.&lt;/p&gt;

&lt;p&gt;Socket.io, a very complex web socket thing, turned out to be easier than imagined.&lt;/p&gt;

&lt;p&gt;On one page there’s a game board, on another a button that says “Fire”.  When the fire button is clicked, it emits a custom event called &lt;code class=&quot;highlighter-rouge&quot;&gt;fire&lt;/code&gt;. Attached to that event you can send data. After some tinkering I realized I could just send the calculated slope of the device. Emitting a small packet of data is good.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;function handleClick( event ) {
  socket.emit( &#39;fire&#39;, { slope: slope } );
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;The server hears that event and responds by emitting that &lt;code class=&quot;highlighter-rouge&quot;&gt;fire&lt;/code&gt; event and its data out to all the other connected clients (i.e, the game board).&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;socket.on(&#39;fire&#39;, function(msg) {
  io.emit(&#39;fire&#39;, msg);
});
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;When the game board screen hears a “fire” event, it will &lt;code class=&quot;highlighter-rouge&quot;&gt;push()&lt;/code&gt; a bullet object into the &lt;code class=&quot;highlighter-rouge&quot;&gt;bullets&lt;/code&gt; array with the &lt;code class=&quot;highlighter-rouge&quot;&gt;slope&lt;/code&gt; from the packet of data. The &lt;code class=&quot;highlighter-rouge&quot;&gt;draw()&lt;/code&gt; function in the next &lt;code class=&quot;highlighter-rouge&quot;&gt;requestAnimationFrame&lt;/code&gt; will give it a starting &lt;code class=&quot;highlighter-rouge&quot;&gt;x,y&lt;/code&gt; coordinates and start animating the bullet.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;socket.on(&#39;fire&#39;, function(msg) {
  bullets.push(msg);
});
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;I also learned that &lt;a href=&quot;https://code.visualstudio.com/&quot;&gt;VS Code&lt;/a&gt; is a really great text editor for building and &lt;a href=&quot;https://code.visualstudio.com/Docs/editor/debugging&quot;&gt;debugging Node applications&lt;/a&gt;. You can (re)launch your server by hitting &lt;code class=&quot;highlighter-rouge&quot;&gt;F5&lt;/code&gt; and even setup a debugger to step into objects and functions just like a web inspector. That feature alone may have secured Code as my editor of choice going forward.&lt;/p&gt;

&lt;h2 id=&quot;friday-ui-polish-and-demo&quot;&gt;Friday: UI, Polish, and Demo!&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2016/global-defense-playtest.jpg&quot; alt=&quot;Photo of Global Defense playtest&quot; /&gt;
&lt;em&gt;Photo by Brian Muenzenmeyer&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;On Friday I used my new found canvas skills to rough out a UI. This has a “&lt;a href=&quot;http://knowyourmeme.com/memes/how-to-draw-an-owl&quot;&gt;Draw the rest of the owl&lt;/a&gt;” feel but everything below was optional. I could have played the game without this stuff, but it was a little more exciting with it.&lt;/p&gt;

&lt;p&gt;I did some refactoring:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Improved the single player mode and game joining system.&lt;/li&gt;
  &lt;li&gt;I added a simple polygon for a ship, but its position affected the initial y-coordinates of the bullets.&lt;/li&gt;
  &lt;li&gt;Adding a bit of responsiveness for a multidevice strategy means minor refactoring of the ship and planet to be scalable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And added some nice to haves:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;I made a &lt;code class=&quot;highlighter-rouge&quot;&gt;defcon&lt;/code&gt; variable to increase the chance of randomization.&lt;/li&gt;
  &lt;li&gt;I added a &lt;code class=&quot;highlighter-rouge&quot;&gt;score&lt;/code&gt; to give the game a bit more of a point.&lt;/li&gt;
  &lt;li&gt;I downloaded a font from DaFonts for the UI text; score, planet hitpoints, and defcon level.&lt;/li&gt;
  &lt;li&gt;Made the earth change color for 12 frames when hit.&lt;/li&gt;
  &lt;li&gt;I bought a domain name and forwarded the DNS.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that was it. I had a working game. The demo during the live Shop Talk Show went okay. Live demos are always tough, and it’s impossible for me to test 200 simultaneous clients, but it held up and I think people had fun. Bullets never stopped flying.&lt;/p&gt;

&lt;h2 id=&quot;the-next-week&quot;&gt;The next week&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2016/global-defense-notes.jpg&quot; alt=&quot;Notebook with about 10 to-dos all completed: Mnaifest, Offline, Service Worker, Base32 Game ID, Rotate to Aim, Tap to Fire, Click to Fire, Instructions, Show Game ID on UI, Icons, Homepage, Reset(), apple-web-app-capable?&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Over the next week I built out a punchlist of all the things I learned I needed. I took the same Solvable Chunks approach to finish it out. Most of these chunks went a lot faster. By the next Friday, a week after the demo, I was ready to share it.&lt;/p&gt;

&lt;p&gt;Launch went well, except I had a bug where the game would never start. So I uh… fixed that.&lt;/p&gt;

&lt;p&gt;There are still have some things I’d like to do, but I’ve learned through this process that each feature adds about another day of work. Making the asteroids more geometric instead of circles? 1 day. Making the bullets lasers instead? 1 day. Progressive web app? 1 day. The list goes on, the day job is back in full effect, and I’ll have to take it one chunk at a time since there is zero momentum. Or I’ll start another project ;)&lt;/p&gt;

&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;Global Defense is a game I built in my spare time. I had a playable prototype in a week and launched it in two weeks.&lt;/p&gt;

&lt;p&gt;Along the way, I worked in solvable chunks and let the code from the prototype inform some of my design decisions. This saved uncounted hours and allowed the product to be delivered quickly and on time. Working on a tight timeline forced me to be practical and reduce scope as much as possible. Getting to a minimum viable product meant understanding that every feature would result in another day of work.&lt;/p&gt;

&lt;p&gt;I had fun building it and learned a lot about canvas, gyroscopes, and websites with high-concurrency, realtime, cross-device communication. Those are all things I can apply to my work immediately. I’ve also had the chance to have conversations with people from Microsoft Edge and Google Chrome about it, not too shabby.&lt;/p&gt;

&lt;p&gt;I think the greatest takeaway, even though it’s low-budget and still has a prototype feel, I built and released my first game other people can play. That is very exciting and I hope there’s more in the future.&lt;/p&gt;
</description>
        <pubDate>Fri, 29 Jul 2016 00:00:00 -0500</pubDate>
        <link>http://daverupert.com/2016/07/solvable-chunks-one-week-video-game/</link>
        <guid isPermaLink="true">http://daverupert.com/2016/07/solvable-chunks-one-week-video-game/</guid>
      </item>
    
      <item>
        <title>The #davegoeswindows Finale</title>
        <description>&lt;p&gt;It’s been one year since I uprooted my dev environment and made the switch to Windows. I’m happy to share that after a year of &lt;a href=&quot;http://daverupert.com/tag/davegoeswindows&quot;&gt;ups and downs&lt;/a&gt;, I’ve made the decision… &lt;em&gt;dramatic pause&lt;/em&gt; …to… &lt;em&gt;more dramatic pausing&lt;/em&gt; …stick with Windows.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://shoptalkshow.com/episodes/225-davegoeswindows-wrap/&quot;&gt;Listen to the wrap-up on Shop Talk&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://daverupert.com/tag/davegoeswindows&quot;&gt;Read the whole #davegoeswindows saga&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;why-im-staying-with-windows&quot;&gt;Why I’m Staying with Windows&lt;/h2&gt;

&lt;p&gt;It’s hard to lay out reasoning for switching operating systems without fans of the other operating system being offended and offering endless well actuallys, so let me say this: this is less about declaring a winner, and more about trying something new. I tried something new and I liked it enough to stay with it.&lt;/p&gt;

&lt;p&gt;So here are the reasons I’ve decided to stick:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://medium.com/web-on-the-edge/progressive-web-apps-on-windows-8d8eb68d524e#.7wpbx93hk&quot;&gt;Edge’s recent announcement of Progressive Web Apps on Windows 10&lt;/a&gt; is a major factor. I love the Web and I’m voting with my dollars. I’m similarly considering a switch to Android.&lt;/li&gt;
  &lt;li&gt;Windows 10 is really great. The best part has been watching it iteratively keep getting better in the Insider Fast Track.&lt;/li&gt;
  &lt;li&gt;In Windows, HTML/CSS/JavaScript are first class citizens. So are Node apps.&lt;/li&gt;
  &lt;li&gt;I’m inspired by &lt;a href=&quot;http://daverupert.com/2016/06/dave-goes-build/&quot;&gt;Microsoft’s view of technology&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Bash on Ubuntu on Windows (aka Windows Subsystem for Linux, aka WSL) is a game changer.&lt;/li&gt;
  &lt;li&gt;I like the balance it brings to &lt;a href=&quot;http://shoptalkshow.com&quot;&gt;Shop Talk&lt;/a&gt;. Advice podcasts should have different perspectives built in to them, not just re-enforcing a monoculture.&lt;/li&gt;
  &lt;li&gt;Windows gets me excited about hardware: touchscreens, VR, GPUs, 3D webcams, lots of stuff that’s not offered on Mac product line.&lt;/li&gt;
  &lt;li&gt;I’ve started making some video games and want to play with VR, &lt;a href=&quot;https://www.engadget.com/2016/03/03/palmer-luckey-on-why-theres-no-oculus-rift-for-mac/&quot;&gt;Windows is the best platform for VR&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;I used to believe that Apple was the pinnacle of hardware, software, and design. Apple is still best at “Things just work™”, but I do not believe they’re at the top of any of those categories anymore.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are also lots of little things I’ve picked up from tumbling down the Microsoft product line. I like Edge. I like OneNote. Groove, my Rdio replacement, is maybe the best music service out there. Visual Studio Code is pretty great, especially for writing Node apps. All those little things add up to a positive experience overall.&lt;/p&gt;

&lt;h2 id=&quot;what-im-pensive-about&quot;&gt;What I’m Pensive About&lt;/h2&gt;

&lt;p&gt;Any major life decision wouldn’t be noteworthy unless it was frought with uncertainty. Here’s what I still wonder about:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Windows Subsystem for Linux (WSL) is promising, but has &lt;a href=&quot;https://wpdev.uservoice.com/forums/266908-command-prompt-console-bash-on-ubuntu-on-windo/suggestions/13254597-support-for-symlinks-and-long-filenames-in-bash&quot;&gt;some&lt;/a&gt; &lt;a href=&quot;https://wpdev.uservoice.com/forums/266908-command-prompt-console-bash-on-ubuntu-on-windo/suggestions/13469097-support-for-filesystem-watchers-like-inotify&quot;&gt;problems&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;There needs to be a good looking, &lt;a href=&quot;https://wpdev.uservoice.com/forums/266908-command-prompt-console-bash-on-ubuntu-on-windo/suggestions/6509361-provides-support-for-ansi-colors-like-in-bash&quot;&gt;256-color&lt;/a&gt;, &lt;a href=&quot;https://wpdev.uservoice.com/forums/266908-command-prompt-console-bash-on-ubuntu-on-windo/suggestions/6509358-great-start-but-still-missing-one-of-my-cmd-desir&quot;&gt;tabbed&lt;/a&gt; command line interface. What’s available now feels antiquated.&lt;/li&gt;
  &lt;li&gt;Apps crashing. Whether it’s Twitter, Edge, Slack, my Wi-Fi drivers, or some other piece of integral software; apps stalling out or wiping off the screen causes frustration every two weeks or so. Requires reboots, which also feels antiquated.&lt;/li&gt;
  &lt;li&gt;Web design and development tools are still better on macOS.&lt;/li&gt;
  &lt;li&gt;Detangle myself from Apple services (Photos, iCloud, iBooks, iTunes, etc) is work. Not ultra necessary, but the benefits of the ecosystem rapidly diminish outside of it.&lt;/li&gt;
  &lt;li&gt;I don’t want to hotswap one ecosystem-dependency for another. I want to be more loosly coupled to the platform.&lt;/li&gt;
  &lt;li&gt;Coworkers are on Mac. In general this is okay, but being an outlier means I’m responsible for my own tech workarounds.&lt;/li&gt;
  &lt;li&gt;The &lt;code class=&quot;highlighter-rouge&quot;&gt;CTRL&lt;/code&gt; key still kinda bothers me.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The apps crashing issue could be a quality issue, a RAM issue, or possibly related to Insider Fast Track updates. It’s hard to judge when using “beta” software. I’ve considered scaling back to the Slow channel after this experiment is over.&lt;/p&gt;

&lt;h2 id=&quot;what-about-davegoesubuntu&quot;&gt;What about #davegoesubuntu?&lt;/h2&gt;

&lt;p&gt;This comes up a lot. I would probably enjoy it, but everytime I start to think about it I hear this quote in the back of my mind:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Linux is only free if your time has no value.
–Jamie Zawinski&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At the risk of ruining my “developer cred”, I need a certain amount of abstraction for my day-to-day machine. I have little interest in hunting down and manually installing drivers to make things work.&lt;/p&gt;

&lt;p&gt;Also, with Windows Subsystem for Linux now at my fingertips, in some ways #davegoesubuntu is already underway.&lt;/p&gt;

&lt;h2 id=&quot;a-new-machine-for-a-new-era&quot;&gt;A new machine for a new era!&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2016/rzrblade14.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;While the Surface Pro 3 furnished by Microsoft has served me well, I’m thinking it’s time for an upgrade. In fact I’m considering switching up my whole setup.&lt;/p&gt;

&lt;p&gt;If all goes well, my new setup will look something like this:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.razerzone.com/gaming-systems/razer-blade&quot;&gt;2016 Razer Blade 14”&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.razerzone.com/gaming-systems/razer-blade-stealth#ultrabook-desktop&quot;&gt;Razer Core&lt;/a&gt; with &lt;a href=&quot;http://www.geforce.com/hardware/10series/geforce-gtx-1070&quot;&gt;Nvidia GTX 1070&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://amzn.to/29PwzeW&quot;&gt;Kindle Paperwhite&lt;/a&gt; (to replace iBooks/iPad)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://vr.google.com/daydream/&quot;&gt;Daydream&lt;/a&gt; Compatible Android (when available)
    &lt;ul&gt;
      &lt;li&gt;I’d also consider a Surface Phone, if that’s not vaporware. I got thoughts on how to save Windows Phone tho.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.microsoft.com/microsoft-hololens/en-us&quot;&gt;HoloLens&lt;/a&gt; if Microsoft wants to send me one of those (&lt;em&gt;wink wink&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s a chunk of change, but I feel like the Razer Blade with the Razer Core unlocks what I like about the Windows ecosystem. As I’ve began dipping my toes into WebGL, gamedev, and VR; I think I’d benefit more from a quadcore, a nice GPU, and at least 16GB of RAM (for development). And the outboard GPU will be sweet for games.&lt;/p&gt;

&lt;p&gt;This year has taught me a lot about device limitations and integrated GPUs, so I’ll &lt;a href=&quot;http://daverupert.com/2016/07/a-standard-system-of-measurements/&quot;&gt;be sure to test on more underpowered hardware&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;so-i-guess-im-a-windows-user-now&quot;&gt;So I guess I’m a Windows user now…&lt;/h2&gt;

&lt;p&gt;This decision has been possibly the longest “What computer should I buy?” transaction in recorded history. There’s a sense of personal accomplishment of trying something new and sticking with it for an entire year. I think I’ve benefitted from it, my perceptions surely have changed. It’s weird how much we define ourselves and build factions around the technology we purchase.&lt;/p&gt;

&lt;p&gt;It’s a lot of effort to uproot the core of your workflow, like an operating system and a browser, but it’s nice to know you won’t die if you change a piece of software. And you may even like it more in the long run. At least that’s my experience.&lt;/p&gt;

&lt;p&gt;Well, that wraps up a whole year of self-experimentation. Probably won’t do another one of these for awhile.&lt;/p&gt;

&lt;p&gt;Before I sign off, I want to say thanks to Rey Bango for orchestrating this whole experiment and helping me out when I felt like my computer was going up in flames. Thanks to Ryan Joy for helping me with Windows and Azure stuff (still have to write an Azure post). Thanks to John Shewchuk for the wonderful conversations at Build. Thanks to Helena Li and Danilo Bordini for their help at Build as well.&lt;/p&gt;

&lt;p&gt;And special thanks to anyone who commented on this blog or reached out on Twitter along the way, it was helpful beyond words.&lt;/p&gt;
</description>
        <pubDate>Tue, 19 Jul 2016 00:00:00 -0500</pubDate>
        <link>http://daverupert.com/2016/07/davegoeswindows-finale/</link>
        <guid isPermaLink="true">http://daverupert.com/2016/07/davegoeswindows-finale/</guid>
      </item>
    
      <item>
        <title>A Standard System of Measurements?</title>
        <description>&lt;p&gt;Lately I’ve been thinking about how the Web could benefit from a Standardized System of Measurements, especially in how we discuss performance.&lt;/p&gt;

&lt;p&gt;I was pleased to find &lt;a href=&quot;https://www.youtube.com/watch?v=IxXGMesq_8s&quot;&gt;this video&lt;/a&gt; where Paul Irish and a consortium of folks are discussing &lt;em&gt;how&lt;/em&gt; to measure User Experience (delivery, paint, jank, etc) in Progressive Web Apps.&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/IxXGMesq_8s&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;h2 id=&quot;collectively-defining-our-own-standards&quot;&gt;Collectively defining our own standards&lt;/h2&gt;

&lt;p&gt;While those big brains think on how to measure real world performance&lt;sup id=&quot;fnref:quote&quot;&gt;&lt;a href=&quot;#fn:quote&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;, maybe there’s something us “normies” can do in the field.&lt;/p&gt;

&lt;p&gt;I’m beginning to believe that front-end developers need to normalize how we perceive and test our sites; and not putting it lightly, it must be Mobile First. I believe using “Chrome on my quad-core desktop” as a baseline skews our lens of performance perception the wrong way.&lt;/p&gt;

&lt;p&gt;If the quasi-scientific Web Community were to collectively agree (&lt;em&gt;yes, I realize this will never happen&lt;/em&gt;) to use the same testing environments, like Science, it could help eliminate vanity metrics and produce better comparisons and better practices. Here’s my proposal, a starting point, with Mobile First as a guiding principle.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Throttled to 3G Good/Fast&lt;/strong&gt; (~750kb/s with ~40ms RTT latency)
    &lt;ul&gt;
      &lt;li&gt;This emulates still-common 3G signal and bad wifi (aka, lie-fi).&lt;/li&gt;
      &lt;li&gt;Fiddler, Charles, or Web Inspector can throttle to 3G.&lt;/li&gt;
      &lt;li&gt;WebPageTests can run at 3G.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Tested in Chrome on actual Nexus 5X&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Android has ~80% global mobile marketshare.&lt;/li&gt;
      &lt;li&gt;Nexus 5X is probably a good example of a “median” Android device.&lt;/li&gt;
      &lt;li&gt;USB inspecting is Mac and Windows compatible.&lt;/li&gt;
      &lt;li&gt;Chrome is currently the most advanced mobile browser.&lt;/li&gt;
      &lt;li&gt;Real devices have CPU, GPU, and memory limitations that our quad-core super computers don’t. &lt;a href=&quot;https://www.youtube.com/watch?v=a5X_Ot-R6lo&quot;&gt;Alex Russel talks about this in his Google I/O 2016 talk&lt;/a&gt;.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All measurements would be based off of those two scenarios. You could build and test your websites with that little device tethered out to the side. This could be accompanied by a second teir of test scenarios that, in the interest of simplicity, are optional:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Tested on Edge w/ multitouch screen&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Default browser for Windows 10&lt;/li&gt;
      &lt;li&gt;Windows has a ~80% global marketshare&lt;/li&gt;
      &lt;li&gt;10-point touch PointerEvents&lt;/li&gt;
      &lt;li&gt;Historically lacking in feature support&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Tested in Safari&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Default browser for MacOS and iOS&lt;/li&gt;
      &lt;li&gt;Slower annual release cycle&lt;/li&gt;
      &lt;li&gt;Currently lowest on &lt;a href=&quot;http://html5test.com/&quot;&gt;HTML5Test&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Tested on Opera Mini&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Harshest of all proxy browsers&lt;/li&gt;
      &lt;li&gt;Simulation of when things fail&lt;/li&gt;
      &lt;li&gt;Ignores some CSS, no fonts, low JavaScript support&lt;/li&gt;
      &lt;li&gt;No asynchronous JavaScript&lt;/li&gt;
      &lt;li&gt;Arbitrary JavaScript execution timeout&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Tested in Firefox&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Dependable “median” rendering and functionality&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Together these cover the high and low end of bandwidth, the high and low end of browser feature support, and some of the high and low end of global market share. I’ve also tried to limit this to an “affordable” number of devices.&lt;/p&gt;

&lt;p&gt;I don’t think this replaces a robust device lab or a browser support matrix based on your own company’s stats, but I do think it’s an honest mirror to reflect our work. And covering these bases would make the &lt;a href=&quot;https://github.com/scottjehl/Device-Bugs/issues&quot;&gt;edge cases&lt;/a&gt; more tolerable.&lt;/p&gt;

&lt;p&gt;You can develop your sites however you want, but by giving ourselves limitations we can do away with vanity stats and get an honest look at how our servers, HTML, CSS, and JavaScript frameworks are performing.&lt;/p&gt;

&lt;p&gt;I don’t actually own a Nexus 5X, but if enough people find this reasonable, I’d glady pony up the money for one. Heck, maybe Google can cut us an awesome discount if enough people are interested.&lt;/p&gt;

&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:quote&quot;&gt;
      &lt;p&gt;A neat quote from someone in that meeting is “We’ve done a ton of magic to make scrolling awesome because scrolling is the primary interaction. Also tapping links. Those are the built in interactions the Web gives you… If we scroll and tap on a link, and nothing happens, what have we won?” And I love that. Let’s not break those things. &lt;a href=&quot;#fnref:quote&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
        <pubDate>Thu, 07 Jul 2016 00:00:00 -0500</pubDate>
        <link>http://daverupert.com/2016/07/a-standard-system-of-measurements/</link>
        <guid isPermaLink="true">http://daverupert.com/2016/07/a-standard-system-of-measurements/</guid>
      </item>
    
      <item>
        <title>Ruby on Rails on Bash on Ubuntu on Windows</title>
        <description>&lt;p&gt;After getting &lt;a href=&quot;http://daverupert.com/2016/04/jekyll-on-windows-with-bash/&quot;&gt;Jekyll on Bash on Ubuntu on Windows&lt;/a&gt;&lt;sup id=&quot;fnref:jekyll&quot;&gt;&lt;a href=&quot;#fn:jekyll&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; up and running I said my next challenge was getting Ruby on Rails and I have some good news:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2016/railsonbash.png&quot; alt=&quot;Ruby on Rails welcome screen reporting Linux as the OS&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You’ll see Linux is being reported as the Operating System. That’s because Bash on Ubuntu on Windows &lt;em&gt;is&lt;/em&gt; Linux, just with a few weird compat bugs (but doesn’t normal Linux also have those?).&lt;/p&gt;

&lt;p&gt;Eventually, something like a standard “&lt;a href=&quot;https://gorails.com/setup/ubuntu/16.04&quot;&gt;Install Rails on Ubuntu&lt;/a&gt;” tutorial should work on Bash on Ubuntu on Windows, but at the time of writing neither &lt;code class=&quot;highlighter-rouge&quot;&gt;rbenv&lt;/code&gt; nor &lt;code class=&quot;highlighter-rouge&quot;&gt;rvm&lt;/code&gt; work. Ideally you don’t &lt;code class=&quot;highlighter-rouge&quot;&gt;sudo gem install&lt;/code&gt;, but for this environment everyone who tested needed &lt;code class=&quot;highlighter-rouge&quot;&gt;root&lt;/code&gt; permissions. So here we go…&lt;/p&gt;

&lt;h2 id=&quot;install-the-linux-subsystem&quot;&gt;Install the Linux Subsystem&lt;/h2&gt;

&lt;p&gt;First, you’ll need the Linux subsystem. If you’ve already got it installed, you can skip this.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Update to Windows Insider Fast Track version &amp;gt;14316&lt;/li&gt;
  &lt;li&gt;Settings &amp;gt; Updates &amp;amp; Security &amp;gt; For developers &amp;gt; Check “Developer Mode”&lt;/li&gt;
  &lt;li&gt;Open “Windows Features” (from Cortana) &amp;gt; Check “Windows Subsystem for Linux (Beta)”. Restart.&lt;/li&gt;
  &lt;li&gt;Open Bash.exe for the first time to install Ubuntu.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;install-ruby&quot;&gt;Install Ruby&lt;/h2&gt;

&lt;p&gt;You’ll need to install Ruby 2.3. If you’ve already tried the Jekyll install or done this, you can skip this section.&lt;/p&gt;

&lt;p&gt;First, let’s make sure you’re &lt;code class=&quot;highlighter-rouge&quot;&gt;root&lt;/code&gt; to update and install &lt;code class=&quot;highlighter-rouge&quot;&gt;make&lt;/code&gt; and &lt;code class=&quot;highlighter-rouge&quot;&gt;gcc&lt;/code&gt; compiler:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ sudo -s
$ apt update
$ apt install make gcc
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;You may get &lt;code class=&quot;highlighter-rouge&quot;&gt;E: Sub-process /usr/bin/dpkg returned an error code (1)&lt;/code&gt; errors, while alarming, they don’t prohibit progress. Next, add the Brightbox-maintained Ruby libs (still not sure if this is the best option):&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ apt-add-repository ppa:brightbox/ruby-ng
$ apt update
$ apt install ruby2.3 ruby2.3-dev ruby-switch
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Verify Ruby is installed and/or switch if necessary:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ ruby -v
$ ruby-switch --set ruby2.3
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h2 id=&quot;install-rails-dependencies&quot;&gt;Install Rails Dependencies&lt;/h2&gt;

&lt;p&gt;Rails has a few dependencies you’ll need to install. The most significant of which is Node ( errrrt… record scratch sound effects ) that is used by the Asset Pipeline to uglify JavaScript. If you already have Node 4+, skip this step.&lt;/p&gt;

&lt;p&gt;For Node v4:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -
sudo apt-get install -y nodejs
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;For SQLite3:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;apt install sqlite3 libsqlite3-dev
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;For Nokogiri, Rails’ XML parser, you’ll need some XML libs:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;apt install zlibc zlib1g-dev libxml2 libxml2-dev libxslt1.1 libxslt1-dev
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;At the time of writing, there’s &lt;a href=&quot;https://github.com/sparklemotion/nokogiri/issues/1483&quot;&gt;a Nokogiri bug&lt;/a&gt; in &lt;code class=&quot;highlighter-rouge&quot;&gt;1.6.8&lt;/code&gt; where &lt;code class=&quot;highlighter-rouge&quot;&gt;iconv&lt;/code&gt; tries to install &lt;code class=&quot;highlighter-rouge&quot;&gt;libxml2-2.9.4&lt;/code&gt; and fails. This is happening on Mac and Windows (confirmed). You’ll need to install Nokogiri and force it to use the working version of &lt;code class=&quot;highlighter-rouge&quot;&gt;libxml (2.9.1)&lt;/code&gt; we just installed with &lt;code class=&quot;highlighter-rouge&quot;&gt;apt&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gem install nokogiri -- --use-system-libraries
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Hopefully this saves you some &lt;code class=&quot;highlighter-rouge&quot;&gt;gem install&lt;/code&gt; failure and heartache.&lt;/p&gt;

&lt;h2 id=&quot;install-rails&quot;&gt;Install Rails&lt;/h2&gt;

&lt;p&gt;From here it’s a pretty straight forward Rails app:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ gem install bundler
$ gem install rails --pre
$ rails new testapp
$ cd testapp
$ rails server
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Rails 5.0.0.beta3 should now boot up on &lt;code class=&quot;highlighter-rouge&quot;&gt;http://localhost:3000&lt;/code&gt;. From a cold start on a scaffolded &lt;code class=&quot;highlighter-rouge&quot;&gt;posts#index&lt;/code&gt; with a title and a body, here’s the results:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt; &lt;/th&gt;
      &lt;th&gt;Completed&lt;/th&gt;
      &lt;th&gt;Views&lt;/th&gt;
      &lt;th&gt;ActiveRecord&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Powershell&lt;/td&gt;
      &lt;td&gt;725ms&lt;/td&gt;
      &lt;td&gt;696.2ms&lt;/td&gt;
      &lt;td&gt;1.5ms&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Bash&lt;/td&gt;
      &lt;td&gt;415ms&lt;/td&gt;
      &lt;td&gt;383.3ms&lt;/td&gt;
      &lt;td&gt;2.4ms&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;A 300ms improvement (nearly twice as fast) is wonderful and brings me closer to production server responses.&lt;/p&gt;

&lt;h2 id=&quot;the-year-of-linux-on-the-desktop&quot;&gt;The Year of Linux on the Desktop&lt;/h2&gt;

&lt;p&gt;Let me know if you have problems or I messed up. I’m still learning the ins-and-outs of a third operating system. I used to consider myself very Linux proficient, but not anymore faced with a naked install.&lt;/p&gt;

&lt;p&gt;I’m very much a “Best Practices” guy and would like to be following the most common convention with the minimal amount of effort. For better or for worse, abstractions like &lt;a href=&quot;http://brew.sh/&quot;&gt;Homebrew&lt;/a&gt; numbed me to what was happening behind the scenes. Taking that convenience away has taught me a lot.&lt;/p&gt;

&lt;p&gt;Next step is Postgres, Image Processing with &lt;a href=&quot;https://github.com/thoughtbot/paperclip&quot;&gt;Paperclip&lt;/a&gt;, Authentication with &lt;a href=&quot;https://github.com/plataformatec/devise&quot;&gt;Devise&lt;/a&gt;, and trying to push the limits a bit further.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks to &lt;a href=&quot;https://twitter.com/schneems&quot;&gt;Schneems&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/chrisbalt&quot;&gt;Chris&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/rb30&quot;&gt;James&lt;/a&gt;, and &lt;a href=&quot;https://twitter.com/neverontarget&quot;&gt;Tom&lt;/a&gt; for tech checking this post.&lt;/em&gt;&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:jekyll&quot;&gt;
      &lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; Jekyll on Bash on Ubuntu on Windows is blocked by a &lt;code class=&quot;highlighter-rouge&quot;&gt;libinotify&lt;/code&gt; file watching bug. This affects any file watching task (like Sass) that of Ruby and Node workflows depend on. If you want to do modern web development on Bash on Ubuntu on Windows, &lt;a href=&quot;https://wpdev.uservoice.com/forums/266908-command-prompt-console-bash-on-ubuntu-on-windo/suggestions/13469097-support-for-filesystem-watchers-like-inotify&quot;&gt;please vote it up in User Voice&lt;/a&gt;. &lt;a href=&quot;#fnref:jekyll&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
        <pubDate>Tue, 21 Jun 2016 00:00:00 -0500</pubDate>
        <link>http://daverupert.com/2016/06/ruby-on-rails-on-bash-on-ubuntu-on-windows/</link>
        <guid isPermaLink="true">http://daverupert.com/2016/06/ruby-on-rails-on-bash-on-ubuntu-on-windows/</guid>
      </item>
    
      <item>
        <title>Dave Goes Build</title>
        <description>&lt;p&gt;At the end of March, I was invited out as a part of the &lt;code class=&quot;highlighter-rouge&quot;&gt;#davegoeswindows&lt;/code&gt; experiment to attend Build 2016, the annual Microsoft developer conference. Think WWDC or Google I/O, but for Windows developers. Over three days of keynotes, roundtables, breakout sessions, and an expo I was able to learn from and speak candidly with many people at Microsoft. Most of my questions were centered around the state of software, hardware, and where things are going in the Windows ecosystem.&lt;/p&gt;

&lt;h2 id=&quot;a-new-ceo-a-new-microsoft-a-new-perspective-on-technology&quot;&gt;A New CEO, a New Microsoft, a New Perspective on Technology&lt;/h2&gt;

&lt;p&gt;It all started with CEO Satya Nadella giving the opening keynote on the first day. He started his keynote with three big questions; “Is technology empowering us? Is technology generating wealth? And is technology protecting our privacy?”&lt;/p&gt;

&lt;p&gt;Microsoft has a &lt;a href=&quot;https://www.microsoft.com/en-us/about&quot;&gt;new mission statement&lt;/a&gt; about “empowering every person and every organization to such and such…” It’s a great mission statement. It has words. The best words. But as the keynote went on the biggest impression I received was:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Microsoft’s view of technology seems to be “We want your thing to work with our thing.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I found this view of technology refreshing. I think I’ve gotten tired of Google telling me “This is how you have to build websites now.” Or Apple coming down from the mountain once a year saying “Here are the two new products you will buy this year.”&lt;/p&gt;

&lt;p&gt;To be clear, Microsoft is a for-profit business that wants you to pay money for their consumer and enterprise, cloud-based technologies. But &lt;em&gt;how&lt;/em&gt; they did it was different. Over the course of Build, dozens of new APIs and SDKs were introduced. It was like the entire Microsoft product line was opened up for developer access. It wasn’t some fast-talking salesman approach, it was almost an open source approach; “Here’s this thing, let me know how it works.”&lt;/p&gt;

&lt;p&gt;Microsoft under Nadella is a very different business. In fact, everyone from Microsoft I talked to mentioned this. From the top down they’re encouraged to try new things, even &lt;a href=&quot;https://microsoft.github.io/&quot;&gt;contribute to open source&lt;/a&gt;, which for some long time employees was absolutely a foreign concept. Microsoft is a very different company now.&lt;/p&gt;

&lt;p&gt;In a lot of ways Windows was Bill Gates and Steve Ballmer’s baby in which they could see no flaw and sought to protect. Nadella, however, was in charge of Azure which requires integrating with non-Microsoft products. That subtle change in perspective cascades down, creating a new Microsoft.&lt;/p&gt;

&lt;p&gt;Armed with this new perspective on technology, I further tumbled down the Microsoft family of products at Build. I played with things I had never heard of or already dismissed and I saw things I never thought could exist…&lt;/p&gt;

&lt;h2 id=&quot;bash-on-ubuntu-on-windows&quot;&gt;Bash on Ubuntu on Windows&lt;/h2&gt;

&lt;p&gt;When &lt;a href=&quot;http://www.theverge.com/2016/3/30/11331014/microsoft-windows-linux-ubuntu-bash&quot;&gt;Bash on Ubuntu on Windows&lt;/a&gt; was announced I let out an audible “Holy shit!” I never thought this would happen.&lt;/p&gt;

&lt;p&gt;If there’s one thing I’ve learned from &lt;code class=&quot;highlighter-rouge&quot;&gt;#davegoeswindows&lt;/code&gt; it’s that a lack of a Linux Bash environment makes modern day web development more difficult on Windows. Most tutorials and &lt;code class=&quot;highlighter-rouge&quot;&gt;readme&lt;/code&gt; files for large open source libraries are all written from a Bash point of view, with the occasional hard-dependency on Linux.&lt;/p&gt;

&lt;p&gt;In response to this, the team at Windows have somehow managed to get a complete Ubuntu binary (not a virtual machine) running natively in Windows!&lt;/p&gt;

&lt;p&gt;After the keynote, I got to meet with a very excited John Shewchuk, a Technical Fellow at Microsoft and host of &lt;a href=&quot;https://www.youtube.com/channel/UC_kKGEp9PBQg5SS0foh93eA&quot;&gt;DECODED&lt;/a&gt; (a YouTube show about people who make open source). John knew Build just dropped a bomb on me. I asked about the impetus for such a bold move and his reply was something to the effect of “We know it’s important to a lot of developers.” Again, we we want your thing to work with our thing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But I had to know how well it worked&lt;/strong&gt;. John introduced me to Dustin Kirkland of &lt;a href=&quot;http://www.canonical.com/&quot;&gt;Canonical&lt;/a&gt;, one of the people working on the Bash on Ubuntu on Windows project. He graciously fired up his machine and said “What do you want to try?” And I replied “helloworld in ruby”. We created &lt;code class=&quot;highlighter-rouge&quot;&gt;hello.rb&lt;/code&gt; and I watched Dustin type the following:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# apt install ruby
.. some matrix stuff happened here ..
# ruby hello.rb
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;It just worked. No Stack Overflow articles. No installers to unzip from the web. No binaries being maintained by one person. No mingw. Native ruby running in minutes.&lt;/p&gt;

&lt;p&gt;Bash on Ubuntu on Windows has a way to go, but the future is bright and it’s set to remove a major blocker in my development environment.&lt;/p&gt;

&lt;h2 id=&quot;edge&quot;&gt;Edge&lt;/h2&gt;

&lt;p&gt;I learned a lot about Edge at Build. I’m not sure everyone knows this, but Edge has been my browser of choice for nearly 11 months. I repeat: Browser of choice. To me it looks the best and &lt;em&gt;feels&lt;/em&gt; the fastest. I have to pinch myself every so often that I use the spawn of Internet Explorer for daily browsing and web development, but it works well.&lt;/p&gt;

&lt;p&gt;At the time, Edge had more than 180 million unique users and a growth curve matching that of Chrome’s early days. The good news is Edge is being actively developed with great developer relations and there are lots of new things on the horizon:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Extensions&lt;/li&gt;
  &lt;li&gt;WebRTC&lt;/li&gt;
  &lt;li&gt;Push notifications&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blogs.windows.com/msedgedev/2015/07/23/bringing-automated-testing-to-microsoft-edge-through-webdriver/&quot;&gt;Automated tests through WebDriver&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/speechsynthesis/&quot;&gt;Read webpages to you with the Speech Synthesis API&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blogs.windows.com/msedgedev/2016/04/12/a-world-without-passwords-windows-hello-in-microsoft-edge/&quot;&gt;Log into websites using your face&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The last one was the most impressive. Using the &lt;a href=&quot;http://w3c.github.io/webauthn/&quot;&gt;Web Authentication&lt;/a&gt; specification (formerly the FIDO 2.0 Web API) and &lt;a href=&quot;http://windows.microsoft.com/en-us/windows-10/getstarted-what-is-hello&quot;&gt;Windows Hello&lt;/a&gt;, you will soon be able to log into websites using biometric information like your face or fingerprint.&lt;/p&gt;

&lt;h2 id=&quot;visual-studio-azure-office-and-skype&quot;&gt;Visual Studio, Azure, Office, and Skype&lt;/h2&gt;

&lt;p&gt;Lots of updates to Visual Studio, but the biggest was the &lt;a href=&quot;https://www.xamarin.com/&quot;&gt;Xamarin&lt;/a&gt; acquisition. Xamarin is a cloud-based, cross-platform device testing service that now lives inside Visual Studio. Like Browserstack for native apps.&lt;/p&gt;

&lt;p&gt;I wasn’t extremely impressed until I saw &lt;strong&gt;iOS Simulator running on Windows!&lt;/strong&gt; There was even an Interface Builder-like tool right there in Visual Studio. In some ways testing iOS apps on Windows is &lt;em&gt;better&lt;/em&gt; than on a Mac, since most modern PC laptops have touchscreens you can test touch interactions on without ever leaving your laptop.&lt;/p&gt;

&lt;p&gt;Office Add-ins were another surprise. Lots of people use Office every day (like ~1 billion people) and the good news for Web Developers is these Add-ins can be written in HTML/CSS/JavaScript and run as &lt;a href=&quot;https://dev.outlook.com/MailAppsGettingStarted/GetStarted&quot;&gt;web apps in the native Office clients&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.skype.com/en/developer/&quot;&gt;Skype also announced a slew of new APIs&lt;/a&gt; as it makes the transition over to WebRTC and bot users. Oh yeah… bots, bots, bots.&lt;/p&gt;

&lt;h2 id=&quot;bot-framework&quot;&gt;Bot Framework&lt;/h2&gt;

&lt;p&gt;Microsoft is betting big on bots. So big they designed and built &lt;a href=&quot;https://dev.botframework.com/&quot;&gt;Bot Framework&lt;/a&gt;, an application and framework that helps you build, deploy, give bots language parsing abilities.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=7wNg18NYT6s&quot;&gt;The demo for this was incredible&lt;/a&gt;, a PizzaBot (#FunFact: There are more PizzaBots than humans) that used natural language parsing to map to API endpoints. The linguistic capabilities of the bot were trained using a machine learning interface all with zero lines of code.&lt;/p&gt;

&lt;p&gt;I find the release of Bot Framework incredible because it’s so counter-current to what other bot platforms are doing. Facebook Messenger wants you to build bots for its platform. Slack would rather have you building bots for their platform. But Microsoft is like “Meh, let’s try to make ‘em work everywhere.”&lt;/p&gt;

&lt;p&gt;That’s the style of thinking that I find really refreshing. They’re not just only solving their problem (Skype bots and Cortana extensions) but trying to co-exist in an whole ecosystem of conversational bots and make it easier for developers to be cross-bot-platform.&lt;/p&gt;

&lt;h2 id=&quot;cognitive-services&quot;&gt;Cognitive Services&lt;/h2&gt;

&lt;p&gt;Powering the core strength of the Bot Framework is Microsoft’s &lt;a href=&quot;https://www.microsoft.com/cognitive-services&quot;&gt;Cognitive Services&lt;/a&gt; API that emulate human capabilities like Vision, Speech, Language, and Knowledge. These APIs are the easiest way I’ve come across to leverage the power of machine learning for your application.&lt;/p&gt;

&lt;p&gt;Need to add image recognition and captioning to your app? It’s almost a one liner. Need to detect emotion? It does that too. Don’t have time to figure out Natural Language Processing on your own? Meet &lt;a href=&quot;https://www.microsoft.com/cognitive-services/en-us/language-understanding-intelligent-service-luis&quot;&gt;LUIS&lt;/a&gt;. These APIs are the backbone of the Microsoft apps that have been making the social media rounds: &lt;a href=&quot;https://how-old.net/&quot;&gt;How old am I?&lt;/a&gt; &lt;a href=&quot;https://www.what-dog.net/#&quot;&gt;What dog am I?&lt;/a&gt; &lt;a href=&quot;https://www.celebslike.me/&quot;&gt;Who is my celebrity lookalike?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The majority of demos on the expo floor were using these services as well, but the best demo was in the opening keynote with Saqib Shaikh. Shaikh, a developer at Microsoft, built an application for his smart glasses that takes a picture and using the cognitive services API it will describe back the environment around him.&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/R2mC-NUAmMk&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;What is technology if it doesn’t empower people?&lt;/p&gt;

&lt;h2 id=&quot;ink&quot;&gt;Ink&lt;/h2&gt;

&lt;p&gt;During the opening keynote, Microsoft’s uncomfortably charismatic Bryan Roper (aka “the Fedora Guy”) spent a lot of time talking about Ink. I didn’t think much about styluses until Bryan threw out some interesting data points about pen usage:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;72% of people use a pen for 1hr/day&lt;/li&gt;
  &lt;li&gt;32% of people use a pen for 3hrs/day&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bryan did a good job demonstrating “the power of pen and the PC coming together”, but most impressive of all is you can integrate Ink into your Universal Windows Applications with just 2 lines of XAML&lt;sup id=&quot;fnref:xaml&quot;&gt;&lt;a href=&quot;#fn:xaml&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;lt;InkCanvas x:Name=&quot;myInkCanvas&quot;&amp;gt;&amp;lt;/InkCanvas&amp;gt;
&amp;lt;InkToolbarTargetInkCanvas=&quot;{x:Bind myInkCanvas}&quot;&amp;gt;&amp;lt;/InkToolbar&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;I couldn’t really imagine implementing something like this on the Web, iOS, or Android. Seems like gallons of code to do well, but here it is for free.&lt;/p&gt;

&lt;h2 id=&quot;hololens&quot;&gt;HoloLens&lt;/h2&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Dave goes HoloLens &lt;a href=&quot;https://twitter.com/hashtag/Build2016?src=hash&quot;&gt;#Build2016&lt;/a&gt; &lt;a href=&quot;https://t.co/YBdlvuWr4I&quot;&gt;pic.twitter.com/YBdlvuWr4I&lt;/a&gt;&lt;/p&gt;&amp;mdash; Dave Rupert (@davatron5000) &lt;a href=&quot;https://twitter.com/davatron5000/status/715356769589985280&quot;&gt;March 31, 2016&lt;/a&gt;&lt;/blockquote&gt;

&lt;p&gt;Hell or high water, I was going to put a HoloLens on my big dumb head and after waiting in a few lines, I succeeded! There’s lots to say about this experience and VR/AR/MR in general, but that’s for another post.&lt;/p&gt;

&lt;p&gt;The first impression of the HoloLens is that it’s impossibly light. You put it on your head, twist some knobs, and great sound with no headphones projects into your skull. I think here’s where things went wrong.&lt;/p&gt;

&lt;p&gt;I have a large head (7 ⅞ hat) and glasses and the device never quite fit right. Enough to tarnish my impression.&lt;/p&gt;

&lt;p&gt;The field of view was an issue as well. One common critique of the HoloLens is that it doesn’t extend to your periphery, it’s just a &lt;a href=&quot;http://windowscomments.com/?p=660&quot;&gt;narrow field of view&lt;/a&gt; (120°) in front of you. I think this was compounded by the &lt;em&gt;Destination: Mars&lt;/em&gt; demo.&lt;/p&gt;

&lt;p&gt;Don’t get me wrong, it was amazing to witness Buzz Aldrin walk into the room like a Harry Potter ghost, but you could also see the square outline of the projection in the dark room. It broke the illusion of a seamlessness transition between reality and mixed reality, and felt like I was just watching a movie (which I was). The magic was removed.&lt;/p&gt;

&lt;p&gt;I want to give it another try with a better fitting headset. I think it’d be more impressive in higher light situations.&lt;/p&gt;

&lt;h2 id=&quot;surface-hub&quot;&gt;Surface Hub&lt;/h2&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Dave Goes 84&amp;quot; Wall Mounted TV Computer? &lt;a href=&quot;https://twitter.com/hashtag/Build2016?src=hash&quot;&gt;#Build2016&lt;/a&gt; &lt;a href=&quot;https://t.co/EjZHzIROKJ&quot;&gt;pic.twitter.com/EjZHzIROKJ&lt;/a&gt;&lt;/p&gt;&amp;mdash; Dave Rupert (@davatron5000) &lt;a href=&quot;https://twitter.com/davatron5000/status/715971040308924417&quot;&gt;April 1, 2016&lt;/a&gt;&lt;/blockquote&gt;

&lt;p&gt;Now, I want to go on record and say I care very little for the “How do we design for large screens?” question. But seeing one of these &lt;a href=&quot;https://www.microsoft.com/microsoft-surface-hub/en-us&quot;&gt;wall mounted 84” behemoths&lt;/a&gt; in person, I was curious about what in the design of a Universal (aka Responsive) app didn’t scale to the ultra-large screen.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Controls are either in the center of the screen or repeated on both sides. This allows for less walking back-and-forth while presenting.&lt;/li&gt;
  &lt;li&gt;There are a few “zones” or distances to consider. Imagine a board room with a long table in the middle. There are people close, near, and far away from the screen. This affects type sizes, how small and complex designs can be, etc.&lt;/li&gt;
  &lt;li&gt;Input methods: People closest to the screen can touch, but people towards the back of the room may mirror the screen on their device.&lt;/li&gt;
  &lt;li&gt;Privacy is a major concern. You can’t have a sensitive documents like “PEOPLE_TO_FIRE.xls” lingering on the screen when the next meeting walks in. On the Surface Hub, all data is erased after every session when people leave the room, so developers must be prepared for that. Every time your app runs, it’s like the first time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wanted to hate this monstrosity but it’s actually a pretty good piece of hardware. Infinitely better than most of the heartaches I’ve seen littering conference rooms across the world. The touch responsiveness was uncanny for how many pixels are on the screen. By the end of the conference I wanted one in my office shed and have started scheming in-office co-op applications specific to the hardware.&lt;/p&gt;

&lt;h2 id=&quot;windows-iot&quot;&gt;Windows IoT&lt;/h2&gt;

&lt;p&gt;There was a Smart Mirror at Build. I’ve seen &lt;a href=&quot;http://www.theverge.com/2016/2/2/10898176/diy-idea-weather-mirror-tv-android-google&quot;&gt;Android Smart Mirrors on The Verge&lt;/a&gt; before, they’re cool but the Internet of Things is sometimes creepy so I tend to shy away. I almost didn’t attend, but my need for food landed me nearby a demo.&lt;/p&gt;

&lt;p&gt;Curiously, it was members of the Edge team giving this talk. They invited a member of the audience to get a selfie taken, then he walked in front of the smart mirror, it recognized him, and it greeted him. Wow!&lt;/p&gt;

&lt;p&gt;They mentioned the &lt;a href=&quot;https://github.com/MicrosoftEdge/magic-mirror-demo&quot;&gt;Magic Mirror repo on Github&lt;/a&gt;, I pulled it up dug through the code… it was just a Node app. Then I put it together. The IoT device was just projecting a &lt;a href=&quot;https://microsoftedge.github.io/WebAppsDocs/en-US/win10/HWA.htm&quot;&gt;hosted web app&lt;/a&gt; behind the mirror. White text on a black website. Seeing this got me kind of excited to build embedded web experiences on a Raspberry Pi.&lt;/p&gt;

&lt;p&gt;An interesting limitation of the Raspberry Pi is that it has 200MB of memory (for page size and JS heap), so animations and fancy JavaScript stuff is probably a no-go.&lt;/p&gt;

&lt;h2 id=&quot;thanks-for-having-me-build&quot;&gt;Thanks for having me, Build&lt;/h2&gt;

&lt;p&gt;I want to thank Microsoft for having me out to Build. In private backroom roundtable discussions, I got the chance to talk with and vomit my problems on people who are very good at their job and very respectable. They took the feedback to heart and one VP of Product even said, “This is how we get better.”&lt;/p&gt;

&lt;p&gt;The most important thing is that Microsoft was listening. Again, and I can’t stress this enough, it feels like an entirely new Microsoft. An organizational change of that magnitude is hard, if not impossible to pull off.&lt;/p&gt;

&lt;p&gt;As the Anniversary Edition of Windows 10 approaches I can say without a doubt that things have improved over the last 11 months. It’s great to see software iteratively improve over the course of a year. The new level of transparency and feeling of confidence that comes from Microsoft trying to get “your thing to work on our thing” is better than all the marketing dollars in the world.&lt;/p&gt;

&lt;script async=&quot;&quot; src=&quot;//platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:xaml&quot;&gt;
      &lt;p&gt;XAML is Microsoft’s XML-based user interface markup language, like React but from 2008. &lt;a href=&quot;#fnref:xaml&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
        <pubDate>Thu, 09 Jun 2016 00:00:00 -0500</pubDate>
        <link>http://daverupert.com/2016/06/dave-goes-build/</link>
        <guid isPermaLink="true">http://daverupert.com/2016/06/dave-goes-build/</guid>
      </item>
    
      <item>
        <title>Responsive Product Comparison Tables</title>
        <description>&lt;p&gt;I’m sure it’s not a rare use case, but between working hours I’m a mobile-only user. Young kids mean I need my hands free and not having a laptop in the house has made for better work/life balance. As a result of being mobile-only for half my waking hours, I get the opportunity to see where web designs phoned it in on mobile (&lt;em&gt;pun intended&lt;/em&gt;). I could probably write a whole book&lt;sup id=&quot;fnref:book&quot;&gt;&lt;a href=&quot;#fn:book&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; about where things go wrong, but the summary is designers don’t test their sites on mobile.&lt;/p&gt;

&lt;h2 id=&quot;the-comparison-shopping-problem&quot;&gt;The Comparison Shopping Problem&lt;/h2&gt;

&lt;p&gt;One area that is particularly frustrating is Comparison Shopping. Antithetical to most “mobile contexts” I’ve heard thrown about, I do a lot of comparison shopping for little things (gadgets, gear, design assets, clothing, etc) and big things (cars, computers, home furnishings, etc). It’s never a great experience.&lt;/p&gt;

&lt;p&gt;I should take a step back and explain the issue from a technical level. There are only a few tried and true solutions for dealing with tables in a responsive design:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Do nothing and let the table overflow miserably.&lt;/li&gt;
  &lt;li&gt;Wrap the table in a &lt;code class=&quot;highlighter-rouge&quot;&gt;div&lt;/code&gt; with &lt;code class=&quot;highlighter-rouge&quot;&gt;overflow-x: auto; -webkit-overflow-scrolling: touch;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Stack the table, using pseudo elements each row of the table becomes like a definition list.&lt;/li&gt;
  &lt;li&gt;Add column toggling to the table.&lt;/li&gt;
  &lt;li&gt;Freeze/Fix the left header column and make visible cells swipeable.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The latter three scenarios are covered excellently by &lt;a href=&quot;https://github.com/filamentgroup/tablesaw&quot;&gt;Filament Group’s Tablesaw &lt;/a&gt; library. Most comparison shopping tables opt for the “Stack” option. This is probably a great place to start. I think this works well for smaller data sets but with anything with lots of columns or rows, it becomes an unpassable user experience; rows bleed into rows and it’s difficult to understand the context of the data.&lt;/p&gt;

&lt;p&gt;I’m not the only one who has felt this problem:&lt;/p&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Is there a Wikipedia for open, standardized, and crowd sourced product comparison tables?&lt;a href=&quot;https://t.co/EkHEMNluj5&quot;&gt;https://t.co/EkHEMNluj5&lt;/a&gt;&lt;a href=&quot;https://t.co/NxLw1yqPxl&quot;&gt;https://t.co/NxLw1yqPxl&lt;/a&gt;&lt;/p&gt;&amp;mdash; Adam Michela (@soopa) &lt;a href=&quot;https://twitter.com/soopa/status/732957152432652288&quot;&gt;May 18, 2016&lt;/a&gt;&lt;/blockquote&gt;

&lt;p&gt;Of the two links Soopa mentions, one is unusable on mobile and one just gives up entirely and hides the pricing and comparison tables (the only feature on the page).&lt;/p&gt;

&lt;h2 id=&quot;workshopping-a-solution&quot;&gt;Workshopping a Solution&lt;/h2&gt;

&lt;p&gt;Frustrated, I took a stab at fixing this one particular component. UX and accessibility can be improved, feel free to modify and rebound as necessary.&lt;/p&gt;

&lt;p data-height=&quot;402&quot; data-theme-id=&quot;11781&quot; data-slug-hash=&quot;XdwLbp&quot; data-default-tab=&quot;result&quot; data-user=&quot;davatron5000&quot; data-embed-version=&quot;2&quot; class=&quot;codepen&quot;&gt;See the Pen &lt;a href=&quot;http://codepen.io/davatron5000/pen/XdwLbp/&quot;&gt;Responsive Product Comparison Table&lt;/a&gt; by Dave Rupert (&lt;a href=&quot;http://codepen.io/davatron5000&quot;&gt;@davatron5000&lt;/a&gt;) on &lt;a href=&quot;http://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;At smaller breakpoints, the table becomes a carousel of cards. It’s similar to the Swipe solution from Tablesaw, except this presents one column of data at a time and stacks the row header above the data cell. The problem I think this solves is getting all the information about a single product in a single view. I can fix my eyes on one row and cycle through features I care about.&lt;/p&gt;

&lt;p&gt;Some guy named Ethan on Twitter mentioned that SBNation has a similar pattern for their playoff brackets:&lt;/p&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; data-conversation=&quot;none&quot; data-cards=&quot;hidden&quot; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;&lt;a href=&quot;https://twitter.com/davatron5000&quot;&gt;@davatron5000&lt;/a&gt; I mean, SB Nation’s done that with their brackets. (&lt;a href=&quot;https://t.co/b9lQQEyfWy&quot;&gt;https://t.co/b9lQQEyfWy&lt;/a&gt;) Makes perfect sense.&lt;/p&gt;&amp;mdash; Ethan Marcotte (@beep) &lt;a href=&quot;https://twitter.com/beep/status/733005006782271488&quot;&gt;May 18, 2016&lt;/a&gt;&lt;/blockquote&gt;

&lt;p&gt;And that leads me to the main point I’d like to make…&lt;/p&gt;

&lt;h2 id=&quot;different-patterns-for-different-content&quot;&gt;Different Patterns for Different Content&lt;/h2&gt;

&lt;p&gt;We’ve done a great job pattern-izing our designs into reusable components, but patterns need to suit the content. Not all content serves the same purpose and therefore deserves different treatments. I harked on this in &lt;a href=&quot;http://daverupert.com/2016/04/lists-details-and-flows/&quot;&gt;a recent post&lt;/a&gt;, but a list of movies and a list of coupons should function and look completely different. Similarly, some tables you navigate by the column headers, other by the row headers, others require both to make sense.&lt;/p&gt;

&lt;p&gt;As a larger design community, &lt;a href=&quot;https://twitter.com/jongold/status/694591217523363840&quot;&gt;we tend to glom onto existing patterns and trends&lt;/a&gt; without regard as to why. We inject card interfaces without considering if that metaphor applies to the content. We overload our marketing pages with saccharine eye candy, burying the lead on our billboard websites.&lt;/p&gt;

&lt;p&gt;I’d love to see and read about more hyper-specific solutions that cater to specific content. I recently spent over a year thinking about responsive online coupons, not very exciting but very thought-provoking.&lt;/p&gt;

&lt;p&gt;Using prefabricated, road tested solutions from Apple’s Human Interface Guidelines, Google’s Material Design, Twitter’s Bootstrap, and Brad Frost’s &lt;a href=&quot;http://bradfrost.github.io/this-is-responsive/patterns.html&quot;&gt;Responsive Patterns&lt;/a&gt; is always a good place to start, but don’t settle there. My biggest advice would be to turn off the 27” display and use your sites and projects on your phone, there’s lots of low hanging fruit that could give way to new patterns, tailor-suited to your content.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:book&quot;&gt;
      &lt;p&gt;I’m happy to announce my new book &lt;em&gt;Mobile Faux Pas&lt;/em&gt; coming soon on A Book Apart! &lt;a href=&quot;#fnref:book&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
        <pubDate>Fri, 27 May 2016 00:00:00 -0500</pubDate>
        <link>http://daverupert.com/2016/05/responsive-comparison-tables/</link>
        <guid isPermaLink="true">http://daverupert.com/2016/05/responsive-comparison-tables/</guid>
      </item>
    
      <item>
        <title>Alternate Realities</title>
        <description>&lt;p&gt;Over the past 9 months, I’ve been exploring what alternatives exist to the lackluster reality of &lt;a href=&quot;http://daverupert.com/2016/04/lists-details-and-flows/&quot;&gt;Lists, Details, and Flows&lt;/a&gt;, a personal journey to cure my boredom. New frameworks, switching programming languages, and changing build tools every 6 weeks keeps me on my toes; but what I really seek are new ways to express content.&lt;/p&gt;

&lt;p&gt;Here are a handful directions and technologies I’ve explored…&lt;/p&gt;

&lt;h3 id=&quot;react&quot;&gt;React?&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://twitter.com/wesbos/status/598144948559605760&quot;&gt;I heard React was good&lt;/a&gt; and I was so impressed by Wes Bos’ &lt;a href=&quot;https://reactforbeginners.com/&quot;&gt;React for Beginners&lt;/a&gt; course that I’ve started a few projects using it. There are a lot of strengths and &lt;a href=&quot;https://twitter.com/davatron5000/status/724682758866391042&quot;&gt;weaknesses&lt;/a&gt; with React that would take me months to un-(web)pack, but what I really like is the “real-time’y’ness” of it all.&lt;/p&gt;

&lt;p&gt;The React+Firebase combination that Wes demonstrates makes it incredibly easy to start daydreaming about real-time applications. The output is still Lists and Details, but real-time adds another dimension to designing and developing. If I had to pick a “future” or even “present future” of the web, I think the real-time aspect – regardless of how pedantic you want to be about frameworks vs vanilla JavaScript – is what the web ultimately wants to be.&lt;/p&gt;

&lt;p&gt;React’s approach to state management and self-updating components are groundbreaking, but also a lotta action to get up and running. I’m optimistic about the future of web applications.&lt;/p&gt;

&lt;h3 id=&quot;new-data-structures&quot;&gt;New data structures?&lt;/h3&gt;
&lt;p&gt;Spending a lot of time in document-based databases, I began to wonder if our typical key/value pair system of storing data (in objects and arrays) might be the cause of mundanity of lists and details. Maybe how we store data… affects how we collect and fetch data… affects how we present data.&lt;/p&gt;

&lt;p&gt;GraphDBs are probably what I’m craving. If you’ve seen a graph visualization (e.g. a social graph), you’ll know they do a great job at illuminating relationships in content.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2016/social-graph.jpg&quot; alt=&quot;Sample image of a social graph&quot; /&gt;&lt;/p&gt;

&lt;p&gt;They can be beautiful, but there’s not a huge emotional response to a bunch of tethered nodes unless you’re a data scientist. That data can be used to render better, more relevant content but it would still likely exist in some kind of List view.&lt;/p&gt;

&lt;p&gt;This path hasn’t taken me very far.&lt;/p&gt;

&lt;h3 id=&quot;svg-animations&quot;&gt;SVG animations?&lt;/h3&gt;
&lt;p&gt;While skimming graphic design books at a bookstore, my mind wondered as it usually does to how this applies to the web. Great print design has a few recurring themes (again, being over-reductive): imagery, playing inside fixed dimensions, with type set to masterfully interact with and balance the art.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2016/saul-bass.jpg&quot; alt=&quot;Collection of Saul Bass posters&quot; /&gt;&lt;/p&gt;

&lt;p&gt;As I thumbed through page after page of this, I realized the web has almost the opposite set of limitations. Images can be dynamic (gifs/video) or scripted, device dimensions are unknown, and &lt;a href=&quot;https://twitter.com/TrentWalton/status/512690657924620288&quot;&gt;type and imagery on the web have a clumsy relationship and often don’t couple well&lt;/a&gt;. Some of the structures that make for great graphic design almost make for bad web design.&lt;/p&gt;

&lt;p&gt;After hearing great talks from Sarah Drasner, Brenna O’Brien, Val Head, and others about animation at CSSDevConf, I decided to try my hand at animating SVGs.&lt;/p&gt;

&lt;p&gt;SVG animations are exciting! Frameworks like &lt;a href=&quot;http://greensock.com/gsap&quot;&gt;GSAP&lt;/a&gt; lower the bar and make complex animations easy to code, even for Math-ophobes. &lt;a href=&quot;http://codepen.io/davatron5000/full/meNOqK&quot;&gt;I’ve toyed with a few animations&lt;/a&gt; and I really see well crafted SVGs becoming the future of Art Direction on the web. Here’s an beautiful example from &lt;a href=&quot;http://codepen.io/grayghostvisuals&quot;&gt;Dennis Gaebel&lt;/a&gt;:&lt;/p&gt;

&lt;p data-height=&quot;640&quot; data-theme-id=&quot;11781&quot; data-slug-hash=&quot;dGKgKP&quot; data-default-tab=&quot;result&quot; data-user=&quot;grayghostvisuals&quot; data-embed-version=&quot;2&quot; class=&quot;codepen&quot;&gt;See the Pen &lt;a href=&quot;http://codepen.io/grayghostvisuals/pen/dGKgKP&quot;&gt;Underneath&lt;/a&gt; by GRAY GHOST (&lt;a href=&quot;http://codepen.io/grayghostvisuals&quot;&gt;@grayghostvisuals&lt;/a&gt;) on &lt;a href=&quot;http://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.polygon.com/a/xbox-one-review&quot;&gt;Simple animations&lt;/a&gt; with a smidge of interactivity can add delight and I think this is something the web could be &lt;del&gt;good&lt;/del&gt; &lt;ins&gt;better&lt;/ins&gt; at when compared to its print-based predecessors. Using Saul Bass as an example, the web can be closer to designing opening credits than designing a movie poster.&lt;/p&gt;

&lt;h3 id=&quot;bots&quot;&gt;Bots?&lt;/h3&gt;

&lt;p&gt;Bots and conversational UIs (aka, “No UIs”) are interesting territory. There is lots of “Bots are the new Apps” hype, so maybe removing the interface entirely can cure my interface boredom!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2016/bots.gif&quot; alt=&quot;Drunk Uncle from SNL saying Bots Bots Bots&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Fortunately I’ve been able to tinker with Slack bots for the past couple months and form quite a few opinions. While bots are a lot of fun to program, it seems they mostly just serve as a proxy for these Lists, Details, and Flows on the web.&lt;/p&gt;

&lt;p&gt;A &lt;code class=&quot;highlighter-rouge&quot;&gt;/command&lt;/code&gt; typically fetches data from a list or detail view, often just a single component from the more complex webview. A “conversation” with a bot is just a line-by-line abstraction of a “wizard” or “flow”, often more obtuse.&lt;/p&gt;

&lt;p&gt;Integrations are powerful tools and I think bots have the ability to impart a powerful (magical) feeling when a somewhat complex task is automated through a very short command. Bots may be the worst way to order a pizza, but I think there’s a lot of mundane tasks waiting to be optimized in large companies. “Bots are the new Intranet” is maybe a more accurate statement.&lt;/p&gt;

&lt;h3 id=&quot;video-games&quot;&gt;Video games?&lt;/h3&gt;

&lt;p&gt;In my (limited) spare time I’ve started &lt;a href=&quot;http://daverupert.com/2015/10/making-a-video-game/&quot;&gt;making a video game&lt;/a&gt; in Unity. This has been rewarding because it’s a very different kind of programming compared to the web. Objects can spawn objects that have the power to destroy each other! There’s nothing like that in web/app/product development.&lt;/p&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;TEH MONSTERS&amp;gt; THEY SPAWN &lt;a href=&quot;https://t.co/vGlyTIrETy&quot;&gt;pic.twitter.com/vGlyTIrETy&lt;/a&gt;&lt;/p&gt;&amp;mdash; Dave Rupert (@davatron5000) &lt;a href=&quot;https://twitter.com/davatron5000/status/694654703062220801&quot;&gt;February 2, 2016&lt;/a&gt;&lt;/blockquote&gt;

&lt;p&gt;The “World Building” aspect of making video games is incredible. In a couple hours I can have a first-person camera walking around a rudimentary scene. I haven’t felt that thrill of creating in a long time.&lt;/p&gt;

&lt;p&gt;I owe this blog more updates about the progress on this game. What I can say now is that it’s a Cartoon Horror Survival game with a focus on two player local co-op.&lt;/p&gt;

&lt;h2 id=&quot;webvr&quot;&gt;WebVR?&lt;/h2&gt;

&lt;p&gt;Like bots, VR is also super hyped up right now. After a few conversations with VR-believers, my curiosity was piqued. Along the lines of “world building”, VR and MR can blur the lines between reality and the impossible. One of my favorite VR demos is Timoni West showing Unity’s new VR Editor tool that allows you to make video games from within the video game you’re making! Inception!&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/FzjxRi5J4XI&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;I have the same reservations as everyone else; that isolating yourself in a facemask is just too weird for mass consumption. But when I see things like the whale in that video, my body involuntarily releases endorphins of wonder and I fall into VR’s trap.&lt;/p&gt;

&lt;p&gt;WebVR is particularly interesting because no one has figured it out yet. How do we use the web in VR? What does &lt;em&gt;my&lt;/em&gt; website look like in VR? Other than “Keep a high FPS so people don’t barf,” there aren’t really any rules. It might be the “junior varsity” version of VR, but I see a lot of creative potential for WebVR experiences in a Cardboard. Best of all, it’s not as complicated as you might imagine.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2016/aframe.png&quot; alt=&quot;Screenshot of the the aframe.io homepage&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://aframe.io/&quot;&gt;A-frame&lt;/a&gt; is an easy-to-use framework that allows you to create a VR environment, even in a CodePen. Then throw your phone into a (Free~$20) Cardboard viewer and marvel at the new universe you created with just a few lines of HTML. No Cardboard? That’s okay, you can make it fullscreen on your computer and walk around using the &lt;code class=&quot;highlighter-rouge&quot;&gt;W&lt;/code&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;A&lt;/code&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;S&lt;/code&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;D&lt;/code&gt; keys. It’s like Progressive Enhancement for VR.&lt;/p&gt;

&lt;p&gt;I have lots of thoughts on VR swirling around in my head, so if you want to drunkenly ramble about it in a bar let me know. “VR is the Future” is maybe overselling, but “VR is fun” is certain and my two year old son demands it whenever he comes into my office.&lt;/p&gt;

&lt;h2 id=&quot;so&quot;&gt;So…&lt;/h2&gt;

&lt;p&gt;That’s all I got. React is a lotta action, data structures aren’t that compelling, SVG Animations are a neat trick, Bots are okay, Video games are thrilling, and VR is fun. Again, maybe information wants to exist in Lists, Details, and Flows; and trying to imagine otherwise is futile but I’ve enjoyed my explorations thus far.&lt;/p&gt;

&lt;p&gt;I’d love to hear what others are exploring in terms of creating different ways to experience content. Great examples, best practices, anything. I would love to see them and read about them.&lt;/p&gt;

&lt;p&gt;Before I go, if you’re interested in more SVG Animation stuff (you should be), here’s an incomplete list of links and people to follow:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://codepen.io/grayghostvisuals/&quot;&gt;http://codepen.io/grayghostvisuals/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://codepen.io/sdras/&quot;&gt;http://codepen.io/sdras/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://codepen.io/tmrDevelops&quot;&gt;http://codepen.io/tmrDevelops&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://codepen.io/jessenwells/&quot;&gt;http://codepen.io/jessenwells/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://codepen.io/Mamboleoo/&quot;&gt;http://codepen.io/Mamboleoo/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://codepen.io/collection/yivpx/&quot;&gt;http://codepen.io/collection/yivpx/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://codepen.io/collection/DBNjgM/&quot;&gt;http://codepen.io/collection/DBNjgM/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;script async=&quot;&quot; src=&quot;//platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;script async=&quot;&quot; src=&quot;//assets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;

</description>
        <pubDate>Fri, 13 May 2016 00:00:00 -0500</pubDate>
        <link>http://daverupert.com/2016/05/alternate-realities/</link>
        <guid isPermaLink="true">http://daverupert.com/2016/05/alternate-realities/</guid>
      </item>
    
      <item>
        <title>Lists, Details, and Flows</title>
        <description>&lt;p&gt;I’ve become a bit discontented. In a fit of base reductionism, my brain has begun boiling down digital design (apps/web/product/interface/etc, all the same thing) into to three types of designs: lists, details, and flows.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Lists&lt;/strong&gt; are lists of things; collections that contain items. Often a homepage is a glorified list; a melting pot of lists even. “Indexes” or “Dashboards” we sometimes call them. A carousel is a horizontal list, shown one item at a time. Lists often take you to details.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Details&lt;/strong&gt; zoom-in on a single item. These can be read-only or editable textboxes. Maybe there are some fancy charts and graphs. Details often contain more lists that link you to more details.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Flows&lt;/strong&gt; are unique multiscreen bridges taking you from point A to point B. It could be a transactional checkout, where each screen has a digestible amount of editable details. Or it could be a wizard, a list of digestible content bites.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’m sure there’s a Human Computer Interaction book I’ve never heard of that talks about this, but in my mind Apple’s &lt;a href=&quot;https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/MobileHIG/index.html&quot;&gt;iOS Human Interface Guidelines&lt;/a&gt; deserves a lot of credit for distilling these simple, modern digital design concepts. Not only did this document prepare us to design for the mobilpocalypse, but it illustrated these views very well and also shipped with prefab components to build them out.&lt;/p&gt;

&lt;p&gt;Nothing is new under the sun however, WordPress has had this view structure with &lt;code class=&quot;highlighter-rouge&quot;&gt;index&lt;/code&gt; and &lt;code class=&quot;highlighter-rouge&quot;&gt;single&lt;/code&gt; views for quite some time. Rails too has scaffold &lt;code class=&quot;highlighter-rouge&quot;&gt;index&lt;/code&gt; and &lt;code class=&quot;highlighter-rouge&quot;&gt;show&lt;/code&gt; views. This pattern is possibly as old as software. Maybe as old as Kingdom-Phylum class ordering or books having a Table of Contents.&lt;/p&gt;

&lt;p&gt;Maybe this is why websites all look the same? I don’t think sameness is inherently bad, it seems like we’re following &lt;a href=&quot;http://frankchimero.com/writing/the-webs-grain/&quot;&gt;the Web’s grain&lt;/a&gt;. Or, even more rudimentary, maybe this is the shape that information wants to exist.&lt;/p&gt;

&lt;p&gt;Things don’t have to look the same either. There is a lot of freedom in these large buckets. Netflix is a list of movies and RetailMeNot is a list of coupons; they’re both lists yet they should probably look different. The design of the components should suit the content.&lt;/p&gt;

&lt;p&gt;But if I’m honest with myself, reducing things down sort of ruined some of the magic of building websites. Once seen, it’s hard to un-see. In a lot of ways, the romance is gone now and I feel like I’m married to these three views over and over for the rest of my career.&lt;/p&gt;

&lt;p&gt;Once that realization sets in, you spend the rest of your time wondering how we’ve collectively made everything so difficult if everything is always the same.&lt;/p&gt;
</description>
        <pubDate>Tue, 19 Apr 2016 00:00:00 -0500</pubDate>
        <link>http://daverupert.com/2016/04/lists-details-and-flows/</link>
        <guid isPermaLink="true">http://daverupert.com/2016/04/lists-details-and-flows/</guid>
      </item>
    
      <item>
        <title>Jekyll on Bash on Ubuntu on Windows</title>
        <description>&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; Jekyll on Bash on Ubuntu on Windows is blocked by a &lt;code class=&quot;highlighter-rouge&quot;&gt;libinotify&lt;/code&gt; file watching bug. This affects any file watching task (like Sass) that of Ruby and Node workflows depend on. If you want to do modern web development on Bash on Ubuntu on Windows, &lt;a href=&quot;https://wpdev.uservoice.com/forums/266908-command-prompt-console-bash-on-ubuntu-on-windo/suggestions/13469097-support-for-filesystem-watchers-like-inotify&quot;&gt;please vote it up in User Voice&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2016/jekyll-windows-bash.png&quot; alt=&quot;Screenshot of Jekyll commands running in Bash on Windows&quot; /&gt;&lt;/p&gt;

&lt;p&gt;When Bash on Windows was announced at &lt;a href=&quot;http://build.microsoft.com/&quot;&gt;Build2016&lt;/a&gt; this year I let out an audible “Holy Shit!” from the front row. This is a major turning point for Windows and also the #davegoeswindows experiment. Not having access to a Linux shell has been my biggest pain point, both from a software compatibility perspective and a creature of comfort standpoint.&lt;/p&gt;

&lt;p&gt;With Bash landing in this week’s Insider Fast Track update, I installed Bash for Windows as quickly as possible. In order to test its mettle, I decided to pick one of the critical pieces of my workflow: Jekyll.&lt;/p&gt;

&lt;h2 id=&quot;install-the-linux-subsystem&quot;&gt;Install the Linux Subsystem&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;Update to Windows Insider Fast Track version &amp;gt;14316&lt;/li&gt;
  &lt;li&gt;Settings &amp;gt; Updates &amp;amp; Security &amp;gt; For developers &amp;gt; Check “Developer Mode”&lt;/li&gt;
  &lt;li&gt;Open “Windows Features” (from Cortana) &amp;gt; Check “Windows Subsystem for Linux (Beta)”. Restart.&lt;/li&gt;
  &lt;li&gt;Open &lt;code class=&quot;highlighter-rouge&quot;&gt;Bash.exe&lt;/code&gt; for the first time to install Ubuntu.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is where things get a little weird. You’re using Ubuntu on Windows, and that’s great, but there’s nothing there. It’s a complete ghost town and there aren’t really blog posts yet about getting your Bash on Windows environment up and running. So you have to install everything, even &lt;code class=&quot;highlighter-rouge&quot;&gt;make&lt;/code&gt; and &lt;code class=&quot;highlighter-rouge&quot;&gt;gcc&lt;/code&gt;, from scratch.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ sudo -s
$ apt update
$ apt install make gcc
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h2 id=&quot;install-ruby&quot;&gt;Install Ruby&lt;/h2&gt;

&lt;p&gt;I tried installing Ruby via the stock &lt;code class=&quot;highlighter-rouge&quot;&gt;apt install ruby&lt;/code&gt;, but that only pulled an outdated ruby1.9.3. Jekyll needs at least 2.0 and the latest stable release is ruby2.3.0. I tried using &lt;a href=&quot;https://rvm.io/&quot;&gt;rvm&lt;/a&gt; and &lt;a href=&quot;https://github.com/rbenv/rbenv&quot;&gt;rbenv&lt;/a&gt; but neither of those worked, each had their own different problem. I decided to use a &lt;a href=&quot;https://www.brightbox.com/docs/ruby/ubuntu/&quot;&gt;Brightbox managed Ruby package for Ubuntu&lt;/a&gt;. No idea if this is secure or the Ubuntu way™, but the website seems clean and up-to-date, so…&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ apt-add-repository ppa:brightbox/ruby-ng
$ apt update
$ apt install ruby2.3 ruby2.3-dev ruby-switch
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Everything should be installed and setup, but it feels good to verify. If it is messed up, &lt;code class=&quot;highlighter-rouge&quot;&gt;ruby-switch&lt;/code&gt; is a nice little app that replaces both &lt;code class=&quot;highlighter-rouge&quot;&gt;rvm&lt;/code&gt; and &lt;code class=&quot;highlighter-rouge&quot;&gt;rbenv&lt;/code&gt; and in my limited experience, does a way better job.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ ruby -v
$ ruby-switch --set ruby2.3
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h2 id=&quot;install-jekyll&quot;&gt;Install Jekyll&lt;/h2&gt;

&lt;p&gt;And now, for the Final Boss Battle. This couldn’t be easier. This is straight ruby’ing. No special hacks. Notice the &lt;code class=&quot;highlighter-rouge&quot;&gt;/mnt/c/&lt;/code&gt; in that directory path. That’s a mapping to your &lt;code class=&quot;highlighter-rouge&quot;&gt;C:\&lt;/code&gt; drive. From there, you have access to all your files just as God intended.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ gem install jekyll
$ cd /mnt/c/Users/&amp;lt;your username&amp;gt;/Desktop
$ jekyll new myblog &amp;amp;&amp;amp; cd myblog
$ jekyll serve -w
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;It’s working. And it’s FAST! Way faster than Ruby for Windows. Jekyll on Bash completed in &lt;code class=&quot;highlighter-rouge&quot;&gt;0.329s&lt;/code&gt;, Jekyll on PowerShell takes &lt;code class=&quot;highlighter-rouge&quot;&gt;0.364s&lt;/code&gt; but has a 5 second latency starting up. Jekyll on Bash was also 3x faster on &lt;code class=&quot;highlighter-rouge&quot;&gt;--watch&lt;/code&gt; compilations as well.&lt;/p&gt;

&lt;p&gt;From here I’ve been able to install Jekyll plugins I like to use like &lt;a href=&quot;https://github.com/jekyll/jekyll-compose&quot;&gt;Jekyll::Compose&lt;/a&gt; and &lt;a href=&quot;https://github.com/jekyll/jekyll-archives&quot;&gt;Jekyll::Archives&lt;/a&gt; and they’re working as expected.&lt;/p&gt;

&lt;h2 id=&quot;final-notes&quot;&gt;Final Notes&lt;/h2&gt;
&lt;p&gt;I’m sold. I’m drinking the delicious Kool-Aid. I couldn’t be happier getting this portion of my workflow up and running on my PC. While the lack of documentation is daunting, the State of the Union is good and it has a wild west vibe to it. Next stop: Compiling and deploying this blog with &lt;code class=&quot;highlighter-rouge&quot;&gt;rsync&lt;/code&gt;, then a full Rails application with Devise authentication.&lt;/p&gt;
</description>
        <pubDate>Fri, 08 Apr 2016 00:00:00 -0500</pubDate>
        <link>http://daverupert.com/2016/04/jekyll-on-windows-with-bash/</link>
        <guid isPermaLink="true">http://daverupert.com/2016/04/jekyll-on-windows-with-bash/</guid>
      </item>
    
  </channel>
</rss>

