<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>devinhenkel</title>
	<atom:link href="https://devinhenkel.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://devinhenkel.com</link>
	<description>useful, usable, compelling.</description>
	<lastBuildDate>Sat, 19 Sep 2020 00:47:16 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>
	<item>
		<title>Your Privacy Is Now A Commodity</title>
		<link>https://devinhenkel.com/what-the/your-privacy-is-now-a-commodity/</link>
					<comments>https://devinhenkel.com/what-the/your-privacy-is-now-a-commodity/#respond</comments>
		
		<dc:creator><![CDATA[Devin Henkel]]></dc:creator>
		<pubDate>Sat, 01 Apr 2017 03:32:19 +0000</pubDate>
				<category><![CDATA[Interrobang]]></category>
		<category><![CDATA[Data Privacy]]></category>
		<category><![CDATA[FCC]]></category>
		<category><![CDATA[Policy]]></category>
		<category><![CDATA[Privacy]]></category>
		<guid isPermaLink="false">http://devinhenkel.com/?p=3259</guid>

					<description><![CDATA[This week, Congress voted to repeal internet privacy regulations established by the Obama administration. The outrage was swift and severe. And rightfully so; it&#8217;s difficult to see how this benefits the average citizen at all. It also seems pretty clear that the ISPs were lining the campaign chests of Republican representatives to make it happen. [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>This week, Congress <a href="http://money.cnn.com/2017/03/28/technology/house-internet-privacy-repeal/?iid=EL">voted to repeal internet privacy regulations</a> established by the Obama administration. The outrage was swift and severe. And rightfully so; it&#8217;s difficult to see how this benefits the average citizen at all. It also seems pretty clear that the ISPs were <a href="http://www.theverge.com/2017/3/29/15100620/congress-fcc-isp-web-browsing-privacy-fire-sale">lining the campaign chests of Republican representatives</a> to make it happen.</p>
<p>What they&#8217;ve done is make it so you have to buy back your privacy. I <a href="http://devinhenkel.com/what-the/prediction-facebook-will-sell-you-back-your-privacy/">blogged about this</a> back in 2010, although I predicted it would be Facebook who would create the Privacy Marketplace. I should have seen that it would move further upstream to the ISPs. I mean, it makes sense&#8230; Your ISP knows everything you&#8217;ve been up to (including Facebook activity), so that&#8217;s where the most valuable data is going to be. What Congress did this week was essentially grant ownership of that data&#8230; YOUR data&#8230; to your ISP.</p>
<p>AT&amp;T used to offer a plan at a reduced cost if the user opted to allow their data to be used. Now, they don&#8217;t need to. Congress has given them the right to use your data without your permission. Now, they can charge you to keep your data private. To me, this seems tantamount to renting a hotel room and when you get there, they tell you that it will be extra to get drapes and a door.</p>
<p>A more productive structure would be to establish personal ownership of browsing data and make it so providers have to buy access to it. It only makes sense that you own the digital exhaust that you create. If that&#8217;s worth something to someone, there should be a fair market value for that data &#8211; and you should be compensated for it.</p>
<h3>What you can do about it</h3>
<p>You could use something like the <a href="https://www.torproject.org/projects/torbrowser.html.en">Tor Browser</a> or <a href="https://duckduckgo.com">DuckDuckGo</a> for searching and this keeps your activity somewhat more private, but your ISP knows every site you hit as well as any URL encoded parameters you pass (like a Google search query for &#8220;kittens&#8221;: https://www.google.com/q=<em>kittens,</em> and the DuckDuckGo equivalent: https://duckduckgo.com/?q=<em>kittens</em>). DuckDuckGo won&#8217;t track you or sell your data to marketers, but your ISP will have that URL to know you searched for kittens and market <a href="https://www.fancyfeast.com/">Fancy Feast</a> to you. Tor is a bit better in that it does quite a bit to obfuscate your activity, but your ISP could still track the initial traffic through the cable modem in your house.</p>
<p>Until (and unless) Congress puts protections back in place to make your data your own, your best bet to keep your activity private by <a href="http://www.instructables.com/id/Host-Your-Own-Virtual-Private-Network-VPN-with-O/">setting up your own VPN</a>. That way, your ISP will only see traffic to one URL. Beyond that, your VPN will control your internet traffic beyond the prying eyes (and sales departments) of your ISP. It might seem intimidating, but if you follow the directions it&#8217;s actually pretty straightforward to accomplish.</p>
<p>The biggest thing we can do about it is to keep up the pressure on our legislators and let them know that we don&#8217;t approve. No matter your political affiliation, there are ways to find your Representatives, and Senators, like <a href="http://whoismyrepresentative.com/">this one</a>. Make sure to call them to say that you&#8217;re not in favor of the government granting ownership of your data to the ISPs.</p>
<p>If we don&#8217;t fight to keep our privacy, the financial interests will certainly take it.</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://devinhenkel.com/what-the/your-privacy-is-now-a-commodity/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Algolia is Back</title>
		<link>https://devinhenkel.com/compelling/algolia-is-back/</link>
					<comments>https://devinhenkel.com/compelling/algolia-is-back/#respond</comments>
		
		<dc:creator><![CDATA[Devin Henkel]]></dc:creator>
		<pubDate>Fri, 30 Sep 2016 00:26:54 +0000</pubDate>
				<category><![CDATA[Compelling]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Algolia]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[search]]></category>
		<guid isPermaLink="false">http://devinhenkel.com/?p=1917</guid>

					<description><![CDATA[A while back, I wrote about a super-powered cloud-based search, Algolia. I loved it while I was able to use it, but my trial expired and the price tag was abit steep for a personal blog. I reverted to Dave&#8217;s WordPress Live Search, which did a great job, but didn&#8217;t have all the bells and [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img fetchpriority="high" decoding="async" class=" wp-image-1967 alignright colorbox-1917" src="http://devinhenkel.com/wp-content/uploads/2016/09/devinhenkel_–_useful__usable__compelling_.png" alt="devinhenkel_-_useful__usable__compelling_" width="208" height="1060" /></p>
<p>A while back, I wrote about a <a href="http://devinhenkel.com/compelling/algiolia-super-powered-search-in-the-cloud-made-simple/" target="_blank">super-powered cloud-based search</a>, Algolia. I loved it while I was able to use it, but my trial expired and the price tag was abit steep for a personal blog. I reverted to <a href="https://wordpress.org/plugins/daves-wordpress-live-search/" target="_blank">Dave&#8217;s WordPress Live Search</a>, which did a great job, but didn&#8217;t have all the bells and whistles of Algolia.</p>
<p>Today, I received an email from the <a href="https://www.algolia.com/" target="_blank">Algolia</a> team announcing <a href="https://community.algolia.com/wordpress/" target="_blank">Algolia Search for WordPress</a>. This made me happy. I wasted no time installing the plugin. After logging in to my Algolia dashboard, I copied and pasted my API keys into the Algolia Settings and it kicked off an index. The results were available almost immediately.</p>
<p>&nbsp;</p>
<p>Algolia gives you control over several aspects of the behavior:</p>
<p><a href="http://devinhenkel.com/wp-content/uploads/2016/09/Autocomplete_‹_devinhenkel_—_WordPress.png"><img decoding="async" class="wp-image-1943 alignnone colorbox-1917" src="http://devinhenkel.com/wp-content/uploads/2016/09/Autocomplete_‹_devinhenkel_—_WordPress.png" alt="autocomplete__devinhenkel_-_wordpress" width="190" height="209" /></a></p>
<p>Autocomplete gives you control over the types of items that are included in the typeahead behavior: Posts, Pages, Categories, Tags, etc.</p>
<p>Search page allows you to use default WordPress behavior for the results page. You can use the Algolia backend which corrects typos, but doesn&#8217;t allow filtering. Or, you can use the full Algolia search functionality which provides instant searching and filtering.</p>
<p>Indexing allows you to select which aspects of your site you would like in the Algolia index.</p>
<p>Logs let you see how people are searching your site, and Settings are where you manage the connection to the API.</p>
<p>Check it out on this site. The typeahead and instant search are pretty sweet.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://devinhenkel.com/compelling/algolia-is-back/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Update: MagiQuest Wand Code</title>
		<link>https://devinhenkel.com/compelling/update-magiquest-wand-code/</link>
					<comments>https://devinhenkel.com/compelling/update-magiquest-wand-code/#comments</comments>
		
		<dc:creator><![CDATA[Devin Henkel]]></dc:creator>
		<pubDate>Sun, 11 Sep 2016 15:49:00 +0000</pubDate>
				<category><![CDATA[Compelling]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[DIY]]></category>
		<category><![CDATA[Magiquest]]></category>
		<category><![CDATA[Maker]]></category>
		<category><![CDATA[RaspberryPi]]></category>
		<guid isPermaLink="false">http://devinhenkel.com/?p=1868</guid>

					<description><![CDATA[Apologies for the delay. I&#8217;ve been meaning to update the original post talking about Magiquest wands and home makerness, but haven&#8217;t had time until now. I did manage to find an improved tactic to the statistical confidence path I went down using only a Raspberry Pi and LIRC to decode. The hero of this story [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Apologies for the delay. I&#8217;ve been meaning to update the <a href="http://devinhenkel.com/compelling/magic-just-means-youre-not-seeing-the-source-code/">original post</a> talking about <a href="http://www.magiquest.com/">Magiquest</a> wands and home makerness, but haven&#8217;t had time until now.</p>
<p>I did manage to find an improved tactic to the statistical confidence path I went down using only a <a href="https://www.raspberrypi.org/">Raspberry Pi</a> and <a href="http://www.lirc.org/">LIRC</a> to decode. The hero of this story is really <a href="https://github.com/mpflaga">Michael Flaga</a>, who extended Arduino-IRRemote to include Magiquest wands as remotes.&nbsp;His awesome library can be <a href="https://github.com/mpflaga/Arduino-IRremote">found on github</a>.</p>
<p>But, first things first&#8230;</p>
<h3>Wiring Up The Arduino</h3>
<p>None of this will work without an IR sensor. So, the first task is to get that wired up.</p>
<p><a href="http://devinhenkel.com/wp-content/uploads/2016/09/wanduino.jpg"><img decoding="async" class="wp-image-1871 aligncenter colorbox-1868" src="http://devinhenkel.com/wp-content/uploads/2016/09/wanduino.jpg" alt="wanduino" width="365" height="430"></a></p>
<p>It&#8217;s only important to remember that the Ground goes to ground, the Voltage goes to +3.3v, and the Signal goes to Pin 11. You could use a different pin, but the default configuration should work fine. I used a <a href="http://www.sainsmart.com/sainsmart-mega2560-r3-development-board-compatible-with-arduino-mega2560-r3.html">SainSmart Mega 2560</a>, but you could use most any Arduino you have laying around. You&#8217;ll be wanting to connect your Arduino to a machine to receive the decoded output, so a USB cable will help. I ran my USB cable to a Raspberry Pi so the whole unit could sit on top of my kids&#8217; dresser.</p>
<h3>Talk To Me, Goose!</h3>
<p>With the decoding of the Magiquest wand being handled by mflaga&#8217;s library, the critical component of the system becomes communication with the downstream platforms. First, make sure you have the Arduino-IRremote-master Library loaded into the IDE. While in Arduino, select Sketch &gt; Include Library &gt; Add .ZIP Library and select the zip file <a href="https://github.com/mpflaga/Arduino-IRremote/archive/master.zip">downloaded here</a>. After that, make sure you&#8217;ve gone to Tools &gt; Board &gt; Board Manager and selected the right board. Mine compiled best under Arduino AVR Boards 1.6.9. That should avoid most of the compile errors I saw under other versions.</p>
<p>I began by loading <a href="https://github.com/mpflaga/Arduino-IRremote/tree/master/examples/IRrecvDump">IRrecvDump</a> onto the Arduino and writing a basic Python program to read the output. &nbsp;The Python code looks like this:</p>
<pre><code class="language-cpp" data-line="">import serial

ser = serial.Serial(&#039;/dev/tty.usbmodem1421&#039;, 9600)

while True:
	s = ser.readline();
	print s;</code></pre>
<p>Note: you may be operating on a different tty. To find the exact location of your Arduino, type</p>
<pre class="lang:default decode:true">ls /dev/tty*</pre>
<p>and look for the unusual usb port. That&#8217;s the one you want. Also, if you haven&#8217;t already, you may need to install pySerial by typing</p>
<pre class="lang:default decode:true ">pip install pySerial</pre>
<p>At this point, you should be able to fire up the Arduino, start the python script shown above, and get a response when you flick your wand at the IR sensor. But, it probably comes out &#8220;Decoded &#8211; Magiquest, magnitude = X, wand_id=Y&#8230;&#8221;, etc. The challenge is to be able to do something with it.</p>
<h3>Now, You&#8217;re Speaking My Language</h3>
<p>So, you could certainly parse what&#8217;s being returned from the Arduino as is, but in order to make it more useful, let&#8217;s get the Arduino to output something more universal, like JSON. So, back to the Arduino sketch.</p>
<p>We&#8217;ll need to teach the Arduino some new tricks to construct our JSON. Fortunately, there&#8217;s a library for that, too. <a href="https://github.com/bblanchon">Benoit Blanchon</a> has written the ArduinoJSON library that you should <a href="https://github.com/bblanchon/ArduinoJson/archive/master.zip">go ahead and download</a>. We&#8217;ll import it the same way we imported Arduino-IRremote above. Make sure to include it in your project so the top of the Arduino sketch looks like this</p>
<pre><code class="language-cpp" data-line="">#include &lt;ArduinoJson.h&gt;
#include &lt;IRremote.h&gt;</code></pre>
<p>Next, we need to set&nbsp;a buffer for our JSON and create the JSON object. Add this just below your declarations</p>
<pre><code class="language-cpp" data-line="">StaticJsonBuffer&lt;200&gt; jsonBuffer;
JsonObject&amp; root = jsonBuffer.createObject(); </code></pre>
<p>Since we&#8217;ll be decoding the output as JSON on the receiving end, the next thing to do is update the &#8220;Starting&#8230;&#8221; message to be formatted correctly. Update your setup() block to look like this:</p>
<pre><code class="language-cpp" data-line="">&lt;code class=&quot;language-cpp&quot;&gt;Serial.begin(9600);
Serial.println(&quot;{\&quot;message-type\&quot;:\&quot;initialize\&quot;,\&quot;message\&quot;:\&quot;starting...\&quot;}&quot;);
//Serial.println(&#039;starting...&#039;);</code></code></pre>
<p>Next, we want to remove the extraneous printing from the ENABLE_MagiQuest loop and let the Python code know a wand message is coming through, so update that code to look like this:</p>
<pre><code class="language-cpp" data-line="">#ifdef ENABLE_MagiQuest
  else if (results-&gt;decode_type == MAGIQUEST) {
  #ifndef IS_AVTINY
    root[&quot;message-type&quot;] = &quot;wand&quot;;
    //Serial.print(&quot;Decoded MAGIQUEST - Magnitude=&quot;);
    //Serial.print(results-&gt;magiquestMagnitude, HEX);
    //Serial.print(&quot;, wand_id=&quot;);</code></pre>
<p>Notice I commented out the Serial.prints and changed the message-type to &#8220;wand&#8221;. Now, the actual data dump happens in the ENABLE_RCMM block, so that&#8217;s where will update next. We want to stop all the raw code printing and construct the rest of our JSON object. Update that block to look like this:</p>
<pre><code class="language-cpp" data-line="">#ifdef ENABLE_RCMM
  else if (results-&gt;decode_type == RCMM) {
     Serial.print(&quot;Decoded RCMM: &quot;);
  }
  root[&quot;owner&quot;] = &quot;Undefined&quot;;
  root[&quot;message&quot;] = &quot;&quot;;
  if(results-&gt;value==0x10CF2401){
    root[&quot;owner&quot;] = &quot;Ellie&quot;;
  }
  if(results-&gt;value==0x1B9BA421){
    root[&quot;owner&quot;] = &quot;Edison&quot;;
  }
  if(results-&gt;value==0x11911A81){
    root[&quot;owner&quot;] = &quot;Dad&quot;;
  }
  root[&quot;wand-id&quot;] = String(results-&gt;value, HEX);
  root[&quot;bits&quot;] = String(results-&gt;bits, DEC);
  root[&quot;magnitude&quot;] = results-&gt;magiquestMagnitude;
  root.printTo(Serial);
  /*Serial.print(&quot;Raw (&quot;);
  Serial.print(count, DEC);
  Serial.print(&quot;): &quot;);

  for (int i = 0; i &lt; count; i++) {
    if ((i % 2) == 1) {
      Serial.print(results-&gt;rawbuf[i]*USECPERTICK, DEC);
    } 
    else {
      Serial.print(-(long)results-&gt;rawbuf[i]*USECPERTICK, DEC);
    }
    Serial.print(&quot; &quot;);
  }*/
  Serial.println(&quot;&quot;);
#endif //ENABLE_RCMM
}</code></pre>
<p>I set the owner to undefined up front, but update it if I find the HEX code for a wand I know. I got this from printing the values from the dump and just put in if statements. You could probably do this on the Python side or even register them in a database and pull them from there, but this was quick and dirty. I set message to an empty string, but you could potentially pass other things as well, if you needed to. I appended the wand-id, the number of bits in the signal, and the magnitude of the flick, which is passed with the remote signal. After that, I commented out the block that was the raw output from before.</p>
<p>The last thing to do is to update the loop() block to spit out our JSON rather than the raw code. Update it to look like this:</p>
<pre><code class="language-cpp" data-line="">void loop() {
  if (irrecv.decode(&amp;results)) {
    //Serial.println(results.value, HEX);
    dump(&amp;results);
    delay(250);
    irrecv.resume(); // Receive the next value
  }
}</code></pre>
<p>That&#8217;s it. Compile the code and upload it to your Arduino. Next, the Python.</p>
<h3>I Hear Ya</h3>
<p>Now, we need the Raspberry Pi to listen for the wand codes and do something in response. I decided for testing sake, to open different web pages based on which wand was being used. User your favorite text editor and create a script like this:</p>
<pre><code class="language-cpp" data-line="">import serial
import json
import time
import webbrowser

ser = serial.Serial(&#039;/dev/tty.usbmodem1421&#039;, 9600)

while True:
	s = ser.readline();
	#print s;
	#print len(s);
	j = json.loads(s);
	print j[&#039;message-type&#039;];
	if j[&#039;message-type&#039;]==&quot;wand&quot;:
		print j[&#039;owner&#039;];
		print j[&#039;wand-id&#039;];
		if j[&#039;owner&#039;]==&quot;Dad&quot;:
			b = webbrowser.get();
			b.open_new(&#039;http://devinhenkel.com&#039;);

		if j[&#039;owner&#039;]==&quot;Ellie&quot;:
			b = webbrowser.get();
			b.open_new(&#039;https://scratch.mit.edu/users/ScratchUser/&#039;);


</code></pre>
<p>So, I&#8217;m just parsing the JSON and printing the message-type. If the message-type is &#8220;wand&#8221;, I check to see who the owner is. If I recognize the owner, I&#8217;m opening different URLs in the default browser. I saved the file as wands.py and ran it from the terminal with the command</p>
<pre class="lang:default decode:true ">python wands.py</pre>
<p>Once I did, I saw the &#8220;initialize&#8221; message-type print to the console. Waving the different wands at the Arduino opened different URLs in the browser. Success!</p>
<h3>Beyond The Browser</h3>
<p>What I ended up doing was buying a <a href="http://www.belkin.com/us/p/P-F7C027/">WeMo Switch</a>&nbsp;and setting up a WeMo Server on the Raspberry Pi. Using curl, I was able to ping the server when I recognized the wand and used it so the kids could turn the Christmas tree on and off with the wands. The possibilities are really limited only by your imagination.</p>
<p>I&#8217;m working on setting up multiple sensors and giving them each an ID. That way, I can pass the JSON to a Node.js server and have it centrally manage the interactions. I recently got an <a href="https://www.amazon.com/Amazon-Echo-Bluetooth-Speaker-with-WiFi-Alexa/dp/B00X4WHP5E">Amazon Echo</a> for my birthday, and I&#8217;m thinking about setting up an <a href="https://developer.amazon.com/alexa-skills-kit">Alexa skill</a> to cast a spell. That way, the kids can tell Alexa what spell they want to cast which will set a property in a cloud database, then when they flick the wand the Raspberry Pi can read that property and react differently depending on the spell cast.</p>
<p>Sorry it took me so long to post this. I&#8217;ve put the full Arduino sketch and Python script <a href="http://devinhenkel.com/Resources/Wands-Arduino.zip">here</a> if you want to use it as a starting place.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://devinhenkel.com/compelling/update-magiquest-wand-code/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
			</item>
		<item>
		<title>Control OWI Robotic Arm From Scratch</title>
		<link>https://devinhenkel.com/what-the/control-owi-robotic-arm-from-scratch/</link>
					<comments>https://devinhenkel.com/what-the/control-owi-robotic-arm-from-scratch/#comments</comments>
		
		<dc:creator><![CDATA[Devin Henkel]]></dc:creator>
		<pubDate>Wed, 24 Aug 2016 03:32:45 +0000</pubDate>
				<category><![CDATA[Interrobang]]></category>
		<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">http://devinhenkel.com/?p=1848</guid>

					<description><![CDATA[I was looking for a good project for my kids to play with robotics where they could use their preferred way of coding, Scratch. If you&#8217;re not familiar with Scratch, it&#8217;s a visual coding environment designed for kids. For instance, will turn the sprite toward the top of the screen and move it 10 steps. [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>I was looking for a good project for my kids to play with robotics where they could use their preferred way of coding, <a href="https://scratch.mit.edu/" target="_blank" rel="noopener noreferrer">Scratch</a>. If you&#8217;re not familiar with Scratch, it&#8217;s a visual coding environment designed for kids. For instance,</p>
<p><a href="http://devinhenkel.com/wp-content/uploads/2016/08/Untitled-4_on_Scratch.png"><img loading="lazy" decoding="async" class="wp-image-1852 alignnone colorbox-1848" src="http://devinhenkel.com/wp-content/uploads/2016/08/Untitled-4_on_Scratch.png" alt="Untitled-4_on_Scratch" width="268" height="118"></a></p>
<p>will turn the sprite toward the top of the screen and move it 10 steps. You can actually create pretty sophisticated software using these tools.</p>
<p>For the robotics piece, I bought an <a href="http://www.owirobots.com/store/catalog/robotic-arm-kits-and-accessories/owi-535-robotic-arm-edge-kit-134.html" target="_blank" rel="noopener noreferrer">OWI-535 Robotic Arm Edge</a>&nbsp;kit to put together with the kids. We worked on it 3 nights in a row, but got it assembled. Using the 5 switch controller, I was able to use it as a utensil to eat a breakfast sausage. Innovation! Putting it together was a great experience because the kids got to see and understand the inner workings. The only downside was that the switches were a bit fiddly and sometimes require adult-strength fingers to control it.</p>
<p>So, I did some research and found a <a href="https://www.amazon.com/OWI-USB-Interface-Robotic-Arm/dp/B0028MBWS2" target="_blank" rel="noopener noreferrer">USB adapter</a> for the arm. Installation was easy, but the software that comes with it only runs on Windows. I could have run a VM and installed the software there, but since my goal was to get to the point where my kids could program it, I decided to find a more open source way to control it. Some Googling unearthed a python package designed to do just that: <a href="https://pypi.python.org/pypi/roboarm/" target="_blank" rel="noopener noreferrer">Roboarm</a>. So, I fired up the Raspberry Pi 3 and opened the terminal. Installation was as easy as:</p>
<pre><code class="language-bash" data-line="">pip install roboarm</code></pre>
<p>&nbsp;</p>
<p>It automatically handles the connection to the OWI and the syntax is pretty straight forward:</p>
<pre><code class="language-python" data-line="">from roboarm import Arm
arm = Arm()
arm.wrist.up(1)
arm.grips.open(1)
arm.led.on(2)</code></pre>
<p>&nbsp;</p>
<p>This will move the wrist joint up for 1 second, move the grips open for a second, and turn the LED on for 2 seconds then turn it off. You can <a href="https://github.com/nvbn/roboarm/blob/master/docs/api.rst" target="_blank" rel="noopener noreferrer">view the documentation</a> at the git site. This took care of the connection from <a href="https://www.python.org/" target="_blank" rel="noopener noreferrer">Python</a> to the OWI, but now we needed to connect Scratch to Python.&nbsp;Fortunately, the offline editor comes pre-installed on the flavor of Debian installed on the RPi, otherwise, you can <a href="http://www.computacaonaescola.ufsc.br/?page_id=55&amp;lang=en" target="_blank" rel="noopener noreferrer">follow these instructions</a> to install it on Linux.</p>
<p>Google to the rescue again! I was able to find a Python library for communicating with the Scratch offline editor. You can <a href="https://github.com/pilliq/scratchpy" target="_blank" rel="noopener noreferrer">find scratchpy</a> on github. Once again, installation was a breeze:</p>
<pre><code class="language-bash" data-line="">pip install scratchpy</code></pre>
<p>&nbsp;</p>
<p>was all it took, and we were off and running. We did the tests&nbsp;outlined in the readme, then it was time to put it to work. First, we created a Python script to listen for broadcasts from Scratch and execute whatever actions Scratch fed it:</p>
<pre><code class="language-python" data-line="">def listen():
  while True:
    try:
      yield s.receive()
    except scratch.ScratchError:
      raise StopIteration
for msg in listen():
  if msg[0] == &#039;broadcast&#039;:
    exec(msg[1])</code></pre>
<p>Saved this script as roboarm.py and, then, we just needed Scratch to tell Python what to tell the OWI:</p>
<p><a href="http://devinhenkel.com/wp-content/uploads/2016/08/roboarm.png"><img loading="lazy" decoding="async" class="wp-image-1862 alignnone colorbox-1848" src="http://devinhenkel.com/wp-content/uploads/2016/08/roboarm.png" alt="roboarm" width="241" height="181" srcset="https://devinhenkel.com/wp-content/uploads/2016/08/roboarm.png 434w, https://devinhenkel.com/wp-content/uploads/2016/08/roboarm-300x225.png 300w" sizes="auto, (max-width: 241px) 100vw, 241px" /></a></p>
<p>Would fire off a bunch of broadcasts in the form of {&#8220;broadcast&#8221;: &#8220;arm.base.rotate_counter(1)&#8221;} that roboarm.py was listening for. When it received them, the exec() command would execute them as if we were typing them into the python prompt.</p>
<p>Now, I&#8217;ve challenged the kids to come up with clever ways to use this &#8211; maybe a game that involves the robot arm moving something, maybe a robot dance&#8230; I&#8217;m leaving it up to them, but we&#8217;ll find something cool to do with it.</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://devinhenkel.com/what-the/control-owi-robotic-arm-from-scratch/feed/</wfw:commentRss>
			<slash:comments>13</slash:comments>
		
		
			</item>
		<item>
		<title>Wearality: High Quality VR In Your Pocket</title>
		<link>https://devinhenkel.com/compelling/wearality-high-quality-vr-in-your-pocket/</link>
					<comments>https://devinhenkel.com/compelling/wearality-high-quality-vr-in-your-pocket/#respond</comments>
		
		<dc:creator><![CDATA[Devin Henkel]]></dc:creator>
		<pubDate>Mon, 22 Aug 2016 04:55:22 +0000</pubDate>
				<category><![CDATA[Compelling]]></category>
		<category><![CDATA[Innovation]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[AR]]></category>
		<category><![CDATA[VR]]></category>
		<category><![CDATA[Wearality]]></category>
		<guid isPermaLink="false">http://devinhenkel.com/?p=1837</guid>

					<description><![CDATA[Back before I started at Megacorp What Counts Things, I worked for a smaller consulting firm. Back at that firm, we had a fellowship program. What that means is that there was a group of really freaking smart people we paid to say they were our friends. One of those really freaking smart guys was [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Back before I started at Megacorp What Counts Things, I worked for a smaller consulting firm. Back at that firm, we had a fellowship program. What that means is that there was a group of really freaking smart people we paid to say they were our friends. One of those really freaking smart guys was <a href="https://en.wikipedia.org/wiki/Alan_Kay">Alan Kay</a>. If you&#8217;re not familiar with him, he&#8217;s the guy who <a href="http://history-computer.com/ModernComputer/Personal/Dynabook.html">invented the laptop</a> computer, the GUI, and <a href="http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht81Ht/doc_kay_oop_en">object-oriented programming</a>. He&#8217;s also a spectacular guitar and pipe organ player. He&#8217;s also married to the <a href="https://en.wikipedia.org/wiki/Bonnie_MacBird">original writer of Tron</a>&#8230; Basically, he&#8217;s cooler than you or I will ever be.</p>
<p>There was a time where we were trying to think how we could use <a href="http://squeak.org/">Squeak</a> as an enterprise tool. Alan agreed to spend the day with us to think it through. We didn&#8217;t end up doing much with it; mostly because we didn&#8217;t have the time to invest. But, he brought <a href="https://en.wikipedia.org/wiki/David_A._Smith_(computer_scientist)">Dave Smith</a> with him that day who was really freaking smart himself.</p>
<p>Fast forward a number of years and I saw his name pop up in conjunction with a kickstarter project. It was for an affordable, portable VR headset that was focused on quality, the <a href="https://www.kickstarter.com/projects/wearality/wearality-sky-limitless-vr">Wearality Sky</a>. So, being a longtime fan of VR and knowing what a freaking smart guy Dave was, I was an early contributor.</p>
<p>Virtual Reality and I go a long way back. My first degree was heavily focused on 3D animation and I was an early adopter of <a href="https://www.google.com/webhp?sourceid=chrome-instant&amp;ion=1&amp;espv=2&amp;ie=UTF-8#q=VRML">VRML</a>. At the time, I thought I was a pioneer of &#8220;experiential poetry,&#8221; where words were mixed with environments that the user could navigate through. The only issue at the time was that the interface was a bit clunky and it took a really powerful computer just to render the environments (complete with 3D audio). Now, with <a href="https://unity3d.com/">Unity</a>, <a href="https://vr.google.com/cardboard/">Google Cardboard</a>, and ubiquitous broadband, the time is ripe for VR and AR. Just ask <a href="http://www.pokemongo.com/">Pokémon Go</a> players.</p>
<p>In fact, I wrote about the <a href="http://devinhenkel.com/tech/we-wish-you-a-vr-y-christmas/">evolution of Viewmaster</a> last Christmas. The device did a great job of melding the <a href="http://www.view-master.com/en-us">Viewmaster experience</a> with VR/AR content. However, the quality of the VR felt a bit like a toy.</p>
<p>Enter Wearality Sky. My unit just arrived yesterday.</p>
<p><a href="http://devinhenkel.com/wp-content/uploads/2016/08/Wearality.png"><img loading="lazy" decoding="async" class="size-full wp-image-1840 aligncenter colorbox-1837" src="http://devinhenkel.com/wp-content/uploads/2016/08/Wearality.png" alt="Wearality" width="640" height="364" srcset="https://devinhenkel.com/wp-content/uploads/2016/08/Wearality.png 640w, https://devinhenkel.com/wp-content/uploads/2016/08/Wearality-300x171.png 300w" sizes="auto, (max-width: 640px) 100vw, 640px" /></a></p>
<p>It&#8217;s only been 24 hours, but I can safely say this is the best VR headset I&#8217;ve used &#8211; and it folds to fit in your pocket! At the heart of Wearality are high quality <a href="https://en.wikipedia.org/wiki/Fresnel_lens">Fresnel lenses</a> (courtesy of <a href="http://www.lockheedmartin.com/us/news/features/2014/141124-mst-visualizing-the-future.html">Lockheed Martin</a>).  The lenses provide a 150 degree field of vision, which is significantly more than the standard 90-100 degrees from other units. The difference is substantial. The experience is far more immersive than other headsets I&#8217;ve used.</p>
<p>It works with Cardboard apps, so there&#8217;s plenty of content out there. But, you&#8217;ll be able to enjoy that content more because it fills in your peripheral vision more completely. At first, the image quality didn&#8217;t seem that great to me, but I realized that wearing my glasses fixed that. It fits comfortably over glasses, too.</p>
<p>If I have a complaint about Wearality Sky, it&#8217;s that the documentation is a bit sparse. It took me longer than it should have to figure out that what I thought was the carrying case, was actually the fabric shroud to block out side light. It comes with a snap-on headstrap that is easy to install.</p>
<p>Here&#8217;s how freaking cool you&#8217;ll look wearing the unit:</p>
<p><a href="http://devinhenkel.com/wp-content/uploads/2016/08/Cool-Dude.png"><img loading="lazy" decoding="async" class="size-full wp-image-1841 aligncenter colorbox-1837" src="http://devinhenkel.com/wp-content/uploads/2016/08/Cool-Dude.png" alt="Cool-Dude" width="640" height="484" srcset="https://devinhenkel.com/wp-content/uploads/2016/08/Cool-Dude.png 640w, https://devinhenkel.com/wp-content/uploads/2016/08/Cool-Dude-300x227.png 300w" sizes="auto, (max-width: 640px) 100vw, 640px" /></a></p>
<p>Registering the unit to work with Cardboard was as easy as pointing it to a QR code. After that, I could open any of my Cardboard apps and see it in a new way. Personally, I recommend checking out <a href="https://www.youtube.com/watch?v=w6hEWZ9Igy0">Revolt</a> by <a href="http://muse.mu/">Muse</a> &#8211; it&#8217;s like being inside a music video, but there&#8217;s enough content out there to keep anyone entertained for a long time. With companies <a href="https://www.rio2016.com/en/news/VR-technology-virtual-reality-future-sports-broadcasting-rio-2016-olympic-games-HD-ultra-OBS-360">promising to deliver sports content in 3D</a>, the body of content is constantly growing.</p>
<p>If you&#8217;ve been dying to experience VR and want to do so in the most shareable way, I recommend the Wearality Sky as an option.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://devinhenkel.com/compelling/wearality-high-quality-vr-in-your-pocket/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Creepy, Facebook&#8230; Creepy.</title>
		<link>https://devinhenkel.com/heh/creepy-facebook-creepy/</link>
					<comments>https://devinhenkel.com/heh/creepy-facebook-creepy/#respond</comments>
		
		<dc:creator><![CDATA[Devin Henkel]]></dc:creator>
		<pubDate>Fri, 13 May 2016 18:12:44 +0000</pubDate>
				<category><![CDATA[Heh]]></category>
		<category><![CDATA[Interrobang]]></category>
		<category><![CDATA[analytics]]></category>
		<category><![CDATA[creepy]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Privacy]]></category>
		<guid isPermaLink="false">http://devinhenkel.com/?p=1822</guid>

					<description><![CDATA[I was recently brought into a client engagement where EpiServer was brought into scope because the client had a license to it and they were looking to add CMS capabilities to the work we were doing. I didn&#8217;t know a whole lot about the product, so I hit the website to do some research. I [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>I was recently brought into a client engagement where <a href="http://www.episerver.com/">EpiServer</a> was brought into scope because the client had a license to it and they were looking to add CMS capabilities to the work we were doing. I didn&#8217;t know a whole lot about the product, so I hit the website to do some research. I also tried, unsuccessfully, to locate anyone with EpiServer expertise in our company. Then, yesterday, I was on <a href="https://www.facebook.com/">Facebook</a> and I saw a &#8220;Suggested Post&#8221; for EpiServer with the headline that one of my coworkers &#8220;Liked&#8221; EpiServer. So, naturally, I sent a note to my coworker to ask if he really liked the product or was Facebook a bunch of lying liars who lied? I understood how they pegged me, but wanted to know why it connected me to him. Turns out, he liked the EpiServer Facebook page to get a free tee shirt as <a href="http://www.sxsw.com/">SxSW</a>.</p>
<p>So, in short, somewhere in Facebook&#8217;s data lake, there was a connection between my coworker liking a Facebook page at a festival, and me browsing the site for that product. So, let&#8217;s dig into the creepy&#8230;</p>
<p><a href="http://devinhenkel.com/wp-content/uploads/2016/05/Episerver__Best__NET_CMS_for_Digital_Marketing_and_E-commerce___Digital_Experience_Cloud.png"><img loading="lazy" decoding="async" class="alignleft wp-image-1824 colorbox-1822" src="http://devinhenkel.com/wp-content/uploads/2016/05/Episerver__Best__NET_CMS_for_Digital_Marketing_and_E-commerce___Digital_Experience_Cloud.png" alt="Episerver__Best__NET_CMS_for_Digital_Marketing_and_E-commerce___Digital_Experience_Cloud" width="256" height="321" srcset="https://devinhenkel.com/wp-content/uploads/2016/05/Episerver__Best__NET_CMS_for_Digital_Marketing_and_E-commerce___Digital_Experience_Cloud.png 602w, https://devinhenkel.com/wp-content/uploads/2016/05/Episerver__Best__NET_CMS_for_Digital_Marketing_and_E-commerce___Digital_Experience_Cloud-239x300.png 239w, https://devinhenkel.com/wp-content/uploads/2016/05/Episerver__Best__NET_CMS_for_Digital_Marketing_and_E-commerce___Digital_Experience_Cloud-300x377.png 300w" sizes="auto, (max-width: 256px) 100vw, 256px" /></a>Ultimately, for my coworker/friend, the linkage is pretty straightforward. Because he wanted an EpiServer tee shirt, he executed an explicit task to Like their Facebook page. As a result, a node was created (coworker:Person [:LIKES { company: EpiServer }]). For me, the tracking is a little (well, a lot) more insidious. The culprit, as it turns out, is the Facebook Like button on EpiServer&#8217;s home page. I used Abine&#8217;s Blur plugin for Chrome and saw that 10 requests for information from 3rd parties were being executed when I visited EpiServer&#8217;s site. If you&#8217;d like to learn more about how 3rd parties track your activity, there&#8217;s a pretty good <a href="http://www.businessinsider.com/this-is-how-facebook-is-tracking-your-internet-activity-2012-9?op=1">primer at Business Insider</a>. At this point, a node was created (devinhenkel:Person [:VISITED {company:EpiServer}]). In order to create the mapping that spawned the Facebook suggested post, it was really just a matter of finding all relationships between :FRIENDS who had a relationship with company:EpiServer. Doesn&#8217;t really seem all that creepy until you consider the scale of the graph.</p>
<p>So, Facebook maintains a graph of not only the actions you&#8217;ve taken on Facebook (like my coworker), but also the actions you&#8217;ve taken elsewhere as a Facebook user (like myself) and has the capability to surface the relationships between those actions. By comparing those interactions with interactions of the overall Facebook population (which numbers ~1.65 Billion users, at this point), they can make some fairly qualified predictions about you as a person. I&#8217;m reminded of the time <a href="http://www.target.com/">Target</a> was able to <a href="http://www.forbes.com/sites/kashmirhill/2012/02/16/how-target-figured-out-a-teen-girl-was-pregnant-before-her-father-did/#702658e834c6">predict a teen daughter&#8217;s pregnancy</a> before her family knew.</p>
<p>What can Facebook predict about you based on your online behaviors?</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://devinhenkel.com/heh/creepy-facebook-creepy/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Putting The &#8220;Person&#8221; Back In Personalization</title>
		<link>https://devinhenkel.com/compelling/putting-the-person-back-in-personalization/</link>
					<comments>https://devinhenkel.com/compelling/putting-the-person-back-in-personalization/#respond</comments>
		
		<dc:creator><![CDATA[Devin Henkel]]></dc:creator>
		<pubDate>Sun, 03 Apr 2016 02:55:17 +0000</pubDate>
				<category><![CDATA[Compelling]]></category>
		<category><![CDATA[Strategy]]></category>
		<category><![CDATA[content]]></category>
		<category><![CDATA[personalization]]></category>
		<category><![CDATA[sports]]></category>
		<guid isPermaLink="false">http://devinhenkel.com/?p=1804</guid>

					<description><![CDATA[I spent this past week in Las Vegas at the Adobe Summit. I would summarize it like this: &#8220;mobile, mobile, mobile, stories, mobile, then that guy who was the handyman on Facts of Life spoke.&#8221; I kid. It was actually a great event. My company had a booth on the floor of the Community Pavillion [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>I spent this past week in Las Vegas at the <a href="https://twitter.com/search?q=%23AdobeSummit%20%40devinhenkel&amp;src=typd" target="_blank">Adobe Summit</a>. I would summarize it like this: &#8220;mobile, mobile, mobile, stories, mobile, then that <a href="http://www.today.com/popculture/george-clooney-remembers-his-banana-days-facts-life-charlotte-rae-t73626" target="_blank">guy who was the handyman on Facts of Life</a> spoke.&#8221;</p>
<p>I kid. It was actually a great event.</p>
<p>My company had a booth on the floor of the Community Pavillion and people would stop by to discuss their concerns or just see why a company like mine (which is better known for accounting) would have a booth at a Creative/Marketing event.</p>
<p>One person who stopped by worked for a major sports and entertainment company. He had seen some of our social traffic talking about personalization and decided to see if we had anything to offer. &#8220;I&#8217;m having a hard time personalizing sports content. I feel like sports fans will get the content without me personalizing it for them,&#8221; he said. &#8220;I&#8217;m a Syracuse fan,&#8221; he continued, &#8220;and I know where to go to get the good content&#8221;</p>
<p>I said, &#8220;I&#8217;ve been to your site. I&#8217;ve flipped the switches that identify the Blackhawks and Cubs as my favorite teams. I think what ends up happening is that it constrains the content based on that.&#8221; He nodded and said that he didn&#8217;t feel like that was <em>personalizing</em> the content.</p>
<p>I recommended taking a look at one of the big coffee merchants. Much of what they personalize is adjacent to coffee. They suggest music and apps, and adjust the experience in their stores based on who you are. I suggested he could experiment with creating the &#8220;Syracuse Playlist,&#8221; or figure out what food pairs well with Syracuse. I would love for a brand to help me find local <a href="http://www.daily-chronicle.com/2014/07/07/beer-nuggets-a-tasty-dekalb-tradition/as2usd7/" target="_blank">Beer Nuggets</a> to have during an NIU bowl game.  Personalization is about delivering the right experience, not targeted content. Too many of us do the latter.</p>
<p>We think, &#8220;How can I tailor my content for specific users?&#8221; When we do that, we immediately make it about the content and not the person. This is inside-out thinking. The more appropriate question would have been, &#8220;How (and, more importantly, why) does a person engage with a sports team or content provider? What can we do to improve that experience?&#8221; Is that person a Chicago ex-pat living in Los Angeles? How do we get them to the bars where Bears fans gather? How do we get them <a href="http://www.portillos.com/" target="_blank">Chicago-style dogs</a> to eat? How do we play <a href="https://www.youtube.com/watch?v=sEXHeTcxQy4" target="_blank">Chelsea Dagger</a> to get them pumped for a Hawks game?</p>
<p>When it comes down to it, the best personalization isn&#8217;t about us, it&#8217;s about them. It&#8217;s about figuring out how to get people what they want, and sometimes what they don&#8217;t realize they want, yet. This isn&#8217;t easy. It requires deeper research than a handful of personas or segments. It requires some deep analytics to predict things no room of strategists would ever uncover. It&#8217;s about leveraging technology in altogether new ways to deliver experiences that are unexpected, but much more compelling as a result.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://devinhenkel.com/compelling/putting-the-person-back-in-personalization/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>I Am The Best Girl Scout In The World</title>
		<link>https://devinhenkel.com/heh/i-am-the-best-girl-scout-in-the-world/</link>
					<comments>https://devinhenkel.com/heh/i-am-the-best-girl-scout-in-the-world/#respond</comments>
		
		<dc:creator><![CDATA[Devin Henkel]]></dc:creator>
		<pubDate>Thu, 10 Mar 2016 05:14:49 +0000</pubDate>
				<category><![CDATA[Heh]]></category>
		<category><![CDATA[Interrobang]]></category>
		<category><![CDATA[Cookies]]></category>
		<category><![CDATA[Girl Scouts]]></category>
		<category><![CDATA[Visualization]]></category>
		<guid isPermaLink="false">http://devinhenkel.com/?p=1798</guid>

					<description><![CDATA[My wife sent me a text: &#8220;The cookie orders are due tomorrow and we haven&#8217;t sold any!&#8221; Normally, I take the order form to the office and drum up some sales there, but this year I had been traveling quite a bit. So, in a hail mary move, I sent an email to the office [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>My wife sent me a text: &#8220;The cookie orders are due tomorrow and we haven&#8217;t sold any!&#8221; Normally, I take the order form to the office and drum up some sales there, but this year I had been traveling quite a bit. So, in a hail mary move, I sent an email to the office distribution list and hit up Facebook for orders. We ended up selling the most in the troop. As a result, I had to hand-deliver a batch to Florida and we&#8217;ve had to make a few road trips to fulfill people&#8217;s orders.</p>
<p>Given that I was fielding online orders, I set up a Google Sheet to track orders. Since I had the data in a spreadsheet, I decided to add a visualization to see which kinds of cookies were performing better than others. The chart seems to reflect what my gut would tell me anyway, but it&#8217;s still interesting to look at. I&#8217;d be interested to see how much the overall cookie numbers compare.</p>
<p>Next year, we&#8217;ll see if we can&#8217;t find some more creative ways to boost sales.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://devinhenkel.com/heh/i-am-the-best-girl-scout-in-the-world/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Driving Relevance: A 3-pronged Approach</title>
		<link>https://devinhenkel.com/tech/driving-relevance-a-3-pronged-approach/</link>
					<comments>https://devinhenkel.com/tech/driving-relevance-a-3-pronged-approach/#respond</comments>
		
		<dc:creator><![CDATA[Devin Henkel]]></dc:creator>
		<pubDate>Tue, 08 Mar 2016 05:51:35 +0000</pubDate>
				<category><![CDATA[Innovation]]></category>
		<category><![CDATA[Strategy]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Useful]]></category>
		<category><![CDATA[Context]]></category>
		<category><![CDATA[Relevance]]></category>
		<category><![CDATA[search]]></category>
		<guid isPermaLink="false">http://devinhenkel.com/?p=1777</guid>

					<description><![CDATA[I&#8217;ve been involved with an initiative to transform search and information discovery at a company for a while now. We&#8217;re trying some really groundbreaking things, but it ultimately comes down to getting the right information to the user when the ask for it, and we tend to call this relevance. Relevance is a tricky thing because, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>I&#8217;ve been involved with an initiative to transform search and information discovery at a company for a while now. We&#8217;re trying some really groundbreaking things, but it ultimately comes down to getting the right information to the user when the ask for it, and we tend to call this relevance. Relevance is a tricky thing because, to a large degree, it is contextual. There are some aspects you can anticipate or control, while others you will never be able to anticipate. For these reasons, I&#8217;ve devised a 3-facet approach to discussing relevance.</p>
<p><strong>Collection:</strong> Ensuring that you have the right stuff in your bucket while keeping the wrong stuff out. Most search experiences could be improved a great deal by simply removing all the crap that nobody&#8217;s interested in from the index.</p>
<p><strong>Selection:</strong> Being thoughtful about how you are pulling items from the bucket at query time. This is far and away the most difficult facet to get right. It means building a platform that anticipates user needs as it translates the user request into a response made up of items from the bucket in Facet 1.</p>
<p><strong>Inspection:</strong> Giving the user the right levers to pull to refine the response from the platform. Where the platform&#8217;s ability to anticipate user needs stops, we can turn control over to the user to create a result set that is more satisfactory based on their specific needs.</p>
<p>Now that we have pithy names for each facet, let&#8217;s dig into each:</p>
<p>[inlinetweet prefix=&#8221;RT&#8221; tweeter=&#8221;devinhenkel&#8221; suffix=&#8221;&#8221;]&#8221;Search relevance is driven by collection, selection, and inspection.&#8221;[/inlinetweet]</p>
<h3 class="dh-orange"></h3>
<h3 class="dh-orange">Collection</h3>
<p>The first thing to do is to make sure that the information you are searching is as clean as possible. <a href="https://en.wikipedia.org/wiki/Claude_Shannon" target="_blank">Claude Shannon</a> called this &#8220;<a href="https://en.wikipedia.org/wiki/Shannon%E2%80%93Hartley_theorem" target="_blank">signal to noise</a>.&#8221; Many times, the thinking is that better technology will do a better job of managing the same ol&#8217; pile of crap that the last &#8220;better&#8221; technology failed to manage. But, it&#8217;s not just removing stuff from your indices. Cleaning house is good, but the problem is often that there&#8217;s no good description of the information to help the technology understand it. Segmenting your content into rational collections is a good start. Don&#8217;t just organize by where it&#8217;s stored; organize the content by purpose.</p>
<p>A solid metadata strategy is helpful, but difficult to maintain and ensure consistency. <a href="https://en.wikipedia.org/wiki/Semantic_technology" target="_blank">Semantic technology</a> and machine learning can be leveraged to ferret out the relationships between unstructured and structured data to create dynamic metadata. As much as you can do any of these, it will only help.</p>
<p>More than anything, a solid model for your knowledge domain will help create a rational pool of information. I work in professional services, so the kernel of the knowledge graph is &#8220;People doing Work for Companies.&#8221; In a retail company, it may be &#8220;Sales Reps selling Products to Customers.&#8221; Whatever the primary function of your organization is, use that as the core of the knowledge model, and thoughtfully add information in a way that it can hang off that structure. Having explicit entities defined within the knowledge domain not only make the information segmentation more effective, but it allows for more specific requests for information.</p>
<h3>Selection</h3>
<p>Once you have a well-organized collection, having an algorithm that is tuned to pull the most relevant information is the next step.</p>
<p><strong>Parsing:</strong> Understanding what the user is asking for is critical to being able to respond effectively. <a href="http://searchcontentmanagement.techtarget.com/definition/natural-language-processing-NLP" target="_blank">Natural Language Processing</a> allows you to parse the user query to understand what it is they are asking for. Mapping entities found in the user input to nodes on the knowledge domain graph allows you to reach into the pool of data and return the most relevant information based on where it hangs off the knowledge domain graph.</p>
<p><strong>Who&#8217;s askin&#8217;?:</strong> There are a number of data points about a specific user that can help determine how to tune the algorithm in order to present the most relevant results. If the user is logged in, you can use profile data about that user to help determine what is most appropriate. With mobile, it is possible to determine where and when the question is being asked. It is also possible to incorporate &#8220;I/me&#8221; as a query concept (e.g. &#8220;What&#8217;s my vacation balance?&#8221; or &#8220;Who have I worked with?&#8221;). The more you know about the user, the more effectively you can return the results.</p>
<p><strong>Biasing:</strong> In certain cases, some sources of information will be more important than others. In other cases, it may depend on who&#8217;s asking the question or when/where they are asking for it in order to determine information priority. In still other cases, priority of information may be based on specifically what is being asked. It&#8217;s important to note that, just like security, biasing can be early- or late-binding. A mix of these approaches will yield the best results. It is also important to bias thoughtfully, because prioritizing one source up, by definition, means prioritizing another source down.</p>
<h3>Inspection</h3>
<p>No matter how clean you keep the pool of data you draw from, and no matter how intelligent you make the algorithm to reach in and grab information for the user, you will never be able to fully predict the context in which the user is asking the question. The best you can do is provide them with what seems to be the most relevant materials based on the way they phrased the query. At this point, it&#8217;s best to turn control over to the user and let them fine tune the relevance of the result set.</p>
<p>Our research showed that users, overwhelmingly, want information discovery to be a dialog. Users were perfectly fine if you didn&#8217;t get the result set perfect the first time, as long as you provided them with the affordances to refine the result set on their own. This means all the usual clustering/filtering of results, as well as the ability to search within results to get at precisely what is desired.</p>
<p>It was also important to respond with different kinds of results: a specific data point, a pointer to a source of record, or even tools to continue to explore information possibilities (e.g. a break-even analysis tool). Returning a list of links to documents is not enough anymore. We enhanced this capability by providing the ability to perform computational analysis of the underlying data in order to provide answers that were derived from (rather than stored in) the source data.</p>
<h3>Conclusion</h3>
<p>Thoughtfulness is at the core of a successful and relevant search experience. Begin with a thoughtful model that describes the knowledge domain. Next, thoughtfully incorporate data to the pool of available information in a way that relates to the knowledge model. Next, be thoughtful in the way that items are selected from the information pool so that the best possible starting point for information discovery is returned. Finally, provide thoughtful levers for the user to pull to further drive specific contexts to refine the returned results. If you manage to hit on all of these aspects, the resulting information is more likely to satisfy the user&#8217;s needs.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://devinhenkel.com/tech/driving-relevance-a-3-pronged-approach/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>We Wish You A VR-y Christmas</title>
		<link>https://devinhenkel.com/tech/we-wish-you-a-vr-y-christmas/</link>
					<comments>https://devinhenkel.com/tech/we-wish-you-a-vr-y-christmas/#comments</comments>
		
		<dc:creator><![CDATA[Devin Henkel]]></dc:creator>
		<pubDate>Mon, 28 Dec 2015 03:48:41 +0000</pubDate>
				<category><![CDATA[Innovation]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Headset]]></category>
		<category><![CDATA[Unity]]></category>
		<category><![CDATA[View-Master]]></category>
		<category><![CDATA[VR]]></category>
		<guid isPermaLink="false">http://devinhenkel.com/?p=1770</guid>

					<description><![CDATA[So, the gift that keeps on giving at my house this holiday season is the Viewmaster Virtual Reality Starter Pack. It&#8217;s basically Google Cardboard for kids. It works with any Cardboard-compatible smartphone and was easy to get up and running, then the payoffs just kept coming. I&#8217;ve been involved with VR since the mid 90&#8217;s when [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>So, the gift that keeps on giving at my house this holiday season is the <a href="http://www.amazon.com/View-Master-Virtual-Reality-Starter-Pack/dp/B011EG5HJ2" target="_blank">Viewmaster Virtual Reality Starter Pack</a>. It&#8217;s basically Google Cardboard for kids. It works with any Cardboard-compatible smartphone and was easy to get up and running, then the payoffs just kept coming.</p>
<p>I&#8217;ve been involved with VR since the mid 90&#8217;s when I was coding &#8220;4D poems&#8221; in <a href="https://en.wikipedia.org/wiki/VRML" target="_blank">VRML</a>. It seemed like every couple of years, VR would makes some noise and then fade back into the background. But recently, it seems like VR has reached a bit of a tipping point.</p>
<p>Starting most recently with the <a href="https://www.oculus.com/" target="_blank">Oculus Rift</a>&#8216;s Kickstarter campaign, VR has been back in the headlines again. The promise of an affordable way to pump HD video into each eye to create stereoscopic vision got people excited about the possibilities again.</p>
<p>At the same time Oculus was making noise, there was a parallel effort to create a low cost version of a VR headset leveraging existing technology. I have been a participant in a kickstarter for just such an effort, the <a href="https://www.kickstarter.com/projects/wearality/wearality-sky-limitless-vr/posts/1417482" target="_blank">Wearality Sky</a>. Basically, it&#8217;s a pair of high quality fresnel lenses and a frame to hold a smartphone. They have been focused on the optics because they realize that the technology you slip into the frame will keep improving, but they&#8217;ve done a good job of creating a flexible platform for phone-based VR.</p>
<p>Another example is an initiative that focused on driving the cost down to achieve a VR platform. In fact, it is so low cost that the platform is constructed out of cardboard. <a href="https://www.google.com/get/cardboard/">Google Cardboard</a> is, at its core, a software platform. The cardboard frame was simply the cheapest fastest way to get the software into people&#8217;s hands (and onto their faces). They have SDKs for Android and Unity, so anyone with the specs can create Cardboard apps.</p>
<p>As with any good innovation, people will innovate on top of it. Enter <a href="http://www.view-master.com/" target="_blank">Viewmaster</a>. What viewmaster did was create a (relatively) kid friendly VR solution on the Cardboard platform. After a little bit of confusion figuring out what needed to be installed on my phone in order to get started, we were enjoying the Viewmaster Experiences within minutes.</p>
<p>Viewmaster still ships &#8220;reels&#8221; to enable the product, but these serve mostly as AR launchpads for the different apps. Pretty soon, we were jumping from biome to biome looking at 3D animations of animals in their natural habitat. We also explored some destinations with informational pop-ups over points of interest.</p>
<p>We were able to step outside the Viewmaster sandbox and enjoy pure Cardboard functionality, as well. We took the Cardboard &#8220;Urban Hikes,&#8221; saw some cool demos, and rode a rollercoaster through some ancient ruins. After downloading the Google Street View app, we were able to enter our old address in Los Angeles, click on the Cardboard icon, and take a 360º stroll around our old neighborhood.</p>
<p>With oculus focused on improving the display, companies like Wearality focused on premium optics, and Google driving a software solution with ever-increasing market penetration, VR seems to be becoming less &#8220;virtual&#8221; and more &#8220;reality&#8221; every day.</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://devinhenkel.com/tech/we-wish-you-a-vr-y-christmas/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
