<?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>Boshdirect</title>
	<atom:link href="http://boshdirect.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://boshdirect.com/</link>
	<description>Archive of Josh Lyon&#039;s personal blog</description>
	<lastBuildDate>Thu, 13 Jul 2023 18:14:19 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.3.8</generator>
	<item>
		<title>The Hidden Power of &#8220;Just&#8221;, &#8220;Easy&#8221;, &#8220;Simply&#8221;</title>
		<link>https://boshdirect.com/joshlyon/hidden-power-of-just-easy-simply-and-linguistic-minimization/</link>
					<comments>https://boshdirect.com/joshlyon/hidden-power-of-just-easy-simply-and-linguistic-minimization/#respond</comments>
		
		<dc:creator><![CDATA[Josh Lyon]]></dc:creator>
		<pubDate>Thu, 13 Jul 2023 18:14:19 +0000</pubDate>
				<category><![CDATA[Blogs]]></category>
		<category><![CDATA[Josh Lyon]]></category>
		<guid isPermaLink="false">https://boshdirect.com/?p=332</guid>

					<description><![CDATA[<p>There&#8217;s a set of words deeply rooted in our everyday lexicon that, on the surface, seem to make our lives simpler – &#8220;just&#8221;, &#8220;easy&#8221;, and &#8220;simply&#8221;. We tend to use these words to demystify complex situations, impart advice, or share knowledge. But are we aware of the less apparent impact these words can have on [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://boshdirect.com/joshlyon/hidden-power-of-just-easy-simply-and-linguistic-minimization/">The Hidden Power of &#8220;Just&#8221;, &#8220;Easy&#8221;, &#8220;Simply&#8221;</a> appeared first on <a rel="nofollow" href="https://boshdirect.com">Boshdirect</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>There&#8217;s a set of words deeply rooted in our everyday lexicon that, on the surface, seem to make our lives simpler – &#8220;just&#8221;, &#8220;easy&#8221;, and &#8220;simply&#8221;. We tend to use these words to demystify complex situations, impart advice, or share knowledge. But are we aware of the less apparent impact these words can have on others, especially those intimately familiar with the subjects we are simplifying? The impact of these seemingly benign words on interpersonal communication and understanding can be significant and is worth examining.</p>



<p>The words &#8220;just&#8221;, &#8220;easy&#8221;, and &#8220;simply&#8221; tend to oversimplify and trivialize complex issues or processes, and in doing so, can <strong>inadvertently discount another person&#8217;s experiences or knowledge</strong>. By saying &#8220;it&#8217;s easy&#8221; or &#8220;just do this&#8221;, we may not realize that we are implicitly undermining the intricacies, challenges, and the depth of the topic or problem at hand.</p>



<p>Consider a situation where a seasoned engineer tells a novice, &#8220;It&#8217;s easy, just follow these steps&#8221;. What&#8217;s easy for the engineer, with years of experience, may be overwhelming for the beginner. By using &#8220;just&#8221; or &#8220;easy&#8221;, the veteran inadvertently trivializes the breadth of their own experience and knowledge while potentially discouraging the novice who may be struggling to understand.</p>



<p>From a psychological perspective, <strong>this kind of language usage can be discouraging and disheartening</strong>. It can create a barrier to effective learning and growth. When someone hears that something is &#8220;easy&#8221; or they should &#8220;just&#8221; do something, they may internalize a perceived inability to accomplish the task. If it&#8217;s so &#8220;simple&#8221;, why are they struggling? Such feelings can erode confidence and foster a detrimental belief that they lack ability or intelligence.</p>



<p>In business and professional settings,<strong> it can foster a culture of disrespect and dismissal</strong>. Using &#8220;just&#8221;, &#8220;easy&#8221;, and &#8220;simply&#8221; can often understate the effort, time, and skills required to accomplish tasks or projects. It can result in underappreciating the work involved and the people doing it. This language minimization can ultimately lead to demotivation, decreased productivity, and a decrease in morale.</p>



<p><strong>So, what can we do to mitigate these impacts?</strong> The answer lies in fostering a culture of empathy, respect, and clear communication. Acknowledge the complexity inherent in most tasks and projects. Avoid the temptation to use minimizing language that oversimplifies. Instead, encourage an open dialogue about challenges, complexities, and difficulties. Use language that respects and appreciates the depth of knowledge, expertise, and effort involved.</p>



<p>Remember, every expert was once a beginner, and every task has its hidden complexities. The more we strive to respect these truths in our language, the better we can foster a positive and encouraging environment for learning, growth, and collaboration.</p>
<p>The post <a rel="nofollow" href="https://boshdirect.com/joshlyon/hidden-power-of-just-easy-simply-and-linguistic-minimization/">The Hidden Power of &#8220;Just&#8221;, &#8220;Easy&#8221;, &#8220;Simply&#8221;</a> appeared first on <a rel="nofollow" href="https://boshdirect.com">Boshdirect</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://boshdirect.com/joshlyon/hidden-power-of-just-easy-simply-and-linguistic-minimization/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Multiple Servers from One Port on NAS</title>
		<link>https://boshdirect.com/tech/multiple-servers-from-one-port-on-nas/</link>
					<comments>https://boshdirect.com/tech/multiple-servers-from-one-port-on-nas/#comments</comments>
		
		<dc:creator><![CDATA[Josh Lyon]]></dc:creator>
		<pubDate>Tue, 16 Aug 2016 01:36:17 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<guid isPermaLink="false">http://wp.boshdirect.com/?p=229</guid>

					<description><![CDATA[<p>Have you ever wanted to have a single URL with a standard web port to access all the web services you run on your NAS? Most consumer Network Attached Storage (NAS) devices come with a built-in web server which can be used to share all of your services under one address. Summary How does this [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://boshdirect.com/tech/multiple-servers-from-one-port-on-nas/">Multiple Servers from One Port on NAS</a> appeared first on <a rel="nofollow" href="https://boshdirect.com">Boshdirect</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Have you ever wanted to have a single URL with a standard web port to access all the web services you run on your NAS? Most consumer Network Attached Storage (NAS) devices come with a built-in web server which can be used to share all of your services under one address.</p>
<p><strong>Summary</strong></p>
<p>How does this work you might ask? Web servers can route traffic to other servers using what’s called a “Reverse Proxy.” A proxy is a server or device which can act as an intermediary for other devices. In this case, the web server in your NAS can proxy traffic from other web servers on the same machine or even in the network. This allows you to have a single base URL like <a href="https://boshdirect.com/?p=8#example">http://myserver.com</a> which you can use for all your traffic. Each of your servers will then either be accessible via a subdomain or path.</p>
<p>Subdomain</p>
<ul>
<li><a href="http://app1.myserver.com">http://<strong>app1</strong>.myserver.com</a></li>
<li><a href="http://app2.myserver.com" target="_blank" rel="noopener noreferrer">http://<strong>app2</strong>.myserver.com</a></li>
</ul>
<p>Path</p>
<ul>
<li><a href="http://myserver.com/app1">http://myserver.com/<strong>app1</strong></a></li>
<li><a href="http://myserver.com/app2">http://myserver.com/<strong>app2</strong></a></li>
</ul>
<p><span id="more-229"></span></p>
<p><strong>Challenge</strong></p>
<p>In a typical setup, you would open up a port on your router for each and every server or device you want to access outside your network. In this case, your when you setup port forwarding on your network, your router is proxying the connections from outside your network to devices inside your network. The downside with this approach is you need to open a port for each and every server on your network and if any of those devices share the same port, you will only be able to forward traffic for one of the devices or you’ll have to forward a non-standard port.</p>
<p>Additionally, some networks like work or public networks will block non-standard ports. This means that if your server runs on a high port number like 5050 or 8989, it’s possible that this port will be blocked on other networks you might use. Using a reverse proxy, you can use a standard web port which should be open on a normal network (80=http, 443=https).</p>
<p><strong>How-to (QNAP)</strong></p>
<p>In this example, I’ll show how to setup an HTTP Reverse Proxy on a QNAP NAS using the built-in webserver, Apache.</p>
<p><strong>Note</strong>: The same general concepts of modifying the Apache configuration file applies to other devices as well, but you may need to find the location of your configuration file.</p>
<blockquote><p><strong>Update</strong>: I have switched from Apache to Traefik as a reverse proxy on QNAP. Updating the built-in Apache configuration on QNAP has become increasingly difficult and the introduction of containers on QNAP has made the use of packages like Traefik much more approachable.</p>
<p>I&#8217;ve left the remainder of this blog post available as the <strong>concepts</strong> from this article apply to using Apache as a reverse proxy on other systems as well.</p></blockquote>
<p>We will setup a reverse proxy to allow access to the following servers:</p>
<ul>
<li><a href="http://myserver.com:8989">http://myserver.com:8989</a> → <a href="http://myserver.com/sonar">http://myserver.com/sonar</a></li>
<li><a href="http://myserver.com:5050">http://myserver.com:5050</a> → <a href="http://myserver.com/couch">http://myserver.com/couch</a></li>
</ul>
<p>To do this, we will start by remoting into our NAS using SSH. If you don’t already have an SSH client, consider using <a href="http://mobaxterm.mobatek.net/" target="_blank" rel="noopener noreferrer">Mobaterm</a> which has an SSH and SFTP client all built into one.</p>
<ol>
<li>Open your SFTP client and connect to your NAS IP address.</li>
<li>Navigate to <code>/mnt/HDA_ROOT/.config/apache/</code><br />
<a href="https://boshdirect.com/wp-content/uploads/2016/08/mobaxterm_2016-08-15_20-06-44_8.png"><img decoding="async" fetchpriority="high" class=" size-full wp-image-223" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="MobaXterm_2016-08-15_20-06-44" src="https://boshdirect.com/wp-content/uploads/2016/08/mobaxterm_2016-08-15_20-06-44_thumb_2.png" alt="MobaXterm_2016-08-15_20-06-44" width="644" height="364" border="0" srcset="https://boshdirect.com/wp-content/uploads/2016/08/mobaxterm_2016-08-15_20-06-44_thumb_2.png 644w, https://boshdirect.com/wp-content/uploads/2016/08/mobaxterm_2016-08-15_20-06-44_thumb_2-300x170.png 300w" sizes="(max-width: 644px) 100vw, 644px" /></a></li>
<li>Open/Edit your <code>apache.conf</code> file, scroll to the bottom and add the following line:
<pre><code>Include /share/Web/custom.conf</code></pre>
<p><a href="https://boshdirect.com/wp-content/uploads/2016/08/mobarte_2016-08-15_20-06-53_2.png"><img decoding="async" class=" size-full wp-image-226" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="MobaRTE_2016-08-15_20-06-53" src="https://boshdirect.com/wp-content/uploads/2016/08/mobarte_2016-08-15_20-06-53_thumb.png" alt="MobaRTE_2016-08-15_20-06-53" width="644" height="404" border="0" srcset="https://boshdirect.com/wp-content/uploads/2016/08/mobarte_2016-08-15_20-06-53_thumb.png 644w, https://boshdirect.com/wp-content/uploads/2016/08/mobarte_2016-08-15_20-06-53_thumb-300x188.png 300w" sizes="(max-width: 644px) 100vw, 644px" /></a><br />
<strong>Note</strong>: You can also include the contents of the custom.conf (below) directly in your apache.conf file, but some NAS devices will completely reset the apache.conf file upon reboot. By using an external file, you can quickly ‘fix’ things after a reboot by adding the single “Include” line.</li>
<li>Save the file and choose ‘Yes’ to upload it back to the NAS</li>
<li>Navigate to <code>/share/Web/</code> and create a new file called <code>custom.conf </code></li>
<li>Open/Edit the newly created custom.conf file and add the following details
<pre>#Customizations for reverse proxy
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
ProxyPass http://localhost:8989/sonarr
ProxyPassReverse http://localhost:8989/sonarr
ProxyPass http://localhost:5050/couchpotato
ProxyPassReverse http://localhost:5050/couchpotato<strong>
</strong></pre>
<p><strong>Note</strong>: The path in the location tag is the path you want to use to access the server. The URL inside the location tag is the current target URL of the server. Also note that some applications will require you to set a ‘Url Base’ in the General/Server advanced settings as shown in the example here for the target URLs.</li>
<li>Save the file and choose ‘Yes’ to upload it back to the NAS</li>
<li>From the SSH interface (right side of Mobaterm), enter the following command and press Enter:
<pre>/etc/init.d/Qthttpd.sh restart</pre>
<p><a href="https://boshdirect.com/wp-content/uploads/2016/08/mobaxterm_2016-08-15_20-34-13_2.png"><img decoding="async" class=" size-full wp-image-228" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="MobaXterm_2016-08-15_20-34-13" src="https://boshdirect.com/wp-content/uploads/2016/08/mobaxterm_2016-08-15_20-34-13_thumb.png" alt="MobaXterm_2016-08-15_20-34-13" width="644" height="364" border="0" srcset="https://boshdirect.com/wp-content/uploads/2016/08/mobaxterm_2016-08-15_20-34-13_thumb.png 644w, https://boshdirect.com/wp-content/uploads/2016/08/mobaxterm_2016-08-15_20-34-13_thumb-300x170.png 300w" sizes="(max-width: 644px) 100vw, 644px" /></a></li>
</ol>
<p>Congratulations! You’ve now setup your reverse proxy and can access your servers at the desired URLs!</p>
<p>The post <a rel="nofollow" href="https://boshdirect.com/tech/multiple-servers-from-one-port-on-nas/">Multiple Servers from One Port on NAS</a> appeared first on <a rel="nofollow" href="https://boshdirect.com">Boshdirect</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://boshdirect.com/tech/multiple-servers-from-one-port-on-nas/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
		<item>
		<title>Azure Functions &#8211; Serverless Code</title>
		<link>https://boshdirect.com/tech/azure-functions-serverless-code/</link>
					<comments>https://boshdirect.com/tech/azure-functions-serverless-code/#respond</comments>
		
		<dc:creator><![CDATA[Josh Lyon]]></dc:creator>
		<pubDate>Wed, 03 Aug 2016 01:09:09 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<guid isPermaLink="false">http://wp.boshdirect.com/?p=222</guid>

					<description><![CDATA[<p>Azure Functions provide a flexible and easy way to run code without having to worry about spinning up servers, managing an OS, or even managing a service. For that matter, with Azure Functions you only pay when your code is running. Microsoft takes care of spinning up the servers and services to run your code [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://boshdirect.com/tech/azure-functions-serverless-code/">Azure Functions &#8211; Serverless Code</a> appeared first on <a rel="nofollow" href="https://boshdirect.com">Boshdirect</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Azure Functions provide a flexible and easy way to run code without having to worry about spinning up servers, managing an OS, or even managing a service. For that matter, with Azure Functions you only pay when your code is running. Microsoft takes care of spinning up the servers and services to run your code and you are only charged for the time your code is actually running. The beauty of Azure Functions is you focus on writing your logic while Microsoft takes care of everything else it takes to run the code in a scalable fashion.</p>
<p><a href="https://boshdirect.com/wp-content/uploads/2016/08/functions_wizard_2.png"><img decoding="async" loading="lazy" class=" size-full wp-image-214" src="https://boshdirect.com/wp-content/uploads/2016/08/functions_wizard_thumb.png" alt="Functions_Wizard" width="644" height="364" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Functions_Wizard" srcset="https://boshdirect.com/wp-content/uploads/2016/08/functions_wizard_thumb.png 644w, https://boshdirect.com/wp-content/uploads/2016/08/functions_wizard_thumb-300x170.png 300w" sizes="(max-width: 644px) 100vw, 644px" /></a></p>
<p>  <span id="more-222"></span>  </p>
<p><strong>Note</strong>: In order to take advantage of the “pay for what you use” model, make sure you select the ‘Dynamic’ App Service Plan – the classic mode allows you to use your existing App Service resources to run your functions on your existing resources with no additional cost.</p>
<p><a href="https://boshdirect.com/wp-content/uploads/2016/08/dynamic_vs_classic_2.png"><img decoding="async" loading="lazy" class=" size-full wp-image-217" src="https://boshdirect.com/wp-content/uploads/2016/08/dynamic_vs_classic_thumb.png" alt="Dynamic_vs_Classic" width="244" height="53" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Dynamic_vs_Classic" /></a></p>
<p>Azure Functions can be written in “JavaScript, C#, Python, and PHP, as well as scripting options such as Bash, Batch, and PowerShell.”</p>
<p>Azure Functions are event based in nature – there are a number of bindings for input and for output. Functions can be triggered by time events, Azure platform events, external SaaS triggers, and WebHooks (HTTP API calls). Additionally, Azure Functions make it easy to write the results of your logic back into resources like Azure Storage (Blob, Table, Queue), DocumentDB, HTTP calls, etc. The full list of input and output bindings can be found in the <a href="https://azure.microsoft.com/en-us/documentation/articles/functions-reference/#bindings" target="_blank" rel="noopener noreferrer">Azure Functions Runtime documentation</a> under the Bindings heading.</p>
<p>Azure Functions can be built completely in your browser or you can use traditional development tools like your favorite IDE. To get started, navigate to the following address and sign-in with your Azure account:</p>
<p><a href="https://functions.azure.com/signin">https://functions.azure.com/signin</a></p>
<p><a href="https://boshdirect.com/wp-content/uploads/2016/08/functions_get_started_2.png"><img decoding="async" loading="lazy" class=" size-full wp-image-219" src="https://boshdirect.com/wp-content/uploads/2016/08/functions_get_started_thumb.png" alt="Functions_Get_Started" width="644" height="361" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Functions_Get_Started" srcset="https://boshdirect.com/wp-content/uploads/2016/08/functions_get_started_thumb.png 644w, https://boshdirect.com/wp-content/uploads/2016/08/functions_get_started_thumb-300x168.png 300w" sizes="(max-width: 644px) 100vw, 644px" /></a></p>
<p>If you don’t already have an Azure account setup, sign-up using the Azure Portal – once you’re in the Azure Portal, you can also create a Function by taping the New (+) option in the menu and searching for “Function App” by Microsoft in the marketplace.</p>
<p>Creating a Function from the <a href="http://functions.azure.com/signin" target="_blank" rel="noopener noreferrer">functions.azure.com</a> landing page is a quick-start experience for creating functions and is easy for quick one-off demos. If you want more control over the creation of your Function App, the Azure portal results in the same Function app being created, but gives you more control over specifying the Resource Group, Storage Account, and pricing model (dynamic vs classic).</p>
<p>While you’re creating a Function in the Azure portal, you might even notice that Microsoft has Functions listed under Web + Mobile – that’s because Functions are based on the core technology behind the Azure WebJobs SDK feature. Functions take what’s great about the WebJobs SDK and make it even easier to use – this is great if you’re looking to run code based off the input and output bindings that Functions make available. (For more info, check out this <a href="http://stackoverflow.com/a/36611919" target="_blank" rel="noopener noreferrer">Stack Overflow response by Chris Anderson of Microsoft</a>)</p>
<p>Within your Function App, you can create multiple different functions. All of these functions can run independently, but share the same Function app setts – memory, CI, authentication, CORS, etc. When creating a function through the portal, you will be presented with a number of templates to help you get up to speed quickly. These templates include small snippets of code showing how to setup a variety triggers – just make sure you try the different ‘Scenarios’ from the drop down which show some of the external integrations and some sample snippets like a Face Locator and Image Resizer.</p>
<p><a href="https://boshdirect.com/wp-content/uploads/2016/08/functions_templates_2.png"><img decoding="async" loading="lazy" class=" size-full wp-image-221" src="https://boshdirect.com/wp-content/uploads/2016/08/functions_templates_thumb.png" alt="Functions_Templates" width="644" height="328" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Functions_Templates" srcset="https://boshdirect.com/wp-content/uploads/2016/08/functions_templates_thumb.png 644w, https://boshdirect.com/wp-content/uploads/2016/08/functions_templates_thumb-300x153.png 300w" sizes="(max-width: 644px) 100vw, 644px" /></a></p>
<p>It’s easy to get started, so try it out and refer to the <a href="https://azure.microsoft.com/en-us/documentation/articles/functions-reference/" target="_blank" rel="noopener noreferrer">Azure Functions developer documentation</a> as you work through your first Function!</p>
<p>The post <a rel="nofollow" href="https://boshdirect.com/tech/azure-functions-serverless-code/">Azure Functions &#8211; Serverless Code</a> appeared first on <a rel="nofollow" href="https://boshdirect.com">Boshdirect</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://boshdirect.com/tech/azure-functions-serverless-code/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Reolink HTML5 IP Camera Viewer</title>
		<link>https://boshdirect.com/tech/reolink-html5-ip-camera-viewer/</link>
					<comments>https://boshdirect.com/tech/reolink-html5-ip-camera-viewer/#respond</comments>
		
		<dc:creator><![CDATA[Josh Lyon]]></dc:creator>
		<pubDate>Tue, 19 Jul 2016 04:04:11 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<guid isPermaLink="false">http://wp.boshdirect.com/?p=213</guid>

					<description><![CDATA[<p>Reolink, the manufacturer of several IP camera and Network Video Recorder (NVR) products, recently released a firmware update for their line of IP cameras enabling the ability to view the camera streams through HTML 5 enabled browsers like Chrome, Firefox, Safari, and Edge. Update: An update to the firmware seems to have established Flash as [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://boshdirect.com/tech/reolink-html5-ip-camera-viewer/">Reolink HTML5 IP Camera Viewer</a> appeared first on <a rel="nofollow" href="https://boshdirect.com">Boshdirect</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Reolink, the manufacturer of several IP camera and Network Video Recorder (NVR) products, recently released a firmware update for their line of IP cameras enabling the ability to view the camera streams through HTML 5 enabled browsers like Chrome, Firefox, Safari, and Edge.</p>
<p><strong>Update</strong>: An update to the firmware seems to have established Flash as a requirement to view the streams from the browser. While this isn&#8217;t as bad as needing a proprietary plugin as was needed in old firmware, it&#8217;s still not quite as good as being completely plugin free for modern browsers.</p>
<p>It feels a bit odd to be excited about an IP camera that <strong>doesn’t require a browser plugin</strong> in 2016 considering browser plugins like Flash, Silverlight, and ActiveX components have died out across most parts of the web, but this is the sad reality of IP cameras where custom plugins, ActiveX components, and custom Chrome Apps are fairly standard. Mind you, if you are using your mobile phone you are probably going to prefer to use a mobile app from the vendor or even a third party app like TinyCam Pro or Blue Iris, but it’s nice to be able to pull up a browser and access your camera without having to install anything.</p>
<p>  <span id="more-213"></span>  </p>
<p>The change from the previous Reolink web based viewer is apparent right away – simply type in the IP address of your camera in your browser and you are immediately prompted to login – in previous installations, you would be presented with a hideous screen asking you to install a plugin and forcing you to use Internet Explorer. With the latest update, you can simply login and immediately start viewing the live video feed from your camera. By default, you’ll view the “Clear” stream, but you can also select to view the “Fluent” stream if you have a limited network connection or want to save on bandwidth – to do this, simply select the “Fluent” radio button before completing your login.</p>
<p><a href="https://boshdirect.com/wp-content/uploads/2016/07/reolink_html5_login_2.png"><img decoding="async" loading="lazy" class=" size-full wp-image-205" src="https://boshdirect.com/wp-content/uploads/2016/07/reolink_html5_login_thumb.png" alt="Reolink_HTML5_Login" width="642" height="345" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Reolink_HTML5_Login" border="0" srcset="https://boshdirect.com/wp-content/uploads/2016/07/reolink_html5_login_thumb.png 642w, https://boshdirect.com/wp-content/uploads/2016/07/reolink_html5_login_thumb-300x161.png 300w" sizes="(max-width: 642px) 100vw, 642px" /></a></p>
<p>The video stream is smooth and high-quality and looks like just what you would see when using the desktop or mobile apps. In fact, the new web interface seems to mimic the Windows desktop client application in terms of the general design. The top left of the screen shows the “Preview” tab which is used for viewing the live video feed and is what you land on immediately after logging in. The video feed is immediately below and includes options for changing the view type, taking a snapshot, and playing/stopping the video feed. On the right side of the screen are a number of quick configuration options for adjusting the settings on the camera (more on this later).</p>
<p><a href="https://boshdirect.com/wp-content/uploads/2016/07/reolink_centered_fullscreen_day_2.jpg"><img decoding="async" loading="lazy" class=" size-full wp-image-208" src="https://boshdirect.com/wp-content/uploads/2016/07/reolink_centered_fullscreen_day_thumb.jpg" alt="Reolink_Centered_Fullscreen_Day" width="644" height="347" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Reolink_Centered_Fullscreen_Day" border="0" srcset="https://boshdirect.com/wp-content/uploads/2016/07/reolink_centered_fullscreen_day_thumb.jpg 644w, https://boshdirect.com/wp-content/uploads/2016/07/reolink_centered_fullscreen_day_thumb-300x162.jpg 300w" sizes="(max-width: 644px) 100vw, 644px" /></a></p>
<p>If you find that the feed is a bit stretched out, you can either adjust the dimensions of your browser to scale the video feed to fit your screen or tap the ‘view’ button on the right side of the view toolbar (above the video feed) to change between ‘stretch’ and ‘center’ options. The default stretch option will stretch the video feed to fit the screen which can resort in the video looking misshapen and distorted. The ‘center’ option matches the height of the video to the height of the space in the browser then horizontally centers the video – this works well if the action is in the middle of your screen as it can sometimes result in the sides of the video being cropped off. It would be great if Reolink also offered a ‘scale’/’fit’ option which would scale both the height and the width of the video to fit the screen, but I’ve found that I can usually find a good fit by switching between the stretch and center options depending on how I have my browser scaled.</p>
<p><a href="https://boshdirect.com/wp-content/uploads/2016/07/reolink_centered_cropped_day_2.png"><img decoding="async" loading="lazy" class=" size-full wp-image-210" src="https://boshdirect.com/wp-content/uploads/2016/07/reolink_centered_cropped_day_thumb.png" alt="Reolink_Centered_Cropped_Day" width="323" height="347" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Reolink_Centered_Cropped_Day" border="0" srcset="https://boshdirect.com/wp-content/uploads/2016/07/reolink_centered_cropped_day_thumb.png 323w, https://boshdirect.com/wp-content/uploads/2016/07/reolink_centered_cropped_day_thumb-279x300.png 279w" sizes="(max-width: 323px) 100vw, 323px" /></a></p>
<p>Next to the ‘view’ button, you’ll find the ‘snapshot’ button which lets you take a snapshot (picture) of the current video feed. Unfortunately, this feature take 1-2 seconds to actually take the snapshot, so if you have something you want to get an immediate snapshot of this feature might end up disappointing you. On the other hand, this is a quick and easy way to get a picture of the content currently on the screen. Once the snapshot is taken, you are given a preview which you can double-click to view full-screen or right-click to save to your computer.</p>
<p><a href="https://boshdirect.com/wp-content/uploads/2016/07/reolink_snapshot_day_2.jpg"><img decoding="async" loading="lazy" class=" size-full wp-image-212" src="https://boshdirect.com/wp-content/uploads/2016/07/reolink_snapshot_day_thumb.jpg" alt="Reolink_Snapshot_Day" width="642" height="345" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Reolink_Snapshot_Day" border="0" srcset="https://boshdirect.com/wp-content/uploads/2016/07/reolink_snapshot_day_thumb.jpg 642w, https://boshdirect.com/wp-content/uploads/2016/07/reolink_snapshot_day_thumb-300x161.jpg 300w" sizes="(max-width: 642px) 100vw, 642px" /></a></p>
<p>The quick configuration options to the right of the video mimic the settings seen in the desktop and mobile apps and provide a way to quickly tweak the video feed. The basic settings includes the ability to adjust the On Screen Display overlay (OSD), video encoding, and image settings. The advanced settings includes adjustments for anti-flicker, exposure, white balance, day/night, backlight (dynamic range), and 3D Noise Reduction. If you’re looking for additional configuration options, click the cog icon in the top-right corner of the screen which lets you access additional features like Masks, Network Settings (including Email and FTP), Motion Triggers, Firmware Updates, Auto Reboots, and User Management.</p>
<p>Overall, this is a great update – there are a few small issues like the scaling of video and the delay in taking a snapshot, but the ability to access your video feeds directly in your browser without plugins is awesome!</p>
<p>The post <a rel="nofollow" href="https://boshdirect.com/tech/reolink-html5-ip-camera-viewer/">Reolink HTML5 IP Camera Viewer</a> appeared first on <a rel="nofollow" href="https://boshdirect.com">Boshdirect</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://boshdirect.com/tech/reolink-html5-ip-camera-viewer/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Android TV: GuidedStep InflateException</title>
		<link>https://boshdirect.com/tech/android-tv-guidedstep-inflateexception/</link>
					<comments>https://boshdirect.com/tech/android-tv-guidedstep-inflateexception/#respond</comments>
		
		<dc:creator><![CDATA[Josh Lyon]]></dc:creator>
		<pubDate>Sun, 21 Feb 2016 06:00:00 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<guid isPermaLink="false">http://wp.boshdirect.com/?p=204</guid>

					<description><![CDATA[<p>I’ve working on porting SharpTools, my Android home automation app, to Amazon Fire TV and Android TV using the Google Leanback library and ran into a snag today. After building a GuidedStepFragment, I was getting the error “Unable to start activity ComponentInfo{}: android.view.InflateException: Binary XML file line #22: Binary XML file line #22: You must [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://boshdirect.com/tech/android-tv-guidedstep-inflateexception/">Android TV: GuidedStep InflateException</a> appeared first on <a rel="nofollow" href="https://boshdirect.com">Boshdirect</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>I’ve working on porting SharpTools, my Android home automation app, to Amazon Fire TV and Android TV using the Google Leanback library and ran into a snag today. After building a GuidedStepFragment, I was getting the error “<strong>Unable to start activity ComponentInfo{}: android.view.InflateException: Binary XML file line #22: Binary XML file line #22: You must supply a layout_width attribute.</strong>”</p>
<p>At first, I was a bit baffled as the developer guidelines clearly state that GuidedStepFragments should be added programmatically and not via XML files and there weren’t any clear references to our control over the XML file. I took a quick peek at the manifest from the androidtv-Leanback example and quickly realized the difference – they were explicitly specifying the theme in the activity declaration. In their example, they were using a modified theme, but in my case I simply added the <strong>theme</strong> attribute with the default <strong>Theme.Leanback.GuidedStep</strong> and everything started working as expected.</p>
<pre>&lt;activity<br />    android:name=&quot;.tv.TVSetup&quot;<br />    android:label=&quot;@string/action_settings&quot;<br />    android:theme=&quot;@style/Theme.Leanback.GuidedStep&quot;&gt;</pre>
<p>The post <a rel="nofollow" href="https://boshdirect.com/tech/android-tv-guidedstep-inflateexception/">Android TV: GuidedStep InflateException</a> appeared first on <a rel="nofollow" href="https://boshdirect.com">Boshdirect</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://boshdirect.com/tech/android-tv-guidedstep-inflateexception/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Azure Queue via Shared Access Signature and REST</title>
		<link>https://boshdirect.com/tech/azure-queue-via-shared-access-signature-and-rest/</link>
					<comments>https://boshdirect.com/tech/azure-queue-via-shared-access-signature-and-rest/#respond</comments>
		
		<dc:creator><![CDATA[Josh Lyon]]></dc:creator>
		<pubDate>Sat, 18 Jul 2015 23:00:00 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<guid isPermaLink="false">http://wp.boshdirect.com/?p=202</guid>

					<description><![CDATA[<p>What is an Azure Queue? Azure Queues allow you to store a large number of lightweight messages leveraging Azure Storage. Typical use cases for queues include buffering a set of data or actions for processing. And since the Queues are part of Azure Storage they are super cheap. As of writing this, each queue message [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://boshdirect.com/tech/azure-queue-via-shared-access-signature-and-rest/">Azure Queue via Shared Access Signature and REST</a> appeared first on <a rel="nofollow" href="https://boshdirect.com">Boshdirect</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>What is an Azure Queue?</h3>
<p>Azure Queues allow you to store a large number of lightweight messages leveraging Azure Storage. Typical use cases for queues include buffering a set of data or actions for processing. And since the Queues are part of Azure Storage they are super cheap. As of writing this, each queue message can be 64 KB in size and a queue can hold millions of messages (up to the capacity of the storage account).</p>
<p><strong>Examples:</strong></p>
<p><a href="http://www.hanselman.com/blog/IntroducingWindowsAzureWebJobs.aspx" target="_blank" rel="noopener noreferrer" title="Azure WebJobs">Scott Hanselman has a post</a> showing how an Azure Queue can be used along with Azure WebJobs to offload processing of images. This is a great example as it shows how a real application might accept images from a user in real-time, then use a queue as the hand-off for another service to actually process the images.</p>
<p>As another example, I have used Queues as a temporary staging ground for incoming IoT data from my connected SmartHome where a WebJob then took care of properly sorting the data and moving it to the destination Azure Table Storage location. This allowed me to take advantage of the massively scalable architecture of Azure Queues instead of having my logic running on a Web App where I would have had to take care of scalability.</p>
<p>  <span id="more-202"></span>  </p>
<h3>How can I access the Queue?</h3>
<p>Like many other things in Azure, Queues can be accessed through a <a href="https://msdn.microsoft.com/en-us/library/azure/dd179363.aspx" target="_blank" rel="noopener noreferrer" title="Azure Queue REST API">REST API</a> which is what we will cover in this post. Microsoft has also put together a number of wrapper APIs for .NET, Java, PHP, Node.js, Python, and Ruby which allow you to work with native language constructs and objects while the API takes care of interfacing with the REST API.</p>
<p>Regarding authentication, in order to access resources like Queues on Azure, you can:</p>
<ul>
<li>Make the Queue public</li>
<li>Use your Primary or Secondary storage account key</li>
<li>Build a custom application / service to proxy requests</li>
<li>Generate and use a Shared Access Signature (SAS)</li>
</ul>
<p>For the purposes of this post, we are going to assume an example where we want to be able to limit access to the Queue – that means making the queue public is not an option. And if we have full control of the application using the queues, then perhaps using the Primary or Secondary storage account key is sufficient. But what if we don’t have control of the application – for example, it’s running in a scripting language on a third party server. We might consider building a custom web application or service to proxy the requests, but now we have to deal with scalability and an additional layer of code when all we want to do is allow another application to add to the queue.</p>
<p>This is where Shared Access Signatures come in…</p>
<h3>What does a Shared Access Signature do?</h3>
<p>Shared Access Signatures allow us grant limited access to the queue without having to expose our main storage account keys or build a custom service. Even better, Shared Access Signatures allow us to grant specific permissions on the queue for a limited set of time. For example, we might want to issue a SAS that allows a client to only PUT new items on the queue (but not read/delete) and only allow this access for the next hour. We can generate a SAS and share it with the client and they will be able to PUT new items on the queue for the next hour and we no longer have to worry about the Primary or Secondary storage account key being exposed or being used for malicious intent if it falls into the wrong hands.</p>
<p>Microsoft has a great post explaining <a href="https://azure.microsoft.com/en-us/documentation/articles/storage-dotnet-shared-access-signature-part-1/" target="_blank" rel="noopener noreferrer">how Shared Access Signatures work and why you would use them</a> if you want more information.</p>
<h3>How do I use a Shared Access Signature (SAS)?</h3>
<p>First, you’ll need to generate a Shared Access Signature. The <a href="https://msdn.microsoft.com/en-us/library/azure/dn140255.aspx" target="_blank" rel="noopener noreferrer">specification</a> is fairly straightforward, but it has a number of components to it and can be frustrating to work with if you are just trying to use a one-off SAS without worrying about all the details of generating a SAS. And if you want to create a service that generates SAS tokens, Microsoft has a <a href="https://azure.microsoft.com/en-us/documentation/articles/storage-dotnet-shared-access-signature-part-2/" target="_blank" rel="noopener noreferrer">good article</a> including working C# code just for you.</p>
<p>If you just want a quick app that will generate SAS tokens for you, check out <a href="https://www.microsoft.com/en-us/store/apps/azure-sas-generator/9wzdncrdlv09" target="_blank" rel="noopener noreferrer">Azure SAS Generator</a> on the Windows store.</p>
<p>Here’s a few types when generating the SAS:</p>
<ul>
<li>Try using the 2012-02-12 SAS version</li>
<li>Make sure you have specified an expiry time (the `se` parameter)
<ul>
<li>And make sure it is far enough in the future!</li>
</ul>
</li>
<li>Specify at least one permission using the `sr` parameter
<ul>
<li>r = read; a=add; u=update; p=process</li>
</ul>
</li>
</ul>
<p><a href="https://boshdirect.com/wp-content/uploads/2015/07/azuresasgenerator_6.png"><img decoding="async" loading="lazy" class=" size-full wp-image-200" src="https://boshdirect.com/wp-content/uploads/2015/07/azuresasgenerator_thumb_2.png" alt="AzureSASGenerator" width="244" height="180" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px;" title="AzureSASGenerator" /></a></p>
<p>Using the SAS generated above, I would simply use the Copy Both button to copy the fully parameterized URL:</p>
<pre>https://storageaccount.queue.core.windows.net/resource_name?sv=2012-02-12&amp;se=2015-07-24T13%3A45%3A00Z&amp;sp=r&amp;sig=r8dN1Hvrkk6gRHLBRtA%2BkbqwAKRj3I9TmXUtz4hSht8%3D</pre>
<p>And then adjust it per the <a href="https://msdn.microsoft.com/en-us/library/azure/dd179363.aspx" target="_blank" rel="noopener noreferrer">Azure Queue REST API</a>. For example, if I wanted to peek at 10 messages in the queue, I would modify the URL like:</p>
<pre>  https://storageaccount.queue.core.windows.net/resource_name<strong><span style="color: #ff0000;">/messages?peekonly=true&amp;numofmessages=10&amp;</span></strong>sv=2012-02-12&amp;se=2015-07-24T13%3A45%3A00Z&amp;sp=r&amp;sig=r8dN1Hvrkk6gRHLBRtA%2BkbqwAKRj3I9TmXUtz4hSht8%3D</pre>
<p>Other tips:</p>
<ul>
<li>When posting to the queue via the REST API, consider base64 encoding your text as the standard C# library and Visual Studio plugins require the text to be base64 encoded</li>
<li>Refer to the Azure Queue REST API documentation and ensure you have included all parameters</li>
</ul>
<p>The post <a rel="nofollow" href="https://boshdirect.com/tech/azure-queue-via-shared-access-signature-and-rest/">Azure Queue via Shared Access Signature and REST</a> appeared first on <a rel="nofollow" href="https://boshdirect.com">Boshdirect</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://boshdirect.com/tech/azure-queue-via-shared-access-signature-and-rest/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Remove Folder from Git with History</title>
		<link>https://boshdirect.com/tech/remove-folder-from-git-with-history/</link>
					<comments>https://boshdirect.com/tech/remove-folder-from-git-with-history/#respond</comments>
		
		<dc:creator><![CDATA[Josh Lyon]]></dc:creator>
		<pubDate>Thu, 19 Feb 2015 02:00:00 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Commit]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[IDEA]]></category>
		<category><![CDATA[IntelliJ]]></category>
		<category><![CDATA[PyCharm]]></category>
		<category><![CDATA[Repository]]></category>
		<category><![CDATA[VCS]]></category>
		<category><![CDATA[Version Control]]></category>
		<guid isPermaLink="false">http://wp.boshdirect.com/?p=199</guid>

					<description><![CDATA[<p>I was just cleaning up my desktop and came across a snippet I had saved which removes a specified folder from a Git repository including removing it from the history of the repository. In general, if something was committed to a repository, you shouldn’t remove it from the history, but there are cases where it [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://boshdirect.com/tech/remove-folder-from-git-with-history/">Remove Folder from Git with History</a> appeared first on <a rel="nofollow" href="https://boshdirect.com">Boshdirect</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>I was just cleaning up my desktop and came across a snippet I had saved which removes a specified folder from a Git repository including removing it from the history of the repository. In general, if something was committed to a repository, you shouldn’t remove it from the history, but there are cases where it makes sense – perhaps a sensitive password or key was unintentionally commited.</p>
<p>The command is pretty simple, but be warned that it can have grave consequences if you remove the wrong thing:</p>
<pre>git filter-branch --force --index-filter \
'git rm -r --cached --ignore-unmatch .idea' \
--prune-empty --tag-name-filter cat -- --all

git push origin master --force</pre>
<p>In the example above, I removed the default .idea folder that is included with JetBrains IDEs like IntelliJ and Pycharm.</p>
<p>The post <a rel="nofollow" href="https://boshdirect.com/tech/remove-folder-from-git-with-history/">Remove Folder from Git with History</a> appeared first on <a rel="nofollow" href="https://boshdirect.com">Boshdirect</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://boshdirect.com/tech/remove-folder-from-git-with-history/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SmartThings Tasker plugins and Widgets</title>
		<link>https://boshdirect.com/tech/smartthings-tools/</link>
					<comments>https://boshdirect.com/tech/smartthings-tools/#respond</comments>
		
		<dc:creator><![CDATA[Josh Lyon]]></dc:creator>
		<pubDate>Fri, 17 Oct 2014 02:24:36 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<guid isPermaLink="false">http://wp.boshdirect.com/?p=198</guid>

					<description><![CDATA[<p>Looking for Tasker Integration or Widgets for SmartThings? You are headed in the right direction. Checkout the Android app SharpTools for additional information. http://sharptools.boshdirect.com/features</p>
<p>The post <a rel="nofollow" href="https://boshdirect.com/tech/smartthings-tools/">SmartThings Tasker plugins and Widgets</a> appeared first on <a rel="nofollow" href="https://boshdirect.com">Boshdirect</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Looking for Tasker Integration or Widgets for SmartThings? You are headed in the right direction. Checkout the Android app <a href="http://sharptools.boshdirect.com/features" target="_blank" title="SmartThings Tasker plugins and Widgets" rel="noopener noreferrer">SharpTools</a> for additional information.<a href="https://bitbucket.org/joshua_lyon/smartthings-tools" style="line-height: 1.3em;"><br /></a></p>
<p><a href="http://sharptools.boshdirect.com/features" target="_blank" title="SmartThings Tasker plugins and Widgets" rel="noopener noreferrer">http://sharptools.boshdirect.com/features</a></p>
<p>The post <a rel="nofollow" href="https://boshdirect.com/tech/smartthings-tools/">SmartThings Tasker plugins and Widgets</a> appeared first on <a rel="nofollow" href="https://boshdirect.com">Boshdirect</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://boshdirect.com/tech/smartthings-tools/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Stick-N-Find iBeacon</title>
		<link>https://boshdirect.com/tech/stick-n-find-ibeacon/</link>
					<comments>https://boshdirect.com/tech/stick-n-find-ibeacon/#comments</comments>
		
		<dc:creator><![CDATA[Josh Lyon]]></dc:creator>
		<pubDate>Tue, 02 Sep 2014 22:46:00 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<guid isPermaLink="false">http://wp.boshdirect.com/?p=197</guid>

					<description><![CDATA[<p>A summary of my findings with the Stick-N-Find stickers and their usability as an iBeacon / Bluetooth LE proximity device. I ordered a set of Estimote Beacons and Stick-N-Find stickers and have been playing with automation concepts within Android. In particular, I wanted to be able to have my Android device understand the proximity to [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://boshdirect.com/tech/stick-n-find-ibeacon/">Stick-N-Find iBeacon</a> appeared first on <a rel="nofollow" href="https://boshdirect.com">Boshdirect</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>A summary of my findings with the <a href="https://www.sticknfind.com/sticknfind.aspx" target="_blank" rel="noopener noreferrer">Stick-N-Find stickers</a> and their usability as an iBeacon / Bluetooth LE proximity device. I ordered a set of <a href="http://estimote.com/" target="_blank" rel="noopener noreferrer">Estimote Beacons</a> and Stick-N-Find stickers and have been playing with automation concepts within Android. In particular, I wanted to be able to have my Android device understand the proximity to a location and have a general understanding of indoor positioning.</p>
<p>Note: If you just want to know how to Configure your Stick-N-Find for use in Tasker, jump to <a href="https://boshdirect.com/?p=8#ConfigureAsIBeacon">Configure as iBeacon</a></p>
<p><img decoding="async" loading="lazy" src="https://lh5.googleusercontent.com/va22xj_sVJj2ni5s9FR9amEeyxEXUQegsXWC6XKNgY9W=w447-h366-no" alt="Stick-N-Find Beacon and iPhone" width="333" height="273" style="border: 0;" border="0" /><img decoding="async" loading="lazy" class=" size-full wp-image-191" src="https://boshdirect.com/wp-content/uploads/2014/09/estimote-2-beacons.png" alt="Estimote iBeacon" width="316" height="202" style="border: 0;" border="0" srcset="https://boshdirect.com/wp-content/uploads/2014/09/estimote-2-beacons.png 400w, https://boshdirect.com/wp-content/uploads/2014/09/estimote-2-beacons-300x192.png 300w" sizes="(max-width: 316px) 100vw, 316px" /></p>
<p>  <span id="more-197"></span>  </p>
<p>&nbsp;</p>
<h2>Needs and Alternatives</h2>
<p>I have a fair amount of experience automating my home and life through the use of <a href="http://tasker.dinglisch.net/" target="_blank" rel="noopener noreferrer">Tasker</a>, <a href="http://joaoapps.com/" target="_blank" rel="noopener noreferrer">AutoApps</a>, <a href="http://getvera.com/" target="_blank" rel="noopener noreferrer">Z-Wave</a>, and custom technology, but there didn’t seem to be a whole lot of information online about automating local proximity detection with Android at the time of writing this article. Note that there are solutions for proximity detection which use the built in proximity sensor, but this is generally only useful for the proximity of a hand / object to the sensor. While this form of proximity detection can be helpful for detecting gestures like hand-waves, I was interested in more broad detection such as the proximity of the phone (without line-of-sight) to a room within a home or office building. For example, I wanted my phone to know if I was in the Living Room or in the Bedroom so when I gave it voice commands it could respond in the proper context.</p>
<p>While the built-in Android proximity sensor provides information about proximity very close to the device, the other end of the spectrum is technology like Geofences and GPS data. I use apps like <a href="https://play.google.com/store/apps/details?id=com.joaomgcd.autolocation" target="_blank" rel="noopener noreferrer">AutoLocation</a> which provide excellent tools that leverage the <a href="https://developer.android.com/google/play-services/location.html" target="_blank" rel="noopener noreferrer">Android Fused Location provider</a> and have been tremendously helpful for setting up Geofences that can detect rather large areas. For example, AutoLocation can be useful in detecting when I’m in my neighborhood, when I’m at my house, when I’m at the office, or even when I’m walking vs. driving.</p>
<p>The type of location sensitivity I was looking for lied somewhere between the proximity sensor (very near) and Geofence solutions (far). I already had tools to detect when an object was close to my device or when my device was in a particular building, but I wanted to be able to detect when my phone was in a general area like a particular room.</p>
<h2>Stick-N-Find Stickers</h2>
<p class="alert-notice box-info"><strong>Notice:</strong> This article was originally posted in 2014 and Bluetooth Smart (BLE) technology is evolving quickly. I would encourage readers to do a quick search on Amazon or Google to see if there are any newer devices with positive user feedback and ratings.</p>
<p>After researching a bit, I found that there were several Bluetooth LE / iBeacon manufacturers out there, but the two that came to the forefront were the Estimote Beacons and Stick-N-Find stickers. Of the two, the Stick-N-Find stickers were cheaper and seemed to be more consumer oriented. I read a number of bad reviews about the Stick-N-Find devices, but I decided I would test the devices considering there had been documented recent improvements with the firmware of the devices.</p>
<p>When I first received the Stick-N-Find stickers, I did like every normal consumer does and immediately started playing with the devices without reading the instructions. When I pulled the beacons out of the box, one of them bounced across my desk and beeped at me – I was a bit surprised to hear this, but I later found that the devices ship in a deep-sleep mode and tapping them 5 times on a hard-surface wakes them up. I had already done a some reading online, so I knew that I would need to update the firmware on the stickers, but the published articles indicated that you may need an iOS device to perform this update. I figured I would give it a try with the stock firmware on the Android app anyway, so I downloaded the latest version of <a href="https://play.google.com/store/apps/details?id=com.sticknfind.locator" target="_blank" rel="noopener noreferrer">StickNFind from the Google Play</a> store. The 2.5 star review was another reminder of the woes other users had experienced, but I trudged ahead.</p>
<p>I opened the Android application and selected the ‘Pair new Sticker’ option which prompted me to hold the new sticker very close (to the phone) then select it from the list to connect. The prompt also indicated that if a sticker has never been paired before, it should be tapped 4 times to wake the sticker up which would cause the sticker to beep as confirmation that the sticker is awake. I was happy to see that the device paired quickly and was even happier to see that the Android app was prompting me to update the firmware. The firmware update took several minutes for each device, so be patient as you wait for the firmware to update and be sure to keep the phone and sticker near to each other.</p>
<h2>Stick-N-Find App</h2>
<p>The app worked fairly well and while I don’t intend to review the app in depth, I’ll briefly hit on the core functions. The app is capable of pairing with devices, locating devices, and notify you when a sticker is in/out of range. The first feature I tried was the Radar location finding feature. After pairing with a sticker, I opened up the radar and it showed the sticker I had just connected. When you first connect to a sticker, the app may show a spinning icon and text saying it is trying to wake the sticker. The icon next to the name of your sticker will show a spinning icon as it is trying to connect and once it is connected the icon will turn a solid blue and the “Page” feature and device status including temperature and battery life will become available. The page feature sends a signal to the sticker causing it to start beeping and flashing – both the beeping and flashing are relatively quiet so you will need to be fairly close to the device or in a relatively quiet area to hear it.</p>
<p>The signal strength / radar feature gives you a really rough approximation of how far away from the device you are. As you get really close to the device the signal strength approaches 100% and as you get farther away the signal strength drops to 0%. I found that when the sticker was directly touching my device I would get 99.8% strength; at 1 meter I would get between 98-99%; and at 5 meters I was usually 90%+. I would emphasize again that the signal strength is a relative measurement and can be greatly impacted by walls, bodies, metal, and other objects but it was still fun to try to track a device down and then when I was in range use the Page feature to locate the device. One thing I found is that if I selected the “Click for More Options” bar at the bottom of the screen, sometimes it would only find one of the devices (indicated by the grey/blue bar to the right of each device name). When I would then click on the device which wasn’t showing signal, I would get a message that “You can not connect to an out of range sticker”</p>
<p>The other feature of the app that was interesting to me was the ability to alert the user when the sticker was in range or out of range. Both features are listed under the Alerts tab of the application. The in-range feature is labeled ‘Alert Me When In Area’ and allows sounds the user-selected alarm sound whenever the beacon comes in-range (after being out of range). The out-of-range feature is called a ‘Leash’ and allows the user to set a duration that the sticker can be out of range from the phone before the alert is triggered. Both of these features seemed to work fine with the limited testing I did and seem to be part of the core focus for the target user of this device.</p>
<h2>Other Bluetooth LE Apps</h2>
<p><img decoding="async" loading="lazy" class=" alignright size-full wp-image-192" src="https://boshdirect.com/wp-content/uploads/2014/09/Screenshot_2014-09-03-15-05-50.png" alt="Bluetooth LE Scanner" width="266" height="472" style="border: 0; margin-left: 10px; margin-right: 10px; float: right;" border="0" srcset="https://boshdirect.com/wp-content/uploads/2014/09/Screenshot_2014-09-03-15-05-50.png 484w, https://boshdirect.com/wp-content/uploads/2014/09/Screenshot_2014-09-03-15-05-50-169x300.png 169w" sizes="(max-width: 266px) 100vw, 266px" />Since the Stick-N-Find stickers use standard Bluetooth Low Energy technology, you can access certain information from the devices using other Bluetooth LE apps. I first tried <a href="https://play.google.com/store/apps/details?id=com.bluemotionlabs.bluescan" target="_blank" rel="noopener noreferrer">BlueScan</a> and found that the scanner was capable of finding the tags when the drop-down was changed from Classic Scan to Low Energy Scan, but the descriptor seemed to be incorrect and could be related to the default output from the Stick-N-Find devices which appears to be in a proprietary format. That being said, the software was capable of finding the devices and did show some limited information. I also tried <a href="https://play.google.com/store/apps/details?id=uk.co.alt236.btlescan" target="_blank" rel="noopener noreferrer">Bluetooth LE Scanner</a> which provided much more detail and has the <a href="https://github.com/alt236/Bluetooth-LE-Library---Android" target="_blank" rel="noopener noreferrer">source-code available on GitHub</a>. Bluetooth LE Scanner has some other cool features like the ability to export scans as CSV files and the ability to connect to a device to get additional details and then share those details via email, clipboard, etc.</p>
<h2><a name="ConfigureAsIBeacon"></a>Configure as iBeacon</h2>
<p>In order to be recognized by iBeaconTasker, the Stick-N-Find sticker must be profiled as an iBeacon with a supported UUID. At the time of writing this post, iBeaconTasker was only supporting Estimote beacons and was looking at adding support for additional generic iBeacons. In order to configure the Stick-N-Find sticker as an iBeacon with an Estimote UUID, you will need to download&nbsp;<a href="https://play.google.com/store/apps/details?id=com.sticknfind.beaconmaker" target="_blank" rel="noopener noreferrer">SticknFind BeaconMaker</a> (Android) or&nbsp;<a href="https://itunes.apple.com/us/app/snf-beacon/id840531013" target="_blank" rel="noopener noreferrer">SNF Beacon</a> (iOS).</p>
<p>&nbsp;</p>
<p>Android Instructions:</p>
<ol>
<li><span style="line-height: 1.3em;">Install the SticknFind BeaconMaker app</span></li>
<li><span style="line-height: 1.3em;">Open the &#8220;Beacon_Maker&#8221; app</span></li>
<li><span style="line-height: 1.3em;">Select iBeacon<br /><img decoding="async" loading="lazy" class=" size-full wp-image-193" src="https://boshdirect.com/wp-content/uploads/2014/09/Screenshot_2014-09-03-21-58-59_torn.png" alt="Beacon Maker Select iBeacon" width="311" height="227" border="0" srcset="https://boshdirect.com/wp-content/uploads/2014/09/Screenshot_2014-09-03-21-58-59_torn.png 622w, https://boshdirect.com/wp-content/uploads/2014/09/Screenshot_2014-09-03-21-58-59_torn-300x219.png 300w" sizes="(max-width: 311px) 100vw, 311px" /><br /></span></li>
<li><span style="line-height: 1.3em;">Wait for the list of SnF stickers to populate, then select your sticker.<br /><strong>Note:</strong> If you don&#8217;t know which sticker is the one you are interested in, try taking your sticker with your phone and walk away from other potential devices. The &#8216;R&#8217; value is an indicator of the signal and is likely the lowest value if it is closest to your phone. (eg. -30 to -50)</span></li>
<li><span style="line-height: 1.3em;">Change the UUID to the Estimote &#8220;</span>B9407F30-F5F8-466E-AFF9-25556B57FE6D<span style="line-height: 1.3em;">&#8221; and select a unique Major and Minor ID.</span><br /><strong style="line-height: 1.3em;">Warning:</strong><span style="line-height: 1.3em;"> Make note of your current UUID in case you want to switch back to it later!<br /><strong>Note:</strong> The Major and Minor IDs are entered as hex values. Use an <a href="http://www.binaryhexconverter.com/decimal-to-hex-converter" target="_blank" rel="noopener noreferrer">Integer to Hex</a> converter to get the appropriate Hex value.<br /><strong>Note2:</strong> The Major and Minor IDs are arbitrary for our purposes, but try to use the same Major ID across all of your devices and make sure you have a unique Minor ID for each device.</span></li>
<li>If you would like to adjust the range of the Beacon down, do so now (to save battery and reduce how far the Beacon pings)<br /><strong>Example:</strong> I adjusted my SnF device down to -16 dBm to reduce the range so it only triggered when I was in the room and not in other rooms in the house/building. You can also adjust these parameters later and update the device again to try different values.<br /><img decoding="async" loading="lazy" class=" size-full wp-image-194" src="https://boshdirect.com/wp-content/uploads/2014/09/Screenshot_2014-09-03-22-00-45_torn.png" alt="Beacon Maker Adjustments Made" width="340" height="330" border="0" srcset="https://boshdirect.com/wp-content/uploads/2014/09/Screenshot_2014-09-03-22-00-45_torn.png 622w, https://boshdirect.com/wp-content/uploads/2014/09/Screenshot_2014-09-03-22-00-45_torn-300x291.png 300w" sizes="(max-width: 340px) 100vw, 340px" /></li>
<li>Press the Enable button. The application may connect and disconnect from the device multiple times as it prepares for the update. If this is your first time updating the device, it may go through a several minute process (similar to the SnF firmware update) and will display a progress bar indicating the status. Make sure to keep your phone near the sticker during this time.<br /><strong>Note:</strong> In my case, the buttons changed from Busy &gt; Connecting &gt; Busy &gt; Connecting then the progress indication popped up and the update took 3-5 minutes.<br /><img decoding="async" loading="lazy" class=" size-full wp-image-195" src="https://boshdirect.com/wp-content/uploads/2014/09/Screenshot_2014-09-03-22-01-33_crop.png" alt="Beacon Maker Updating" width="343" height="359" border="0" srcset="https://boshdirect.com/wp-content/uploads/2014/09/Screenshot_2014-09-03-22-01-33_crop.png 622w, https://boshdirect.com/wp-content/uploads/2014/09/Screenshot_2014-09-03-22-01-33_crop-287x300.png 287w" sizes="(max-width: 343px) 100vw, 343px" /></li>
<li>Wait a few moments after the update is complete and you should see a success message showing &#8220;Parameters are set succesful&#8221;</li>
<li>Validate that your device now shows &#8216;iBeacon&#8217; where it previous showed SnF and verify that the UUID and Major+Minor IDs are displayed.<br /><img decoding="async" loading="lazy" class=" size-full wp-image-196" src="https://boshdirect.com/wp-content/uploads/2014/09/Screenshot_2014-09-03-22-07-58_torn.png" alt="Beacon Maker iBeacon Profiled" width="352" height="350" border="0" srcset="https://boshdirect.com/wp-content/uploads/2014/09/Screenshot_2014-09-03-22-07-58_torn.png 622w, https://boshdirect.com/wp-content/uploads/2014/09/Screenshot_2014-09-03-22-07-58_torn-150x150.png 150w" sizes="(max-width: 352px) 100vw, 352px" /></li>
</ol>
<p>I have just started my foray into this particular part of the software, but I believe this will allow me to configure the Stick-N-Find device as an iBeacon which should make it usable with other iBeacon aware software like iBeaconTasker.</p>
<h2>iBeaconTasker</h2>
<p class="box-warning"><strong>Notice</strong>: Some users have reported that the quality of iBeaconTasker has dropped significantly and it crashes frequently. While I have not personally tested it, users of the SmartThings community have noted that <a href="https://play.google.com/store/apps/details?id=com.kanetik.bluetooth_profile_condition" target="_blank" rel="noopener noreferrer">Bluetooth Detection by Kanetik</a> is a good Android alternative with great support from the developer.</p>
<p>Tasker is a great automation tool for android that allows the device to respond to states and events and perform various actions. There are several plugins available for Tasker that extend the type of events and states that Tasker can respond to and perform. Most of my favorite plugins come from AutoApps, but I am particularly interested in <a href="https://play.google.com/store/apps/details?id=com.t3hh4xx0r.beacontasker&amp;hl=en" target="_blank" rel="noopener noreferrer">iBeaconTasker </a>which allows Tasker to respond to the presence or lack of presence of an &#8216;Estimote&#8217; iBeacon device. Out of the box, iBeaconTasker does not find Stick-N-Find devices, but once you have updated your Stick-N-Find device to the iBeacon profile and set an Estimote UUID, the plugin should recognize your devices.&nbsp;</p>
<p>Once your sticker is profiled as an &#8216;Estimote&#8217; iBeacon, follow these easy instructions:</p>
<ol>
<li>Open Tasker</li>
<li>Create a New Profile</li>
<li>Select &#8216;State&#8217; as the context</li>
<li>Choose Plugin &gt; iBeaconTasker<br />Note: make sure you have installed both Tasker and iBeaconTasker.</li>
<li>Click the pencil icon next to Configuration</li>
<li>Select your desired &#8216;Estimote&#8217; iBeacon</li>
<li>Choose whether you want the profile to be triggered on when the device is Connected (moves in range) or Disconnected (moves out of range)</li>
<li>Click the check mark to continue<br /><strong>Warning:</strong> Make sure you have disconnected the Beacon from all other apps and be sure to close any apps which might be accessing the Beacon. These apps could prevent your tasks from triggering as expected.</li>
<li>From the &#8216;State Edit&#8217; Tasker screen, verify that your selected configuration is in place (eg. &#8220;Beacon connected&#8221; or &#8220;Beacon disconnected&#8221; is displayed under configuration) and press back to save your configuration</li>
<li>From the Enter Task prompt, choose an existing task or create a new one. For purposes of demonstration, we will create a new task.<br />Note: At this point, your task should trigger whenever the iBeacon condition is met. If you have multiple beacons or want to be able to check the status of beacons when running tasks, you may want to set global variables&nbsp;</li>
<li>Enter a task name and click the check mark to continue.</li>
<li>Click + to add an action. Select Variables &gt; Variable Set</li>
<li>Enter &#8220;%BEACON_PRESENT&#8221; as the name and &#8220;1&#8221; as the To value.<br />Note: This will set the global variable BEACON_PRESENT to 1 indicating that the Beacon is present. This will allow you to check the BEACON_PRESENT variable from other tasks. Make sure you also set a profile/task to set the BEACON_PRESENT to 0 to indicate the Beacon is no longer present. You could also use this variable as a place to store the ID of the most recently seen variable to make your tasks even more conditional.</li>
<li>Build your additional profiles/tasks and enjoy!</li>
</ol>
<p>The post <a rel="nofollow" href="https://boshdirect.com/tech/stick-n-find-ibeacon/">Stick-N-Find iBeacon</a> appeared first on <a rel="nofollow" href="https://boshdirect.com">Boshdirect</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://boshdirect.com/tech/stick-n-find-ibeacon/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title>Install Raspbian on 2GB Card</title>
		<link>https://boshdirect.com/tech/install-raspbian-on-2gb-card/</link>
					<comments>https://boshdirect.com/tech/install-raspbian-on-2gb-card/#comments</comments>
		
		<dc:creator><![CDATA[Josh Lyon]]></dc:creator>
		<pubDate>Tue, 01 Jul 2014 21:43:00 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<guid isPermaLink="false">http://wp.boshdirect.com/?p=190</guid>

					<description><![CDATA[<p>There are several options for running a Raspberry Pi operating system on a 2GB SD card, but in the this blog post I’d like to talk about how to install the ‘official’ distribution, Raspbian, on a smaller SD card. This method requires the minimal Raspbian Unattended Netinstaller which can be found at the following link: [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://boshdirect.com/tech/install-raspbian-on-2gb-card/">Install Raspbian on 2GB Card</a> appeared first on <a rel="nofollow" href="https://boshdirect.com">Boshdirect</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>There are several options for running a Raspberry Pi operating system on a 2GB SD card, but in the this blog post I’d like to talk about how to install the ‘official’ distribution, Raspbian, on a smaller SD card. This method requires the minimal Raspbian Unattended Netinstaller which can be found at the following link:</p>
<p><a title="https://github.com/debian-pi/raspbian-ua-netinst" href="https://github.com/debian-pi/raspbian-ua-netinst">https://github.com/debian-pi/raspbian-ua-netinst</a></p>
<p>The readme file that is shown on the base GitHub project linked above covers the basics of installing the operating system which I will briefly touch on here and the cover a few additional configuration options I choose to do. Some of the key things I like about the raspbian-ua-netinst project is that it fits on a 512 MB card, it downloads the required components through an internet connection via the Ethernet port, and it can do all the hard work completely unattended.</p>
<p>At a high level, here is what is needed to perform the install. (Reference the github link above for more detailed instructions):</p>
<ul>
<li>Grab a 512 MB or larger SD card </li>
<li>Download the 10 MB installer package </li>
<li>Format the SD card as FAT32 </li>
<li>Unpack the installer archive </li>
<li>Copy the unpacked files to the SD Card </li>
<li>Plug the SD card and a network cable into the Pi </li>
<li>Power up the Pi and let it install (this is the <em>unattended</em> part mentioned above) </li>
</ul>
<p>     <span id="more-190"></span> </p>
<p>After letting the system run through the installation, I attempted to start the python interpreter and received the following response:</p>
<p> <xmp>-bash: python: command not found</xmp>  </p>
<p>I then attempted to to issue a command as root using sudo and received the same response:</p>
<p> <xmp>-bash: sudo: command not found </xmp>  </p>
<p>After going through a few more commands, I realized that a few of my favorite Linux commands/applications were missing including Python, Sudo, and Nano. In order to get these applications installed after the base Raspbian-UA-Netinst installation, run the following command at the command shell to install the above packages:</p>
<p> <xmp>apt-get install python sudo nano</xmp>  </p>
<p>Additionally, in order to use sudo, you will want to add your own user. Run the command below substituting the [username] with the preferred username for the new user account you would like to create:</p>
<p> <xmp>adduser [username]</xmp>  </p>
<p>Follow the prompts to complete the addition of the user. This should prompt you to set the password and other descriptive information for the user. When this step is complete, we will add the user to the sudo group to allow the user to temporarily escalate their permissions when needed via sudo.</p>
<p> <xmp>adduser [username] sudo</xmp>  </p>
<p>Additionally, if this user will be using serial ports (files in /dev/) you will want to add the user to the dialout group:</p>
<p> <xmp>sudo adduser [username] dialout</xmp></p>
<p>The post <a rel="nofollow" href="https://boshdirect.com/tech/install-raspbian-on-2gb-card/">Install Raspbian on 2GB Card</a> appeared first on <a rel="nofollow" href="https://boshdirect.com">Boshdirect</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://boshdirect.com/tech/install-raspbian-on-2gb-card/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
