<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1365818330962585368</id><updated>2016-12-22T03:02:00.343-08:00</updated><category term="howto"/><category term="solution"/><category term="dev"/><category term="c#"/><category term="azure"/><category term=".net"/><category term="iot"/><category term="maker"/><category term="review"/><category term="asp.net"/><category term="microsoft"/><category term="twitter"/><category term="tfs"/><category term="visual studio 2012"/><category term="help"/><category term="powerbi"/><category term="visual studio"/><category term="developer"/><category term="3dprinting"/><category term="angularjs"/><category term="conferences"/><category term="feeds"/><category term="blogs"/><category term="nodejs"/><category term="perks"/><category term="3dmodeling"/><category term="job"/><category term="mvc"/><category term="sql"/><category term="windows 8"/><category term="beakn"/><category term="iphone"/><category term="webapi"/><category term="error messages"/><category term="facebook"/><category term="microsoftie"/><category term="neo4j"/><category term="particle"/><category term="raspberrypi"/><category term="reviews"/><category term="windows"/><category term="access"/><category term="development"/><category term="ef"/><category term="linkedin"/><category term="music"/><category term="outlook"/><category term="rest"/><category term="visual studio 2010"/><category term="vs2012"/><category term="windows 7"/><category term="apple"/><category term="iis"/><category term="leopard"/><category term="mac"/><category term="mac upgrade"/><category term="photon"/><category term="snow leopard"/><category term="sql server 2008"/><category term="tech"/><category term="api"/><category term="career"/><category term="errors"/><category term="excel"/><category term="google+"/><category term="linq"/><category term="management"/><category term="mobiledev"/><category term="nuget"/><category term="photography"/><category term="rss"/><category term="spotify"/><category term="sql server"/><category term="thoughts"/><category term="webdev"/><category term="windows mobile"/><category term="7-zip"/><category term="Learning"/><category term="SevenZip"/><category term="arduino"/><category term="audiobooks"/><category term="azureiot"/><category term="backup"/><category term="bluetooth"/><category term="cause"/><category term="chrome"/><category term="debug"/><category term="entity framework"/><category term="exercise"/><category term="google"/><category term="javascript"/><category term="jquery"/><category term="kindle"/><category term="lion"/><category term="mobile"/><category term="msdn"/><category term="opml"/><category term="razor"/><category term="reader"/><category term="search"/><category term="speakers"/><category term="ultrabook"/><category term="webjob"/><category term="zune"/><category term="SyncBack"/><category term="audio"/><category term="blackjack"/><category term="blogger"/><category term="bootstrap"/><category term="charity"/><category term="clickatell"/><category term="commerce server"/><category term="crashplan"/><category term="data"/><category term="ereader"/><category term="how"/><category term="ifttt"/><category term="intel"/><category term="itunes"/><category term="library"/><category term="linux"/><category term="lync"/><category term="mountain lion"/><category term="msn"/><category term="office"/><category term="overdrive"/><category term="poverty"/><category term="productivity"/><category term="rant"/><category term="seattle"/><category term="silverlight"/><category term="skype"/><category term="sms"/><category term="sony vegas"/><category term="spark"/><category term="streamanalytics"/><category term="targus"/><category term="technet"/><category term="tw"/><category term="twitterizer"/><category term="video"/><category term="videos"/><category term="visio"/><category term="windows media player"/><category term="windows phone 7"/><category term="windows phone 8"/><category term="wpf"/><category term="#AzureConf"/><category term="#PhillyCC"/><category term="#WebU"/><category term="#bldwin"/><category term="#devreach"/><category term="#iabmixx"/><category term="#ladieswhocode"/><category term="#madexpo"/><category term="#thatconf1dayharper"/><category term="$resource"/><category term="3d"/><category term="401k"/><category term="512979"/><category term="AzureConf2012"/><category term="Build2012"/><category term="DevReach2012"/><category term="IABMIXX12"/><category term="LadiesWhoCode2012"/><category term="MADExpo"/><category term="MADExpo12"/><category term="MySQL"/><category term="PhillyCodeCamp20121"/><category term="ThatConference"/><category term="WebUnleashed12"/><category term="ads"/><category term="ajax"/><category term="android"/><category term="announcements"/><category term="app store"/><category term="apps"/><category term="asus"/><category term="attached properties"/><category term="bacon"/><category term="bing"/><category term="biztalk"/><category term="bldwin"/><category term="blenders"/><category term="blogging"/><category term="bookmarks"/><category term="bootswatch"/><category term="browser"/><category term="cable"/><category term="can-spam"/><category term="canada"/><category term="car"/><category term="cbeyond"/><category term="clr"/><category term="code"/><category term="codeplex"/><category term="codes"/><category term="coffee"/><category term="combobox"/><category term="complaints"/><category term="config"/><category term="controls"/><category term="cors"/><category term="covariance"/><category term="d3"/><category term="deals"/><category term="delicious"/><category term="design"/><category term="devreach"/><category term="directives"/><category term="dns"/><category term="ebay"/><category term="electronics"/><category term="email"/><category term="esp8266"/><category term="feedback"/><category term="feedburner"/><category term="fiddler"/><category term="filezilla"/><category term="firefox"/><category term="font awesome"/><category term="food"/><category term="free"/><category term="freerice"/><category term="frugal"/><category term="ftp"/><category term="fusion360"/><category term="gifts"/><category term="github"/><category term="gmail"/><category term="graph db"/><category term="gridview"/><category term="hardware"/><category term="health"/><category term="hosting"/><category term="house"/><category term="html"/><category term="html5"/><category term="htmlagilitypack"/><category term="iab"/><category term="ie"/><category term="ignore"/><category term="images"/><category term="install"/><category term="investing"/><category term="iphone5"/><category term="ipv4"/><category term="ivybridge"/><category term="jekyll"/><category term="json"/><category term="json.net"/><category term="jsonp"/><category term="kendoui"/><category term="knockout"/><category term="kris orlowski"/><category term="kudos"/><category term="ladieswhocode"/><category term="lightroom"/><category term="live writer"/><category term="liveid"/><category term="m[5]"/><category term="mailmessage"/><category term="maps"/><category term="masterpages"/><category term="mdbf"/><category term="media"/><category term="mono"/><category term="netdrive"/><category term="netduino"/><category term="netflix"/><category term="nook"/><category term="notification"/><category term="oauth"/><category term="onenote"/><category term="orcas"/><category term="os"/><category term="outlook.com"/><category term="owa"/><category term="pagemethods"/><category term="password"/><category term="pdc2008"/><category term="phillydotnet"/><category term="phishing attack"/><category term="phone"/><category term="photos"/><category term="photosync"/><category term="pluralsight"/><category term="products"/><category term="python"/><category term="questions"/><category term="quicktime"/><category term="recording"/><category term="redbox instant"/><category term="regular expressions"/><category term="requirements"/><category term="research"/><category term="resharper"/><category term="resources"/><category term="restangular"/><category term="ruby"/><category term="screen clipping"/><category term="scripts"/><category term="scriptservice"/><category term="sdk"/><category term="security"/><category term="seo"/><category term="skydrive"/><category term="solu"/><category term="sony movie studio"/><category term="sourcetree"/><category term="spam"/><category term="sphero"/><category term="sql server 2005"/><category term="sqlexpress"/><category term="sqlxml"/><category term="stackoverflow"/><category term="system.net"/><category term="team explorer"/><category term="test"/><category term="thatconf1day12harper"/><category term="tips"/><category term="toastr"/><category term="travel"/><category term="typescript"/><category term="upgrade"/><category term="url"/><category term="vegas"/><category term="victoria"/><category term="virtual pc"/><category term="virtualpathprovider"/><category term="visual studio 2008"/><category term="vso"/><category term="vsts"/><category term="wap"/><category term="wav"/><category term="we"/><category term="web applications"/><category term="webjobs"/><category term="webunleashed"/><category term="windows8.1"/><category term="wmp"/><category term="work/life"/><category term="workaround"/><category term="wpf/e"/><category term="xbox"/><category term="xml"/><category term="youtube"/><category term="zapier"/><title type='text'>Jon Gallant</title><subtitle type='html'>developer maker musician</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jongallant.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://jongallant.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Jon Gallant</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-oEMvFFsC9yE/AAAAAAAAAAI/AAAAAAAADHk/Q0ks4lBpVB0/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>443</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1365818330962585368.post-8023927304555569315</id><published>2016-12-14T15:44:00.001-08:00</published><updated>2016-12-15T13:31:29.543-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="azure"/><category scheme="http://www.blogger.com/atom/ns#" term="azureiot"/><category scheme="http://www.blogger.com/atom/ns#" term="dev"/><category scheme="http://www.blogger.com/atom/ns#" term="iot"/><title type='text'>Introducing Azure IoT Hub Routes - A new feature that allows you to route messages to alternate endpoints</title><content type='html'>&lt;p&gt;The Azure IoT team just announced Custom Endpoints and Routes feature - which allows you to route IoT Hub messages to your own Event Hub, Service Bus Queues or Service Bus Topics. You define your alternate endpoints in &quot;Endpoints&quot; and you define your routing logic in &quot;Routes&quot;.&lt;/p&gt;&lt;h2&gt;What are Some Use Cases for Endpoints and Routes?&lt;/h2&gt;&lt;p&gt;This is very useful for customers that want to segregate messages for security or billing purposes.&amp;nbsp; Imagine if you are using IoT Hub to build your own IoT SaaS product that has tenants. You will likely want to push all messages from each tenant into its own Event Hub so you can easily map Event Hub cost to a tenant.&amp;nbsp; Endpoints and Routes is also a great way to integrate with other services, such as Logic Apps or Notification services or your own custom service.&lt;/p&gt;&lt;h2&gt;What Do Endpoints and Routes Do Under the Covers?&lt;/h2&gt;&lt;p&gt;When IoT Hub receives a message it first checks to see if there is a custom route available that matches a given rule. If there is a match it will send the message to that endpoint and not the Default Event Hub.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/a97c5045d7a3_82AA/image.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/a97c5045d7a3_82AA/image_thumb.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;How do I Use Endpoints and Routes?&lt;/h2&gt;&lt;p&gt;This video will walk you through the same exercise:&lt;/p&gt;&lt;p&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/FhuoXSwNiuE&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;&lt;h3&gt;&lt;/h3&gt;&lt;h3&gt;Azure Portal&lt;/h3&gt;&lt;p&gt;You will now see Endpoints and Routes in your IoT Hub main screen.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/a97c5045d7a3_82AA/image_3.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/a97c5045d7a3_82AA/image_thumb_3.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;We will set both of them up starting with Endpoints.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h3&gt;Define Your Endpoints&lt;/h3&gt;&lt;p&gt;Event Hub, Service Bus Queues and Service Bus Topics are supported today, but more will come in the future.&lt;/p&gt;&lt;p&gt;The first thing you are going to want to do is create one of those if you don&#39;t already have one. For this exercise, we&#39;ll create an Event Hub.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h4&gt;1) Click on Endpoints&lt;/h4&gt;&lt;p&gt;You will see the Built-in endpoints at the top&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/a97c5045d7a3_82AA/image_4.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/a97c5045d7a3_82AA/image_thumb_4.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;And right below that you will see &quot;Additional Endpoints&quot; and you can have up to 10 additional endpoints.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/a97c5045d7a3_82AA/image_5.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/a97c5045d7a3_82AA/image_thumb_5.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;h4&gt;2) Click &quot;Add&quot;&lt;/h4&gt;&lt;p&gt;Over in the right hand panel, you will see the Add Endpoint screen.&amp;nbsp; I selected Event Hub and as you can see I don&#39;t have an Event Hub defined in the same region as my IoT Hub.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/a97c5045d7a3_82AA/image_6.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/a97c5045d7a3_82AA/image_thumb_6.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;h4&gt;3) Create an Event Hub&lt;/h4&gt;&lt;p&gt;Open a new browser window and create an Event Hub in the same region as your IoT Hub, mine is East US.&lt;/p&gt;&lt;h4&gt;4) Add Event Hub Endpoint&lt;/h4&gt;&lt;p&gt;Go back to the IoT Hub Endpoints blade and refresh.&amp;nbsp; You should now see your Event Hub. Select it and click OK.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/a97c5045d7a3_82AA/image_7.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/a97c5045d7a3_82AA/image_thumb_7.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;You will now see it listed in &quot;Additional Endpoints&quot;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/a97c5045d7a3_82AA/image_8.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/a97c5045d7a3_82AA/image_thumb_8.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h3&gt;Define Your Routes and Rules&lt;/h3&gt;&lt;p&gt;1) Click on &quot;Routes&quot; and you&#39;ll see the empty rule list. You can have up to 100 rules per IoT Hub&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/a97c5045d7a3_82AA/image_9.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/a97c5045d7a3_82AA/image_thumb_9.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;2) Click &quot;Add&quot;&lt;/p&gt;&lt;p&gt;Give your rule a name, select your data source, add a query and select and endpoint to send the matching message to.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The rule works against the IoT Hub message properties.&amp;nbsp; It does not inspect the payload of the message. The IoT Hub team has said message inspection is on their backlog.&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;The &quot;Query string&quot; syntax is not documented yet, but I got the &quot;and&quot; conditional statement to work.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/a97c5045d7a3_82AA/image_10.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/a97c5045d7a3_82AA/image_thumb_10.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;As you can see below, you can send the messages directly to the events endpoint or to the custom endpoint you created.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/a97c5045d7a3_82AA/image_11.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/a97c5045d7a3_82AA/image_thumb_11.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;3) Click OK and you will now see your Route Rule&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/a97c5045d7a3_82AA/image_12.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/a97c5045d7a3_82AA/image_thumb_12.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h3&gt;Test It Out&lt;/h3&gt;&lt;p&gt;1) Download this node.js script to your machine. &lt;a title=&quot;https://gist.githubusercontent.com/jonbgallant/8f478cbce44960628482e0491d3dccb1/raw/1183b42f48a768e62420d58d3a7779a9062ab7fa/iothubnodesend&quot; href=&quot;https://gist.githubusercontent.com/jonbgallant/8f478cbce44960628482e0491d3dccb1/raw/1183b42f48a768e62420d58d3a7779a9062ab7fa/iothubnodesend&quot;&gt;https://gist.githubusercontent.com/jonbgallant/8f478cbce44960628482e0491d3dccb1/raw/1183b42f48a768e62420d58d3a7779a9062ab7fa/iothubnodesend&lt;/a&gt;&lt;/p&gt;&lt;p&gt;2) Replace line 17 with your device&#39;s connection string. You can create devices and get their connection strings using the &lt;a href=&quot;https://github.com/Azure/azure-iot-sdks/releases&quot; target=&quot;_blank&quot;&gt;IoT Device Explorer&lt;/a&gt;&lt;/p&gt;&lt;p&gt;3) Scroll to line 39 and change any of the properties to suit your needs.&lt;/p&gt;&lt;p&gt;4) Run the following to install the Azure IoT Node SDK&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;npm i azure-iot-device&lt;/p&gt;&lt;p&gt;npm i azure-iot-device-amqp&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;5. Open a command prompt and run the script&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;node index.js&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;You will now see this in your command prompt&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/a97c5045d7a3_82AA/image_13.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/a97c5045d7a3_82AA/image_thumb_13.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;You will now see the messages coming through to your Event Hub.&amp;nbsp; You can use the &lt;a href=&quot;https://github.com/paolosalvatori/ServiceBusExplorer&quot; target=&quot;_blank&quot;&gt;Service Bus Explorer&lt;/a&gt; to view them. I just clone that repo and F5 from VS to run the Service Bus Explorer. &lt;/p&gt;&lt;p&gt;Notice in the Event Custom Properties section that tenant=1234 and location=sea, which is how we configured the message properties and how we setup the Route rule.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/a97c5045d7a3_82AA/image_14.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/a97c5045d7a3_82AA/image_thumb_14.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Hope this helps you get started with the new and very useful feature.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Jon&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;Related Links&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Blog Announcement: &lt;a title=&quot;https://azure.microsoft.com/en-us/blog/azure-iot-hub-message-routing-enhances-device-telemetry-and-optimizes-iot-infrastructure-resources/&quot; href=&quot;https://azure.microsoft.com/en-us/blog/azure-iot-hub-message-routing-enhances-device-telemetry-and-optimizes-iot-infrastructure-resources/&quot;&gt;https://azure.microsoft.com/en-us/blog/azure-iot-hub-message-routing-enhances-device-telemetry-and-optimizes-iot-infrastructure-resources/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Endpoints Documentation: &lt;a title=&quot;https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-create-through-portal#endpoints&quot; href=&quot;https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-create-through-portal#endpoints&quot;&gt;https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-create-through-portal#endpoints&lt;/a&gt; &amp;amp; &lt;a title=&quot;https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-devguide-endpoints&quot; href=&quot;https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-devguide-endpoints&quot;&gt;https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-devguide-endpoints&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Routes Documentation: &lt;a title=&quot;https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-create-through-portal#routes&quot; href=&quot;https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-create-through-portal#routes&quot;&gt;https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-create-through-portal#routes&lt;/a&gt;&lt;/li&gt;&lt;li&gt;IoT Hub Query Language Documentation: &lt;a title=&quot;https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-devguide-query-language&quot; href=&quot;https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-devguide-query-language&quot;&gt;https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-devguide-query-language&lt;/a&gt; (Does not currently contain &quot;Route rule query syntax&quot;, but will soon)&lt;/li&gt;&lt;li&gt;Messaging Documentation: &lt;a title=&quot;https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-devguide-messaging&quot; href=&quot;https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-devguide-messaging&quot;&gt;https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-devguide-messaging&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/8023927304555569315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/8023927304555569315'/><link rel='alternate' type='text/html' href='http://jongallant.blogspot.com/2016/12/azure-iot-hub-routes.html' title='Introducing Azure IoT Hub Routes - A new feature that allows you to route messages to alternate endpoints'/><author><name>Jon Gallant</name><uri>https://plus.google.com/108260055196724354556</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-oEMvFFsC9yE/AAAAAAAAAAI/AAAAAAAADHk/Q0ks4lBpVB0/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/FhuoXSwNiuE/default.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-1365818330962585368.post-5688738746915258945</id><published>2016-12-13T15:54:00.001-08:00</published><updated>2016-12-13T15:54:49.882-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dev"/><category scheme="http://www.blogger.com/atom/ns#" term="powerbi"/><title type='text'>Power BI Custom Visual Tip: How to Render an SVG or PNG</title><content type='html'>&lt;p&gt;Here’s how to render either an SVG or a PNG from within a Power BI Custom Visual. For this post, I’m going to use the IoT Hub icon that can be found in the &lt;a href=&quot;https://www.microsoft.com/en-us/download/details.aspx?id=41937&quot; target=&quot;_blank&quot;&gt;Microsoft Azure, Cloud and Enterprise Symbol / Icon Set&lt;/a&gt;. Download that now if you want to follow along.&lt;/p&gt;&lt;p&gt;If you get lost in this post, please see my Custom Visual series here: &lt;a href=&quot;http://bit.ly/pbicustomviz&quot;&gt;http://bit.ly/pbicustomviz&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Here’s the icon:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/f0bcb844da1f_D7C9/iothub.png&quot;&gt;&lt;img title=&quot;iothub&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;iothub&quot; src=&quot;http://jongallant.com/images/blog/f0bcb844da1f_D7C9/iothub_thumb.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;You can find it by searching for “iot” in Windows Explorer.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/f0bcb844da1f_D7C9/image.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/f0bcb844da1f_D7C9/image_thumb.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The working code for this post can be found here: &lt;a title=&quot;https://gist.github.com/jonbgallant/aba10a2fd9ef88fd5ebb2141dcf310e6&quot; href=&quot;https://gist.github.com/jonbgallant/aba10a2fd9ef88fd5ebb2141dcf310e6&quot;&gt;https://gist.github.com/jonbgallant/aba10a2fd9ef88fd5ebb2141dcf310e6&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;SVG&lt;/h2&gt;&lt;p&gt;If you open up the file “Azure IoT Hub_Color.svg”, you’ll see the raw SVG code used to render that image.&amp;nbsp; It is verbose, has line breaks and other characters that we don’t need.&amp;nbsp; I used &lt;a href=&quot;https://jakearchibald.github.io/svgomg/&quot; target=&quot;_blank&quot;&gt;SVGOMG&lt;/a&gt; to minimize it.&amp;nbsp; Go to the SVGOMG site, open the SVG and click the download button. In the lower right&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/f0bcb844da1f_D7C9/image_3.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/f0bcb844da1f_D7C9/image_thumb_3.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Open the optimized version and paste it into a variable in your Custom Visual like this:&lt;/p&gt;&lt;p&gt;---&lt;/p&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/01f1ad1c535c5f1730101510110a4987.js&quot;&gt;&lt;/script&gt;&lt;p&gt;---&lt;/p&gt;&lt;p&gt;Then append the SVG to the DOM inside of your Custom Visual’s constructor method like this:&lt;/p&gt;&lt;p&gt;---&lt;/p&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/37732030ded77e6b4164556710f515e2.js&quot;&gt;&lt;/script&gt;&lt;p&gt;---&lt;/p&gt;&lt;p&gt;You could also create the element with jQuery if you have that referenced.&lt;/p&gt;&lt;p&gt;Run the visual using “pbiviz start” and you should now see the SVG version of the image&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/f0bcb844da1f_D7C9/image_4.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/f0bcb844da1f_D7C9/image_thumb_4.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;PNG&lt;/h2&gt;&lt;p&gt;To reference a PNG, you have to encode it and reference as a background image in CSS. I chose base64 for this post, but other encodings should work as well.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Find the Azure IoTHub_Color.png file from the icon set and use a site like &lt;a href=&quot;https://www.base64-image.de/&quot; target=&quot;_blank&quot;&gt;Base64 Image Encoder&lt;/a&gt; to get the base64 encoding of it.&amp;nbsp; Just upload the image, click “show code” and copy the “For use as CSS Background” code:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/f0bcb844da1f_D7C9/image_5.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/f0bcb844da1f_D7C9/image_thumb_5.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;In your Custom Visual project, open style/visual.less and create a new style like this:&lt;/p&gt;&lt;p&gt;---&lt;/p&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/48366ffe88b68a87b71afba0f6c1a319.js&quot;&gt;&lt;/script&gt;&lt;p&gt;---&lt;/p&gt;&lt;p&gt;Open, src/visual.ts and add the following to the constructor&lt;/p&gt;&lt;p&gt;---&lt;/p&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/a18507a145326847ce9b8590cd83cba3.js&quot;&gt;&lt;/script&gt;&lt;p&gt;---&lt;/p&gt;&lt;p&gt;You could also create the element with jQuery if you have that referenced.&lt;/p&gt;&lt;p&gt;Run your visual and you should now see it render on Power BI.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/f0bcb844da1f_D7C9/image_6.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/f0bcb844da1f_D7C9/image_thumb_6.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;See free to tweak the dimensions to suit your needs.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Jon&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/5688738746915258945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/5688738746915258945'/><link rel='alternate' type='text/html' href='http://jongallant.blogspot.com/2016/12/powerbi-custom-visual-svg-png.html' title='Power BI Custom Visual Tip: How to Render an SVG or PNG'/><author><name>Jon Gallant</name><uri>https://plus.google.com/108260055196724354556</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-oEMvFFsC9yE/AAAAAAAAAAI/AAAAAAAADHk/Q0ks4lBpVB0/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-1365818330962585368.post-6526550622103013109</id><published>2016-11-29T19:35:00.001-08:00</published><updated>2016-11-29T19:35:35.776-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="azure"/><category scheme="http://www.blogger.com/atom/ns#" term="github"/><title type='text'>How To Deploy a GitHub Pages Site to an Azure Web App</title><content type='html'>&lt;p&gt;Here&#39;s a quick and easy way to get your GitHub Page repo deployed to an Azure Web App.&amp;nbsp; Let me know if you run into any issues.&lt;/p&gt;&lt;h2&gt;Create GitHub Pages Repo&lt;/h2&gt;&lt;p&gt;Skip to next step if you already have a GitHub pages repo.&lt;/p&gt;&lt;p&gt;1. Create new GitHub repo&lt;/p&gt;&lt;p&gt;2. Under the repo settings &amp;gt; GitHub Pages, set Source to the branch and Launch automatic page generator.&lt;/p&gt;&lt;p&gt;3. Clone the repo locally&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;Copy Azure Deployment Files&lt;/h2&gt;&lt;p&gt;We need to get .deployment, deploy.cmd and getruby.cmd in the root of the GitHub repo. We are going to pull those files from here: &lt;a title=&quot;https://github.com/ritterim/jekyll-azure-deploy&quot; href=&quot;https://github.com/ritterim/jekyll-azure-deploy&quot;&gt;https://github.com/ritterim/jekyll-azure-deploy&lt;/a&gt;. If you have Bash installed on Windows you can use the following command: &lt;/p&gt;&lt;p&gt;--&lt;/p&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/a6b779448106eb3c2c56b6178b5b6816.js&quot;&gt;&lt;/script&gt;&lt;p&gt;--&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;If you don&#39;t have bash, then figure out a way to get those files locally, i.e. clone that repo or download as a zip.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;After you have the files in the root of your repo locally, push them to your remote GitHub repo.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt;: If you are deploying a Jekyll based site that precompiles files into a _site folder then you can leave these files as is.&amp;nbsp; But, if you are deploying a static site without Jekyll, for example, the default HTML site that is generated by GitHub, then you are going to want to do the following:&lt;/p&gt;&lt;p&gt;I repeat: Only do this next step if you have a static site that isn&#39;t generated into a subfolder.&lt;/p&gt;&lt;p&gt;Open deploy.cmd and find this line of code:&lt;/p&gt;&lt;p&gt;--&lt;/p&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/bbba1e100b32d4f53416d95fea9445d4.js&quot;&gt;&lt;/script&gt;&lt;p&gt;--&lt;/p&gt;&lt;p&gt;and change %DEPLOYMENT_SOURCE%/_site to %DEPLOYMENT_SOURCE% (remove /_site)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Once you have made that change, make sure you push to your remote GitHub repo&lt;/p&gt;&lt;h2&gt;Create Azure WebSite&lt;/h2&gt;&lt;p&gt;Go to &lt;a title=&quot;https://portal.azure.com/#create/Microsoft.WebSite&quot; href=&quot;https://portal.azure.com/#create/Microsoft.WebSite&quot;&gt;https://portal.azure.com/#create/Microsoft.WebSite&lt;/a&gt; and create your site.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/796dfb1aad8a_F309/image.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/796dfb1aad8a_F309/image_thumb.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;Increase Deployment Timeout&lt;/h2&gt;&lt;p&gt;Ruby takes a while to install the first time, so increase the deployment timeout with this setting.&lt;/p&gt;&lt;p&gt;1. Open Azure Web App, Go to Application settings and add a custom setting called SCM_COMMAND_IDLE_TIMEOUT and set it to 3600&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/796dfb1aad8a_F309/image_3.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/796dfb1aad8a_F309/image_thumb_3.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Make sure you click Save.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;Setup GitHub to Azure Deployment Hook&lt;/h2&gt;&lt;p&gt;1. Open Azure Web App, Go to &quot;Deployment options&quot; and select GitHub, Authorize and select your repo and branch and click OK.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/796dfb1aad8a_F309/image_4.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/796dfb1aad8a_F309/image_thumb_4.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/796dfb1aad8a_F309/image_5.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/796dfb1aad8a_F309/image_thumb_5.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;You will see this notification&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/796dfb1aad8a_F309/image_6.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/796dfb1aad8a_F309/image_thumb_6.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Click on &quot;Deployment options&quot; again and you should see that the site is being deployed:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/796dfb1aad8a_F309/image_7.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/796dfb1aad8a_F309/image_thumb_7.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;It will take a few minutes to complete.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Open a browser and navigate to your site. Your GitHub pages site should load.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/796dfb1aad8a_F309/image_8.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/796dfb1aad8a_F309/image_thumb_8.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Jon&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/6526550622103013109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/6526550622103013109'/><link rel='alternate' type='text/html' href='http://jongallant.blogspot.com/2016/11/github-pages-azure-deployment.html' title='How To Deploy a GitHub Pages Site to an Azure Web App'/><author><name>Jon Gallant</name><uri>https://plus.google.com/108260055196724354556</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-oEMvFFsC9yE/AAAAAAAAAAI/AAAAAAAADHk/Q0ks4lBpVB0/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-1365818330962585368.post-5739936492462864728</id><published>2016-11-29T15:45:00.001-08:00</published><updated>2016-11-29T16:55:31.285-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dev"/><category scheme="http://www.blogger.com/atom/ns#" term="howto"/><category scheme="http://www.blogger.com/atom/ns#" term="windows"/><title type='text'>Linux Touch Equivalent for Windows AKA How To Create a File Without a Name in Windows</title><content type='html'>&lt;p&gt;Windows Explorer doesn&#39;t allow you to create a file without a name:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/f08ef4d9b803_DBCF/image.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/f08ef4d9b803_DBCF/image_thumb.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Windows doesn&#39;t have a native &quot;touch&quot; equivalent, which is a native Linux program that allows you to create empty files and change timestamps.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;But…&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;If you run &lt;font face=&quot;Consolas&quot;&gt;&lt;strong&gt;&quot;touch&amp;gt;.gitignore&quot;&lt;/strong&gt;&lt;/font&gt; (or any of the other options below) from the command line, the file is created.&amp;nbsp; Also, if you run it again, the file&#39;s timestamp will be updated.&amp;nbsp; It won&#39;t change attributes like touch on Linux does.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/f08ef4d9b803_DBCF/image_3.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/f08ef4d9b803_DBCF/image_thumb_3.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Here are some other ways that work as well.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;font face=&quot;Consolas&quot;&gt;copy nul .gitignore&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font face=&quot;Consolas&quot;&gt;copy con .gitignore, hit enter, then hit ctrl+z&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font face=&quot;Consolas&quot;&gt;cat&amp;gt;.gitignore, hit enter, then hit ctrl+c&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font face=&quot;Consolas&quot;&gt;echo &amp;gt; .gitignore&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font face=&quot;Consolas&quot;&gt;touch&amp;gt;.gitignore&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font face=&quot;Consolas&quot;&gt;fsutil file createnew .gitignore 0&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font face=&quot;Consolas&quot;&gt;nul &amp;gt; .gitignore&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font face=&quot;Consolas&quot;&gt;notepad .gitignore&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font face=&quot;Consolas&quot;&gt;In Windows Explorer, name the file &quot;.gitignore.&quot; and Windows will rename it to &quot;.gitignore&quot;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font face=&quot;Consolas&quot;&gt;bash -c &quot;touch .gitignore&quot;&lt;/font&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Let me know if you know of any other ways and I&#39;ll add them to the list.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Jon&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/5739936492462864728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/5739936492462864728'/><link rel='alternate' type='text/html' href='http://jongallant.blogspot.com/2016/11/windows-touch-equivalent.html' title='Linux Touch Equivalent for Windows AKA How To Create a File Without a Name in Windows'/><author><name>Jon Gallant</name><uri>https://plus.google.com/108260055196724354556</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-oEMvFFsC9yE/AAAAAAAAAAI/AAAAAAAADHk/Q0ks4lBpVB0/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-1365818330962585368.post-492992019336535324</id><published>2016-11-17T07:20:00.001-08:00</published><updated>2016-11-17T07:40:43.610-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dev"/><category scheme="http://www.blogger.com/atom/ns#" term="powerbi"/><title type='text'>How To Add d3@v3.5.5 Reference to a Power BI Custom Visual (SDK v1.2)</title><content type='html'>&lt;p&gt;The Power BI team just released v1.2 of the Custom Visuals SDK. With this version you now need to reference d3 v3.5.5 yourself. d3 v4 does not work yet. I&#39;m working with the team to get a v4 compat and sample together, but for now you can only use v3.5.5.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;You can follow along with the steps below or follow along on this video:&lt;/p&gt;&lt;p&gt;--&lt;/p&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/tADs-T-S_f8&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;p&gt;--&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;1. Setup your Custom Viz dev env: &lt;a title=&quot;http://blog.jongallant.com/2016/09/powerbi-custom-visual-dev.html&quot; href=&quot;http://blog.jongallant.com/2016/09/powerbi-custom-visual-dev.html&quot;&gt;http://blog.jongallant.com/2016/09/powerbi-custom-visual-dev.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;2. Create a new visual&lt;/p&gt;&lt;p&gt;--&lt;/p&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/ac9135fcedcaaaa32fe85cbf9d0cf3ab.js&quot;&gt;&lt;/script&gt;&lt;p&gt;--&lt;/p&gt;&lt;p&gt;3. Install typings &lt;a title=&quot;https://github.com/typings/typings&quot; href=&quot;https://github.com/typings/typings&quot;&gt;https://github.com/typings/typings&lt;/a&gt;&lt;/p&gt;&lt;p&gt;--&lt;/p&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/92d2f6344d2ddc4cc90a407e826064fc.js&quot;&gt;&lt;/script&gt;&lt;p&gt;--&lt;/p&gt;&lt;p&gt;4. Add d3 v3.5.5&lt;/p&gt;&lt;p&gt;--&lt;/p&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/6677b95a05c655664391d13ea0f18fb9.js&quot;&gt;&lt;/script&gt;&lt;p&gt;--&lt;/p&gt;&lt;p&gt;5. Add d3 typing&lt;/p&gt;&lt;p&gt;--&lt;/p&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/1b976f6020e23679ed3d36cf350d4f12.js&quot;&gt;&lt;/script&gt;&lt;p&gt;--&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;6. Add files to tsconfig.json&lt;/p&gt;&lt;p&gt;--&lt;/p&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/51b7dd3afbae54e7fefb922ff828a940.js&quot;&gt;&lt;/script&gt;&lt;p&gt;--&lt;/p&gt;&lt;p&gt;7. Copy this code to src/visual.ts&lt;/p&gt;&lt;p&gt;--&lt;/p&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/99494592e71ff34ad9ae586b99d3f929.js&quot;&gt;&lt;/script&gt;&lt;p&gt;--&lt;/p&gt;&lt;p&gt;8. Start pbiviz dev server&lt;/p&gt;&lt;p&gt;--&lt;/p&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/034b6052f2962b3c5acaf3026bbdb288.js&quot;&gt;&lt;/script&gt;&lt;p&gt;--&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/26c01965b05f_627C/image.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/26c01965b05f_627C/image_thumb.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;9. Go to &lt;a href=&quot;http://app.powerbi.com&quot;&gt;http://app.powerbi.com&lt;/a&gt; and add development visual to a report. You should see a green circle.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/26c01965b05f_627C/image_3.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/26c01965b05f_627C/image_thumb_3.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/492992019336535324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/492992019336535324'/><link rel='alternate' type='text/html' href='http://jongallant.blogspot.com/2016/11/pbiviz-12-d3-35-reference.html' title='How To Add d3@v3.5.5 Reference to a Power BI Custom Visual (SDK v1.2)'/><author><name>Jon Gallant</name><uri>https://plus.google.com/108260055196724354556</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-oEMvFFsC9yE/AAAAAAAAAAI/AAAAAAAADHk/Q0ks4lBpVB0/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/tADs-T-S_f8/default.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-1365818330962585368.post-614898727975710450</id><published>2016-10-11T14:49:00.001-07:00</published><updated>2016-12-05T22:20:20.193-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dev"/><category scheme="http://www.blogger.com/atom/ns#" term="howto"/><category scheme="http://www.blogger.com/atom/ns#" term="powerbi"/><title type='text'>How to Create a Power BI Custom Visual Based on an Existing d3 Visual - Part 3 - Custom Format Properties</title><content type='html'>&lt;span style=&quot;font-size: large;&quot;&gt;UPDATE: The Liquid Fill Gauge visual is now available to download from the&amp;nbsp;&lt;a href=&quot;https://app.powerbi.com/visuals/show/PBI_CV_94E55AB3_5D45_4B62_A49D_19E2109AA028&quot;&gt;Power BI Custom Visual Gallery&lt;/a&gt;!&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: large;&quot;&gt;--&lt;/span&gt;&lt;br /&gt;In this series, we are creating a Power BI Custom Visual from an OSS d3 visualization I found on GitHub called Liquid Fill Gauge built by &lt;a href=&quot;https://gist.github.com/brattonc/5e5ce9beee483220e2f6&quot; target=&quot;_blank&quot;&gt;Curtis Bratton&lt;/a&gt;. It renders a circular gauge with an internal animated wave that represents a &quot;percent full&quot; value.&lt;br /&gt;&lt;img src=&quot;https://github.com/jonbgallant/PowerBI-visuals-liquidFillGauge/raw/master/assets/thumbnail.png&quot; /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;a href=&quot;https://github.com/jonbgallant/PowerBI-visuals-liquidFillGauge/releases&quot; target=&quot;_blank&quot;&gt;Download the Liquid Fill Gauge Custom Visual &lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/jonbgallant/PowerBI-visuals-liquidFillGauge&quot; target=&quot;_blank&quot;&gt;View Liquid Fill Gauge Source Code&lt;/a&gt;&lt;/blockquote&gt;----------------------------------&lt;br /&gt;Here are the previous posts:&lt;br /&gt;1. &lt;a href=&quot;http://blog.jongallant.com/2016/09/how-to-create-power-bi-custom-visual.html&quot;&gt;How to Create a Power BI Custom Visual Based on an Existing d3 Visual - Part 1 - Dev Env Setup, Reference and Testing&lt;/a&gt;&lt;br /&gt;2. &lt;a href=&quot;http://blog.jongallant.com/2016/09/powerbi-custom-visual-from-existing-d3-2.html&quot; target=&quot;_blank&quot;&gt;How to Create a Power BI Custom Visual Based on an Existing d3 Visual - Part 2 - Capabilities, dataRoles and dataViewMappings&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This post is about setting up &lt;strong&gt;custom format properties&lt;/strong&gt; to allow the Power BI user to change the way your visual is formatted (i.e. colors, fonts, widths, etc).&lt;br /&gt;&lt;br /&gt;Here&#39;s an example of what a custom format properties looks like:&lt;br /&gt;&lt;a href=&quot;http://jongallant.com/images/blog/bc08eaa5957e_C044/image.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; src=&quot;http://jongallant.com/images/blog/bc08eaa5957e_C044/image_thumb.png&quot; style=&quot;background-image: none; display: inline; margin: 0px;&quot; title=&quot;image&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Steps to enable &lt;em&gt;Custom Visual&lt;/em&gt; custom properties&lt;/h2&gt;1. Define the property metadata in &lt;strong&gt;capabilities.json&lt;/strong&gt;&lt;br /&gt;2. Handle the setting of property values in &lt;strong&gt;enumerateObjectInstances&lt;/strong&gt; method&lt;br /&gt;3. Get property values with &lt;strong&gt;objectEnumerationUtility.js&lt;/strong&gt;&lt;br /&gt;4. Use a &lt;strong&gt;&quot;settings&quot; object&lt;/strong&gt; as an in-memory property store that you use in your visual.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;1. Define the property metadata in &lt;strong&gt;capabilities.json&lt;/strong&gt;&lt;/h3&gt;The first thing you need to do is define your properties in your capabilities.json file. They are included in the &quot;objects&quot; object at the same level as dataRoles and dataViewMappings.&lt;br /&gt;&lt;a href=&quot;http://jongallant.com/images/blog/bc08eaa5957e_C044/image_3.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; src=&quot;http://jongallant.com/images/blog/bc08eaa5957e_C044/image_thumb_3.png&quot; style=&quot;background-image: none; display: inline;&quot; title=&quot;image&quot; /&gt;&lt;/a&gt;&lt;br /&gt;See &lt;a href=&quot;https://github.com/jonbgallant/PowerBI-visuals-liquidFillGauge/blob/master/liquidFillGauge/capabilities.json&quot; target=&quot;_blank&quot;&gt;this file&lt;/a&gt; for the complete example.&lt;br /&gt;The first child of the objects properties is the &quot;property group&quot;.&amp;nbsp; In this example we have &quot;text&quot;, &quot;circle&quot; and &quot;wave&quot; groups.&lt;br /&gt;&lt;br /&gt;Each &quot;property group&quot; has a displayName property (that&#39;s what will appear in the Power BI format pane) and a &quot;properties&quot; object.&lt;br /&gt;&lt;a href=&quot;http://jongallant.com/images/blog/bc08eaa5957e_C044/image_4.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; src=&quot;http://jongallant.com/images/blog/bc08eaa5957e_C044/image_thumb_4.png&quot; style=&quot;background-image: none; display: inline;&quot; title=&quot;image&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Each property has a displayName, description and type.&amp;nbsp; (There are other properties as well, but we won&#39;t get into that here).&amp;nbsp; In the example below, you can see that a &quot;color&quot; is fill-&amp;gt;solid-&amp;gt;color:true.&amp;nbsp; I&#39;ve also included a numeric and bool sample&lt;br /&gt;&lt;a href=&quot;http://jongallant.com/images/blog/bc08eaa5957e_C044/image_5.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; src=&quot;http://jongallant.com/images/blog/bc08eaa5957e_C044/image_thumb_5.png&quot; style=&quot;background-image: none; display: inline;&quot; title=&quot;image&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;ISSUE: Do not use &quot;textSize&quot; as a property key as is appears to be a reserved key by Power BI and it will always render the &quot;text size&quot; slider that defaults to a min value of 8.&amp;nbsp; See &lt;a href=&quot;https://github.com/Microsoft/PowerBI-visuals-core/issues/484&quot; target=&quot;_blank&quot;&gt;this issue&lt;/a&gt; for updates on that.&lt;/blockquote&gt;Here&#39;s how that renders:&lt;br /&gt;&lt;a href=&quot;http://jongallant.com/images/blog/bc08eaa5957e_C044/image_6.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; src=&quot;http://jongallant.com/images/blog/bc08eaa5957e_C044/image_thumb_6.png&quot; style=&quot;background-image: none; display: inline;&quot; title=&quot;image&quot; /&gt;&lt;/a&gt;&lt;br /&gt;The UI elements are dataType driven, so you automatically get the color selector when you set the type to fill-&amp;gt;solid-&amp;gt;color…same goes for bool, with the on/off switch.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;2. Handle the setting of property values in &lt;strong&gt;enumerateObjectInstances&lt;/strong&gt; method&lt;/h3&gt;Power BI uses the enumerateObjectInstances method to map and store properties to an internal &quot;metadata.objects&quot; property.&amp;nbsp; The enumerateObjectInstances method is called for every &quot;property group&quot; that you define in capabilities.json.&amp;nbsp; You can see below that I have a case statement that matches the &quot;key&quot; from my &quot;objects&quot; in my capabilities.json file called &quot;text&quot;. &lt;br /&gt;This is where Power BI stores the values, so you want to assign each property to whatever value you have stored.&amp;nbsp; I used a &quot;settings&quot; object to store these values.&lt;br /&gt;Note: My visual needed the color in hex form, but when I save it to the Power BI metadata, it needs to be a &quot;Fill&quot; object, which is why I wrap it in {solid:{color: [value]}}.&lt;br /&gt;&lt;a href=&quot;http://jongallant.com/images/blog/bc08eaa5957e_C044/image_7.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; src=&quot;http://jongallant.com/images/blog/bc08eaa5957e_C044/image_thumb_7.png&quot; style=&quot;background-image: none; display: inline;&quot; title=&quot;image&quot; /&gt;&lt;/a&gt;&lt;br /&gt;See &lt;a href=&quot;https://github.com/jonbgallant/PowerBI-visuals-liquidFillGauge/blob/master/liquidFillGauge/src/visual.ts&quot; target=&quot;_blank&quot;&gt;visual.ts&lt;/a&gt; for complete example of this method.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;3. Get property values with &lt;strong&gt;objectEnumerationUtility.js&lt;/strong&gt;&lt;/h3&gt;Now that you have the values stored in metadata, you&#39;ll want to get the values out and use them in your visual.&amp;nbsp; Power BI provides a sample .js file for doing so.&amp;nbsp; I took their version and added a maxValue optional parameter:&lt;br /&gt;&lt;a href=&quot;http://jongallant.com/images/blog/bc08eaa5957e_C044/image_8.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; src=&quot;http://jongallant.com/images/blog/bc08eaa5957e_C044/image_thumb_8.png&quot; style=&quot;background-image: none; display: inline;&quot; title=&quot;image&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Add &lt;a href=&quot;https://github.com/jonbgallant/PowerBI-visuals-liquidFillGauge/blob/master/liquidFillGauge/src/objectEnumerationUtility.ts&quot; target=&quot;_blank&quot;&gt;this file&lt;/a&gt; to your /src folder and update your tsconfig.json&lt;br /&gt;&lt;a href=&quot;http://jongallant.com/images/blog/bc08eaa5957e_C044/image_9.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; src=&quot;http://jongallant.com/images/blog/bc08eaa5957e_C044/image_thumb_9.png&quot; style=&quot;background-image: none; display: inline;&quot; title=&quot;image&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h3&gt;4. Use a &lt;strong&gt;&quot;settings&quot; object&lt;/strong&gt; as an in-memory property store that you use in your visual.&lt;/h3&gt;Power BI recommends using TypeScript definitions and the visualTransform method for doing what I do here, but I didn&#39;t want to take on anymore overhead than necessary and I wanted to try to do the least amount of code to do the conversion from an existing visual to a Power BI one.&lt;br /&gt;So, I just reused the settings object that was included with the original liquidFillGauge and am using the &quot;getValue&quot; method from objectEnumerationUtility.js.&lt;br /&gt;&lt;blockquote&gt;ISSUE: Power BI does not correctly update the options.type property when a &quot;Style&quot; object is changed.&amp;nbsp; I&#39;ll be able to remove some of the compare code when they fix &lt;a href=&quot;https://github.com/Microsoft/PowerBI-visuals-core/issues/485&quot; target=&quot;_blank&quot;&gt;this bug&lt;/a&gt;.&lt;/blockquote&gt;I created a &quot;getSettings&quot; method that populates the settings object.&amp;nbsp; You just pass in the metadata.object property, propertyGroup key, property key, default value and in some cases a maxValue.&amp;nbsp; Take notice of how I deal with &quot;color&quot; based properties.&amp;nbsp; I use the &quot;Fill&quot; type, wrap the default value in a json object and then call solid.color to get the value into the settings object.&amp;nbsp; You won&#39;t need to do it this way if you are creating from scratch and use the recommended ViewModel approach.&amp;nbsp; I wanted to use the settings object as is and it uses hex, so that&#39;s why I have to do that conversion.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/1d0bb8283729e459d69204e53706a563.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I went through and added properties to change just about every aspect of the liquid fill gauge….including being able to set difference colors for the wave, text and circle.&lt;br /&gt;&lt;a href=&quot;http://jongallant.com/images/blog/bc08eaa5957e_C044/image_11.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; src=&quot;http://jongallant.com/images/blog/bc08eaa5957e_C044/image_thumb_11.png&quot; style=&quot;background-image: none; display: inline;&quot; title=&quot;image&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Jon</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/614898727975710450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/614898727975710450'/><link rel='alternate' type='text/html' href='http://jongallant.blogspot.com/2016/10/powerbi-custom-visual-from-existing-d3-3.html' title='How to Create a Power BI Custom Visual Based on an Existing d3 Visual - Part 3 - Custom Format Properties'/><author><name>Jon Gallant</name><uri>https://plus.google.com/108260055196724354556</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-oEMvFFsC9yE/AAAAAAAAAAI/AAAAAAAADHk/Q0ks4lBpVB0/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-1365818330962585368.post-8775477077062768082</id><published>2016-09-29T15:51:00.001-07:00</published><updated>2016-12-05T22:19:26.564-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dev"/><category scheme="http://www.blogger.com/atom/ns#" term="powerbi"/><title type='text'>How to Create a Power BI Custom Visual Based on an Existing d3 Visual - Part 2 - Capabilities, dataRoles and dataViewMappings</title><content type='html'>&lt;span style=&quot;font-size: large;&quot;&gt;UPDATE: The Liquid Fill Gauge visual is now available to download from the&amp;nbsp;&lt;a href=&quot;https://app.powerbi.com/visuals/show/PBI_CV_94E55AB3_5D45_4B62_A49D_19E2109AA028&quot;&gt;Power BI Custom Visual Gallery&lt;/a&gt;!&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: large;&quot;&gt;--&lt;/span&gt;&lt;br /&gt;This is a continuation of my attempt at creating a Power BI Custom Visual from an OSS d3 visual I found on GitHub.&amp;nbsp; In this post I&#39;m going to focus on the &quot;capabilities&quot; of the visual.&amp;nbsp; Here&#39;s the previous post: &lt;a href=&quot;http://blog.jongallant.com/2016/09/how-to-create-power-bi-custom-visual.html&quot;&gt;How to Create a Power BI Custom Visual Based on an Existing d3 Visual&lt;/a&gt;. It&#39;s a liquidFillGauge that was originally created by &lt;a href=&quot;https://gist.github.com/brattonc/5e5ce9beee483220e2f6&quot; target=&quot;_blank&quot;&gt;Curtis Bratton&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;background-color: white; box-sizing: border-box; color: #333333; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; margin-bottom: 10px;&quot;&gt;This is Part 2 of the series, here are the other posts:&lt;/div&gt;&lt;div style=&quot;background-color: white; box-sizing: border-box; color: #333333; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; margin-bottom: 10px;&quot;&gt;1.&amp;nbsp;&lt;a href=&quot;http://blog.jongallant.com/2016/09/how-to-create-power-bi-custom-visual.html&quot;&gt;How to Create a Power BI Custom Visual Based on an Existing d3 Visual - Part 1 - Dev Env Setup, Reference and Testing&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; box-sizing: border-box; color: #333333; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; margin-bottom: 10px;&quot;&gt;3.&amp;nbsp;&lt;a href=&quot;http://blog.jongallant.com/2016/10/powerbi-custom-visual-from-existing-d3-3.html&quot;&gt;How to Create a Power BI Custom Visual Based on an Existing d3 Visual - Part 3 - Custom Format Properties&lt;/a&gt;&lt;/div&gt;You can install this visual from the GitHub releases page &lt;a href=&quot;https://github.com/jonbgallant/PowerBI-visuals-liquidFillGauge/releases&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;. I&#39;ll put in the &lt;a href=&quot;http://visuals.powerbi.com/&quot; target=&quot;_blank&quot;&gt;Power BI Visual Gallery&lt;/a&gt; once the visual is complete. &lt;br /&gt;&lt;br /&gt;I found &lt;a href=&quot;https://github.com/Microsoft/PowerBI-visuals/blob/master/Tutorial/DataBinding.md&quot; target=&quot;_blank&quot;&gt;this page&lt;/a&gt; helpful when looking into Power BI Custom Visual Data Roles.&lt;br /&gt;&lt;br /&gt;Here&#39;s what the Liquid Fill Gauge looks like in Power BI.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://jongallant.com/images/blog/53494a0089db_D4F8/image.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; src=&quot;http://jongallant.com/images/blog/53494a0089db_D4F8/image_thumb.png&quot; height=&quot;307&quot; style=&quot;background-image: none; display: inline;&quot; title=&quot;image&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In the root of your project you have a capabilities.json file. This is where you define how the user can assign data to your visual. Each &quot;dataRole&quot; that you define in this file can be a &quot;Grouping&quot;, &quot;Measure&quot; or &quot;GroupingOrMeasure&quot; data role.&amp;nbsp; I think about it like this: Grouping is like categories of data, sets of data, whereas Measure is a single value…GroupingOrMeasure is when the value can either be a Grouping or a Measure.&lt;br /&gt;&lt;br /&gt;In the case of the liquidFillGauge, we really only need to assign one value at this point - the fill percentage.&amp;nbsp; The first version of the visual used the default capabilities.json file that comes with the template when created via &quot;pbiviz new visualName&quot;.&lt;br /&gt;&lt;br /&gt;The default capabilities comes with two dataRoles &quot;Grouping&quot; and &quot;Measure&quot; like so:&lt;br /&gt;&lt;a href=&quot;http://jongallant.com/images/blog/53494a0089db_D4F8/image_3.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; src=&quot;http://jongallant.com/images/blog/53494a0089db_D4F8/image_thumb_3.png&quot; style=&quot;background-image: none; display: inline;&quot; title=&quot;image&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/75f312fa9cc27ea0780e805a3a600127.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;Since we only need a single value (at the moment, but we might need more in the future). We can remove the Grouping field and change the name, like so:&lt;br /&gt;&lt;br /&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/c7ebf8116b1420035437051c933f3f46.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;And if you just use that you&#39;ll see this:&lt;br /&gt;&lt;a href=&quot;http://jongallant.com/images/blog/53494a0089db_D4F8/image_4.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; src=&quot;http://jongallant.com/images/blog/53494a0089db_D4F8/image_thumb_4.png&quot; style=&quot;background-image: none; display: inline;&quot; title=&quot;image&quot; /&gt;&lt;/a&gt;&lt;br /&gt;What you need to do is define a dataViewMappings object that tells the visual how to represent the dataRoles in the dataView. Again, this is a super simple visual right now, so all we need to do is map the single value.&amp;nbsp; I&#39;ve seen examples where &quot;role&quot; is equal to &quot;Values&quot;, but removing it doesn&#39;t seem to impact anything, so I&#39;m leaving it as an empty string.&lt;br /&gt;&lt;br /&gt;You&#39;ll also need to add the &quot;object&quot; property, I explain that in &lt;a href=&quot;http://blog.jongallant.com/2016/10/powerbi-custom-visual-from-existing-d3-3.html&quot;&gt;Part 3&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Open capabilities.json and add this code:&lt;br /&gt;&lt;br /&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/6b4a4cc023252152a9864ab762814177.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;Your visualization pane should now look like this:&lt;br /&gt;&lt;a href=&quot;http://jongallant.com/images/blog/53494a0089db_D4F8/image_5.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; src=&quot;http://jongallant.com/images/blog/53494a0089db_D4F8/image_thumb_5.png&quot; style=&quot;background-image: none; display: inline;&quot; title=&quot;image&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And your format property pane will look like this:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-JH6BSrqqlJU/WEZXGqA-iDI/AAAAAAAAS5k/b2qSEPKsS6goiSihWfhQmUqc7JcKrNUYwCLcB/s1600/2016-12-05%2B22_13_06-Power%2BBI.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://1.bp.blogspot.com/-JH6BSrqqlJU/WEZXGqA-iDI/AAAAAAAAS5k/b2qSEPKsS6goiSihWfhQmUqc7JcKrNUYwCLcB/s1600/2016-12-05%2B22_13_06-Power%2BBI.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The resulting visual is the same as the original. We just now have cleaner data and format panes….and less code.&lt;br /&gt;&lt;br /&gt;Keep following along in &lt;a href=&quot;http://blog.jongallant.com/2016/10/powerbi-custom-visual-from-existing-d3-3.html&quot;&gt;Part 3&lt;/a&gt;...&lt;br /&gt;Jon</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/8775477077062768082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/8775477077062768082'/><link rel='alternate' type='text/html' href='http://jongallant.blogspot.com/2016/09/powerbi-custom-visual-from-existing-d3-2.html' title='How to Create a Power BI Custom Visual Based on an Existing d3 Visual - Part 2 - Capabilities, dataRoles and dataViewMappings'/><author><name>Jon Gallant</name><uri>https://plus.google.com/108260055196724354556</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-oEMvFFsC9yE/AAAAAAAAAAI/AAAAAAAADHk/Q0ks4lBpVB0/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-JH6BSrqqlJU/WEZXGqA-iDI/AAAAAAAAS5k/b2qSEPKsS6goiSihWfhQmUqc7JcKrNUYwCLcB/s72-c/2016-12-05%2B22_13_06-Power%2BBI.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-1365818330962585368.post-1170419831787838764</id><published>2016-09-29T15:05:00.001-07:00</published><updated>2016-09-29T15:05:44.249-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dev"/><category scheme="http://www.blogger.com/atom/ns#" term="powerbi"/><category scheme="http://www.blogger.com/atom/ns#" term="solution"/><title type='text'>Solution: Power BI - &quot;Can&#39;t contact visual server. Please make sure the visual server is running and configured correctly.&quot;</title><content type='html'>&lt;p&gt;You might see this error message when trying to load the Power BI Custom Visual “Development Visual”&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/a8b9878aa949_D128/image.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/a8b9878aa949_D128/image_thumb.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;“Can’t contact visual server. Please make sure the visual server is running and configured correctly”.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;1. Make sure local server is started by running “pbiviz start” from the project root.&lt;/p&gt;&lt;p&gt;2. Make sure the certificate is installed by running “pbiviz --install-cert&quot; and follow &lt;a href=&quot;https://github.com/Microsoft/PowerBI-visuals/blob/master/tools/CertificateSetup.md&quot; target=&quot;_blank&quot;&gt;these instructions&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;If the above doesn&#39;t work, try installing the cert using the following settings.&lt;/p&gt;&lt;p&gt;&quot;Local Machine&quot;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/a8b9878aa949_D128/image_3.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/a8b9878aa949_D128/image_thumb_3.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&quot;Automatically Select…&quot;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/a8b9878aa949_D128/image_4.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/a8b9878aa949_D128/image_thumb_4.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;If it still doesn&#39;t work, then file an issue here: &lt;a title=&quot;https://github.com/Microsoft/PowerBI-visuals/issues&quot; href=&quot;https://github.com/Microsoft/PowerBI-visuals/issues&quot;&gt;https://github.com/Microsoft/PowerBI-visuals/issues&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Jon&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/1170419831787838764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/1170419831787838764'/><link rel='alternate' type='text/html' href='http://jongallant.blogspot.com/2016/09/powerbi-cant-contact-visual-server.html' title='Solution: Power BI - &quot;Can&#39;t contact visual server. Please make sure the visual server is running and configured correctly.&quot;'/><author><name>Jon Gallant</name><uri>https://plus.google.com/108260055196724354556</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-oEMvFFsC9yE/AAAAAAAAAAI/AAAAAAAADHk/Q0ks4lBpVB0/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-1365818330962585368.post-4167494787610905274</id><published>2016-09-25T12:09:00.001-07:00</published><updated>2016-12-05T22:19:05.438-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="d3"/><category scheme="http://www.blogger.com/atom/ns#" term="dev"/><category scheme="http://www.blogger.com/atom/ns#" term="howto"/><category scheme="http://www.blogger.com/atom/ns#" term="nodejs"/><category scheme="http://www.blogger.com/atom/ns#" term="powerbi"/><title type='text'>How to Create a Power BI Custom Visual Based on an Existing d3 Visual - Part 1 - Dev Env Setup, Reference and Testing</title><content type='html'>&lt;span style=&quot;font-size: large;&quot;&gt;UPDATE: The Liquid Fill Gauge visual is now available to download from the &lt;a href=&quot;https://app.powerbi.com/visuals/show/PBI_CV_94E55AB3_5D45_4B62_A49D_19E2109AA028&quot;&gt;Power BI Custom Visual Gallery&lt;/a&gt;!&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: large;&quot;&gt;--&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I’ve been digging into the new &lt;a href=&quot;https://github.com/microsoft/powerbi-visuals-tools&quot; target=&quot;_blank&quot;&gt;Power BI Custom Visual SDK&lt;/a&gt; and just pushed my first visual called &lt;a href=&quot;https://github.com/jonbgallant/PowerBI-visuals-liquidFillGauge&quot;&gt;Liquid Fill Gauge&lt;/a&gt;.&amp;nbsp; It’s a circle gauge that represents a percentage value. All it does at the moment is display the value and nothing is configurable. I will continue to push new features as I finish them. It is based off of &lt;a href=&quot;https://gist.github.com/brattonc/5e5ce9beee483220e2f6&quot; target=&quot;_blank&quot;&gt;Curtis Bratton&lt;/a&gt;’s &lt;a href=&quot;https://gist.github.com/brattonc/5e5ce9beee483220e2f6&quot; target=&quot;_blank&quot;&gt;Liquid Fill Gauge&lt;/a&gt;. The premise of this post is to take an existing open source d3 visual and see how easy it is to create a Power BI Custom Visual out of it.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;background-color: white; box-sizing: border-box; color: #333333; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; margin-bottom: 10px;&quot;&gt;This is Part 1 of the series, here are the other posts:&lt;/div&gt;&lt;div style=&quot;background-color: white; box-sizing: border-box; color: #333333; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; margin-bottom: 10px;&quot;&gt;2.&amp;nbsp;&lt;a href=&quot;http://blog.jongallant.com/2016/09/powerbi-custom-visual-from-existing-d3-2.html&quot;&gt;How to Create a Power BI Custom Visual Based on an Existing d3 Visual - Part 2 - Capabilities, dataRoles and dataViewMappings&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; box-sizing: border-box; color: #333333; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; margin-bottom: 10px;&quot;&gt;3.&amp;nbsp;&lt;a href=&quot;http://blog.jongallant.com/2016/10/powerbi-custom-visual-from-existing-d3-3.html&quot; style=&quot;box-sizing: border-box; color: #4d469c;&quot;&gt;How to Create a Power BI Custom Visual Based on an Existing d3 Visual - Part 3 - Custom Format Properties&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; box-sizing: border-box; color: #333333; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 14px; margin-bottom: 10px;&quot;&gt;&lt;br /&gt;&lt;/div&gt;You can download the visual and use within your reports here: &lt;a href=&quot;https://github.com/jonbgallant/PowerBI-visuals-liquidFillGauge/releases/&quot; title=&quot;https://github.com/jonbgallant/PowerBI-visuals-liquidFillGauge/releases/&quot;&gt;https://github.com/jonbgallant/PowerBI-visuals-liquidFillGauge/releases/&lt;/a&gt;&lt;br /&gt;&lt;img src=&quot;https://raw.githubusercontent.com/jonbgallant/PowerBI-visuals-liquidFillGauge/master/assets/thumbnail.png&quot; /&gt;&lt;br /&gt;&lt;h3&gt;Setup Power BI Custom Visual Dev Environment&lt;/h3&gt;Follow the instructions here to get your dev env setup: &lt;a href=&quot;http://blog.jongallant.com/2016/09/powerbi-custom-visual-dev.html&quot; title=&quot;http://blog.jongallant.com/2016/09/powerbi-custom-visual-dev.html&quot;&gt;http://blog.jongallant.com/2016/09/powerbi-custom-visual-dev.html&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;Clone Repo&lt;/h2&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/62ad919b9609349b73f9fa161ea97ec9.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;&lt;h2&gt;Open Code&lt;/h2&gt;&lt;span class=&quot;wlWriterPreserve&quot;&gt;I use &lt;a href=&quot;http://code.visualstudio.com/&quot; target=&quot;_blank&quot;&gt;VS Code&lt;/a&gt;, but feel free to use any editor.&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;wlWriterPreserve&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;wlWriterPreserve&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;wlWriterPreserve&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span class=&quot;wlWriterPreserve&quot;&gt;I walk through each step below – feel free to skim through it, use it as a reference or follow along step-by-step.&lt;/span&gt;&lt;/blockquote&gt;&lt;span class=&quot;wlWriterPreserve&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;h2&gt;Create Custom Visual&lt;/h2&gt;This uses the new SDK to create a custom visual template.&lt;br /&gt;&lt;br /&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/3208252605ba09dabf10e7e55a239a1e.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;This is what the dir structure looks like in VS Code.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://jongallant.com/images/blog/powerbi-custom-visual-from-d3_A9E3/image_thumb3.png&quot;&gt;&lt;img alt=&quot;image_thumb3&quot; border=&quot;0&quot; src=&quot;http://jongallant.com/images/blog/powerbi-custom-visual-from-d3_A9E3/image_thumb3_thumb.png&quot; style=&quot;background-image: none; border: 0px; display: inline;&quot; title=&quot;image_thumb3&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;Reference d3 Typings&lt;/h2&gt;You create Custom Visuals using TypeScript and d3, but d3 isn’t referenced by default in the new Custom Visual SDK. Here’s how to get it installed and referenced so TypeScript can see it.&lt;br /&gt;&lt;h3&gt;Go to this post for instructions on how to add d3 to your visual and then come back here.&lt;/h3&gt;&lt;h3&gt;&lt;a href=&quot;http://blog.jongallant.com/2016/11/pbiviz-12-d3-35-reference.html&quot;&gt;http://blog.jongallant.com/2016/11/pbiviz-12-d3-35-reference.html&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;h2&gt;Add liquidFillGauge.js File&lt;/h2&gt;1. Create a file in the “src” folder called “liquidFillGauge.js”.&lt;br /&gt;2. Copy the code from the following file into it. If you cloned the repo, you will have this file locally as well.&lt;br /&gt;&lt;a href=&quot;https://raw.githubusercontent.com/jonbgallant/PowerBI-visuals-liquidFillGauge/master/liquidFillGauge/src/liquidFillGauge.js&quot; title=&quot;https://raw.githubusercontent.com/jonbgallant/PowerBI-visuals-liquidFillGauge/master/liquidFillGauge/src/liquidFillGauge.js&quot;&gt;https://raw.githubusercontent.com/jonbgallant/PowerBI-visuals-liquidFillGauge/master/liquidFillGauge/src/liquidFillGauge.js&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;=====The following is informational only, &amp;nbsp;you do not need to make these changes===&lt;br /&gt;&lt;br /&gt;The liquidFillGauge was originally pushed to GitHub as a stand alone d3 visual.&amp;nbsp; I only had to change a the following two things about it for it to work with Power BI.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;PowerBI puts all Custom Visuals in IFRAMEs so the clip-path needs to reference the absolute url of the page like so:&lt;/li&gt;&lt;/ul&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/b33fea7fa07be8ad358b9301f464a6e7.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Once I deployed my visual to PowerBI.com I ran into another IFRAME issue that required me to pass in the d3 selection instance, versus doing the d3.select inside the visual. Instead of passing in elementId, I pass in a reference to the svg element&lt;/li&gt;&lt;/ul&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/5feda8ea55d44170fbbfb10e9ad6414b.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Add TypeScript Definition File&lt;/h2&gt;The premise of this exercise is to take an existing d3 visual and easily turn it into a custom visual without having to rewrite the entire thing in TypeScript. What I would like to do is clone the existing visual and reference it from my visual.ts file. In order to do that, I need to make the visual file visual in TypeScript. You could define all of the methods and come up with a more sophisticated definition file, but I’ve found that the following works great.&lt;br /&gt;&lt;br /&gt;1. Create a new file in the “src” folder called “liquidFillGauge.d.ts” and add the following code to it.&lt;br /&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/4d18962fd69c800520328bdcd8e78d69.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Add liquidFillGauge files to tsconfig.json&lt;/h2&gt;1. Open tsconfig.json and add references to the liquidFillGauge.js and liquidFillGauge.d.ts files.&lt;br /&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/139a55548676ed79236212f122ce0b54.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;&lt;h2&gt;Add liquidFillGauge to visual.ts&lt;/h2&gt;1. Open visual.ts and copy the following code into it.&lt;br /&gt;&lt;br /&gt;The final step is to add code to the visual.ts file that will call the liquidFillGauge methods and create the visual.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Notice the amd-dependency line at the top.&amp;nbsp; This maps the TypeScript type definition to the visual.ts file so we can call loadLiquidFileGage that is in the liquidFillGauge file.&lt;/li&gt;&lt;li&gt;I added another local variable to hold a reference to the gauge and then either call loadLiquidFillGauge for the first load or call this.gauge.update for subsequent calls.&lt;/li&gt;&lt;/ul&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/111e9248c03c97cd64b6c0082241d2c6.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;&lt;h2&gt;Test on PowerBI.com&lt;/h2&gt;1. Start your local server&lt;br /&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/ae1916aea0446adfad0ba2e884793575.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;2. Go to &lt;a href=&quot;http://app.powerbi.com/&quot;&gt;http://app.powerbi.com&lt;/a&gt;&lt;br /&gt;3. Create a report that uses your visual&lt;br /&gt;4. Map a data value to the “Measure Data” field. I’m using the Month column in the Dates table in the Customer Profitability Sample dataset.&lt;br /&gt;&lt;a href=&quot;http://jongallant.com/images/blog/powerbi-custom-visual-from-d3_A9E3/image_thumb11.png&quot;&gt;&lt;img alt=&quot;image_thumb11&quot; border=&quot;0&quot; src=&quot;http://jongallant.com/images/blog/powerbi-custom-visual-from-d3_A9E3/image_thumb11_thumb.png&quot; style=&quot;background-image: none; border: 0px; display: inline;&quot; title=&quot;image_thumb11&quot; /&gt;&lt;/a&gt;&lt;br /&gt;5. You should then see your custom visual rendered.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://jongallant.com/images/blog/powerbi-custom-visual-from-d3_A9E3/image_thumb13.png&quot;&gt;&lt;img alt=&quot;image_thumb13&quot; border=&quot;0&quot; src=&quot;http://jongallant.com/images/blog/powerbi-custom-visual-from-d3_A9E3/image_thumb13_thumb.png&quot; style=&quot;background-image: none; border: 0px; display: inline;&quot; title=&quot;image_thumb13&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you do not see it, then compare your code to the code in this &lt;a href=&quot;https://github.com/jonbgallant/PowerBI-visuals-liquidFillGauge&quot; target=&quot;_blank&quot;&gt;GitHub repo&lt;/a&gt; and fix anything that is different.&lt;br /&gt;&lt;br /&gt;--&lt;br /&gt;Hope this gets you on your way to creating your own visuals.&lt;br /&gt;Jon</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/4167494787610905274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/4167494787610905274'/><link rel='alternate' type='text/html' href='http://jongallant.blogspot.com/2016/09/how-to-create-power-bi-custom-visual.html' title='How to Create a Power BI Custom Visual Based on an Existing d3 Visual - Part 1 - Dev Env Setup, Reference and Testing'/><author><name>Jon Gallant</name><uri>https://plus.google.com/108260055196724354556</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-oEMvFFsC9yE/AAAAAAAAAAI/AAAAAAAADHk/Q0ks4lBpVB0/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-1365818330962585368.post-4805664598125015569</id><published>2016-09-20T21:24:00.001-07:00</published><updated>2016-09-20T21:24:18.054-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="nodejs"/><category scheme="http://www.blogger.com/atom/ns#" term="powerbi"/><title type='text'>Power BI Custom Visual Dev Environment Setup Quickstart</title><content type='html'>&lt;p&gt;Power BI recently released their new Custom Visual SDK. If you were exposed to the old SDK you will quickly realize how much better this one is.&amp;nbsp; Here&#39;s a quickstart guide that should have your Custom Visual dev environment up and running in a few minutes.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Related Links&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Release Announcement: &lt;a title=&quot;https://powerbi.microsoft.com/en-us/blog/power-bi-custom-visuals-developer-tools-hit-v1/&quot; href=&quot;https://powerbi.microsoft.com/en-us/blog/power-bi-custom-visuals-developer-tools-hit-v1/&quot;&gt;https://powerbi.microsoft.com/en-us/blog/power-bi-custom-visuals-developer-tools-hit-v1/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;SDK: &lt;a title=&quot;https://github.com/Microsoft/PowerBI-visuals-tools&quot; href=&quot;https://github.com/Microsoft/PowerBI-visuals-tools&quot;&gt;https://github.com/Microsoft/PowerBI-visuals-tools&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Docs: &lt;a title=&quot;https://github.com/Microsoft/PowerBI-visuals&quot; href=&quot;https://github.com/Microsoft/PowerBI-visuals&quot;&gt;https://github.com/Microsoft/PowerBI-visuals&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Sample: &lt;a title=&quot;https://github.com/Microsoft/PowerBI-visuals-sampleBarChart&quot; href=&quot;https://github.com/Microsoft/PowerBI-visuals-sampleBarChart&quot;&gt;https://github.com/Microsoft/PowerBI-visuals-sampleBarChart&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Visuals Gallery: &lt;a href=&quot;http://visuals.powerbi.com&quot;&gt;http://visuals.powerbi.com&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;0. Install Node.js &lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;http://nodejs.org&quot;&gt;http://nodejs.org&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;1. Install SDK&lt;/h2&gt;&lt;p&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/84819f7b4bad6b6e5697f8649920a59f.js&quot;&gt;&lt;/script&gt;&lt;/p&gt;&lt;h2&gt;2. Install Local Cert&lt;/h2&gt;&lt;p&gt;Allows you to surface your visual to PowerBI as you develop it. Full instructions &lt;a href=&quot;https://github.com/Microsoft/PowerBI-visuals/blob/master/tools/CertificateSetup.md&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/fa69597fc2f2bfa7c3820bc5be988658.js&quot;&gt;&lt;/script&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Current User --&amp;gt; Trusted Root Certification Authorities&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;3. Enable Developer Visual&lt;/h2&gt;&lt;p&gt;Go here: &lt;a title=&quot;https://msit.powerbi.com/groups/me/settings/general/plugins&quot; href=&quot;https://app.powerbi.com/groups/me/settings/general/plugins&quot;&gt;https://app.powerbi.com/groups/me/settings/general/plugins&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Check &quot;Enable developer visual for testing&quot;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/de95492d9558_12521/image.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/de95492d9558_12521/image_thumb.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;4. Create Test Visual&lt;/h2&gt;&lt;p&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/ac9135fcedcaaaa32fe85cbf9d0cf3ab.js&quot;&gt;&lt;/script&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/de95492d9558_12521/image_3.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/de95492d9558_12521/image_thumb_3.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/de95492d9558_12521/image_4.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/de95492d9558_12521/image_thumb_4.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;5. Start Local Visual Dev Server&lt;/h2&gt;&lt;p&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/5ca6794c222d3409e2c994faae3ce302.js&quot;&gt;&lt;/script&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/de95492d9558_12521/image_5.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/de95492d9558_12521/image_thumb_5.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;6. Test on PowerBI.com&lt;/h2&gt;&lt;p&gt;Go to &lt;a href=&quot;http://app.powerbi.com&quot;&gt;http://app.powerbi.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Open any Dataset and click on the new Developer Visual icon in the Visualizations pane&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/de95492d9558_12521/image_6.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/de95492d9558_12521/image_thumb_6.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;You should then see the custom visual render&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/de95492d9558_12521/image_7.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/de95492d9558_12521/image_thumb_7.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Troubleshooting/debugging tips are &lt;a href=&quot;https://github.com/Microsoft/PowerBI-visuals/blob/master/tools/usage.md#debugging&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt; and &lt;a href=&quot;https://github.com/Microsoft/PowerBI-visuals/blob/master/tools/debugging.md&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt; if you don&#39;t see your visual.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;More Power BI dev posts to come soon.&lt;/p&gt;&lt;p&gt;Jon&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/4805664598125015569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/4805664598125015569'/><link rel='alternate' type='text/html' href='http://jongallant.blogspot.com/2016/09/powerbi-custom-visual-dev.html' title='Power BI Custom Visual Dev Environment Setup Quickstart'/><author><name>Jon Gallant</name><uri>https://plus.google.com/108260055196724354556</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-oEMvFFsC9yE/AAAAAAAAAAI/AAAAAAAADHk/Q0ks4lBpVB0/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-1365818330962585368.post-1249181925416331969</id><published>2016-09-16T11:56:00.001-07:00</published><updated>2016-09-16T11:56:55.958-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="azureiot"/><category scheme="http://www.blogger.com/atom/ns#" term="powerbi"/><title type='text'>Explore the Azure IoT Certified Devices with Power BI</title><content type='html'>&lt;p&gt;What do you do when you find a static table online that you want to quickly slice and dice? Enter &lt;a href=&quot;http://powerbi.com&quot; target=&quot;_blank&quot;&gt;Power BI&lt;/a&gt;.&amp;nbsp; Here’s the resulting Power BI report…details on how I created it below…&lt;/p&gt;&lt;p&gt;&lt;iframe width=&quot;800&quot; height=&quot;600&quot; src=&quot;https://app.powerbi.com/view?r=eyJrIjoiOGY4ZmZkOGItYWRjMy00MmNiLWJjNzItY2RlYjU2NDBhN2MzIiwidCI6IjcyZjk4OGJmLTg2ZjEtNDFhZi05MWFiLTJkN2NkMDExZGI0NyIsImMiOjV9&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;How this report was created…&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The Azure IoT Certified Device list is published by the Azure IoT team here: &lt;a title=&quot;https://azure.microsoft.com/en-us/documentation/articles/iot-hub-tested-configurations/#certified-for-iot-devices&quot; href=&quot;https://azure.microsoft.com/en-us/documentation/articles/iot-hub-tested-configurations/#certified-for-iot-devices&quot;&gt;https://azure.microsoft.com/en-us/documentation/articles/iot-hub-tested-configurations/#certified-for-iot-devices&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I used &lt;a href=&quot;https://powerbi.microsoft.com/en-us/desktop/&quot; target=&quot;_blank&quot;&gt;Power BI Desktop&lt;/a&gt; - Get Data -&amp;gt; Web Connector.&amp;nbsp; Entered that URL and it presented me with all the tables on that page.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/azure-iot-certified-devices-power-bi_A7B4/image_thumb11.png&quot;&gt;&lt;img width=&quot;615&quot; height=&quot;317&quot; title=&quot;image_thumb[11]&quot; style=&quot;margin: 0px; border: 0px currentcolor; border-image: none; display: inline; background-image: none;&quot; alt=&quot;image_thumb[11]&quot; src=&quot;http://jongallant.com/images/blog/azure-iot-certified-devices-power-bi_A7B4/image_thumb11_thumb.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/azure-iot-certified-devices-power-bi_A7B4/image_thumb12.png&quot;&gt;&lt;img width=&quot;613&quot; height=&quot;258&quot; title=&quot;image_thumb[12]&quot; style=&quot;margin: 0px; border: 0px currentcolor; border-image: none; display: inline; background-image: none;&quot; alt=&quot;image_thumb[12]&quot; src=&quot;http://jongallant.com/images/blog/azure-iot-certified-devices-power-bi_A7B4/image_thumb12_thumb.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/azure-iot-certified-devices-power-bi_A7B4/image_thumb13.png&quot;&gt;&lt;img width=&quot;714&quot; height=&quot;701&quot; title=&quot;image_thumb[13]&quot; style=&quot;margin: 0px; border: 0px currentcolor; border-image: none; display: inline; background-image: none;&quot; alt=&quot;image_thumb[13]&quot; src=&quot;http://jongallant.com/images/blog/azure-iot-certified-devices-power-bi_A7B4/image_thumb13_thumb.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Clicked Edit Queries&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/azure-iot-certified-devices-power-bi_A7B4/image_thumb14.png&quot;&gt;&lt;img width=&quot;373&quot; height=&quot;296&quot; title=&quot;image_thumb[14]&quot; style=&quot;margin: 0px; border: 0px currentcolor; border-image: none; display: inline; background-image: none;&quot; alt=&quot;image_thumb[14]&quot; src=&quot;http://jongallant.com/images/blog/azure-iot-certified-devices-power-bi_A7B4/image_thumb14_thumb.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Did some scrubbing for similar values&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/azure-iot-certified-devices-power-bi_A7B4/image_thumb15.png&quot;&gt;&lt;img width=&quot;368&quot; height=&quot;253&quot; title=&quot;image_thumb[15]&quot; style=&quot;margin: 0px; border: 0px currentcolor; border-image: none; display: inline; background-image: none;&quot; alt=&quot;image_thumb[15]&quot; src=&quot;http://jongallant.com/images/blog/azure-iot-certified-devices-power-bi_A7B4/image_thumb15_thumb.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/azure-iot-certified-devices-power-bi_A7B4/image_thumb16.png&quot;&gt;&lt;img width=&quot;358&quot; height=&quot;241&quot; title=&quot;image_thumb[16]&quot; style=&quot;margin: 0px; border: 0px currentcolor; border-image: none; display: inline; background-image: none;&quot; alt=&quot;image_thumb[16]&quot; src=&quot;http://jongallant.com/images/blog/azure-iot-certified-devices-power-bi_A7B4/image_thumb16_thumb.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Clicked Close and Apply&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/azure-iot-certified-devices-power-bi_A7B4/image_thumb17.png&quot;&gt;&lt;img width=&quot;370&quot; height=&quot;159&quot; title=&quot;image_thumb[17]&quot; style=&quot;margin: 0px; border: 0px currentcolor; border-image: none; display: inline; background-image: none;&quot; alt=&quot;image_thumb[17]&quot; src=&quot;http://jongallant.com/images/blog/azure-iot-certified-devices-power-bi_A7B4/image_thumb17_thumb.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Created a OS and Language slicer&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/azure-iot-certified-devices-power-bi_A7B4/image_thumb18.png&quot;&gt;&lt;img width=&quot;868&quot; height=&quot;288&quot; title=&quot;image_thumb[18]&quot; style=&quot;margin: 0px; border: 0px currentcolor; border-image: none; display: inline; background-image: none;&quot; alt=&quot;image_thumb[18]&quot; src=&quot;http://jongallant.com/images/blog/azure-iot-certified-devices-power-bi_A7B4/image_thumb18_thumb.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Clicked Publish, which pushes the report to Power BI Web&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/azure-iot-certified-devices-power-bi_A7B4/image_thumb19.png&quot;&gt;&lt;img width=&quot;91&quot; height=&quot;119&quot; title=&quot;image_thumb[19]&quot; style=&quot;margin: 0px; border: 0px currentcolor; border-image: none; display: inline; background-image: none;&quot; alt=&quot;image_thumb[19]&quot; src=&quot;http://jongallant.com/images/blog/azure-iot-certified-devices-power-bi_A7B4/image_thumb19_thumb.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Went to Web, Clicked “File -&amp;gt; Publish to Web”&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/azure-iot-certified-devices-power-bi_A7B4/image_thumb20.png&quot;&gt;&lt;img width=&quot;413&quot; height=&quot;225&quot; title=&quot;image_thumb[20]&quot; style=&quot;margin: 0px; border: 0px currentcolor; border-image: none; display: inline; background-image: none;&quot; alt=&quot;image_thumb[20]&quot; src=&quot;http://jongallant.com/images/blog/azure-iot-certified-devices-power-bi_A7B4/image_thumb20_thumb.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Copied the Embed code and pasted it into this page&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/azure-iot-certified-devices-power-bi_A7B4/image_thumb21.png&quot;&gt;&lt;img width=&quot;558&quot; height=&quot;377&quot; title=&quot;image_thumb[21]&quot; style=&quot;margin: 0px; border: 0px currentcolor; border-image: none; display: inline; background-image: none;&quot; alt=&quot;image_thumb[21]&quot; src=&quot;http://jongallant.com/images/blog/azure-iot-certified-devices-power-bi_A7B4/image_thumb21_thumb.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Jon&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/1249181925416331969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/1249181925416331969'/><link rel='alternate' type='text/html' href='http://jongallant.blogspot.com/2016/09/azure-iot-certified-devices-power-bi.html' title='Explore the Azure IoT Certified Devices with Power BI'/><author><name>Jon Gallant</name><uri>https://plus.google.com/108260055196724354556</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-oEMvFFsC9yE/AAAAAAAAAAI/AAAAAAAADHk/Q0ks4lBpVB0/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-1365818330962585368.post-2166039958863228385</id><published>2016-09-11T19:05:00.001-07:00</published><updated>2016-10-13T16:10:45.110-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="howto"/><category scheme="http://www.blogger.com/atom/ns#" term="iot"/><category scheme="http://www.blogger.com/atom/ns#" term="nodejs"/><category scheme="http://www.blogger.com/atom/ns#" term="raspberrypi"/><title type='text'>How to Create a Raspberry Pi (Raspbian) Base Image for Node.js Development</title><content type='html'>Here are some short and sweet instructions for setting up your Raspberry Pi for Node.js dev and creating a base image that can be used over and over again. Many of the steps below are taken from the amazing &lt;a href=&quot;http://thisdavej.com/beginners-guide-to-installing-node-js-on-a-raspberry-pi/&quot; target=&quot;_blank&quot;&gt;DaveJ&lt;/a&gt; posts and I added a few steps that I like to do as well.&amp;nbsp; You can read his posts for more context on why I’m doing what I’m doing.&lt;br /&gt;&lt;a href=&quot;http://jongallant.com/images/blog/6743deaa595b_69EB/image_15.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; src=&quot;http://jongallant.com/images/blog/6743deaa595b_69EB/image_thumb_15.png&quot; style=&quot;background-image: none; display: inline;&quot; title=&quot;image&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;0. Choose your SD Card size wisely&lt;/h2&gt;&lt;div&gt;IMPORTANT: Make sure you use an SD card that is smaller than your target SD card or else you won&#39;t be able to copy this image to it later.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For example, I&#39;m doing this on an 8GB card for my base image, but will use 32GB cards for instances of this base image. &amp;nbsp;You could use 32GB for both, but you&#39;ll have to figure out how to shrink the image, which just adds time to things and ain&#39;t easy on Windows.&lt;/div&gt;&lt;h2&gt;1. Format SD Card using Windows Disk Management&lt;/h2&gt;&lt;br /&gt;This step is optional, but probably a good thing to do so you know you are starting off with a clean SD Card.&lt;br /&gt;&lt;a href=&quot;http://jongallant.com/images/blog/6743deaa595b_69EB/image.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; src=&quot;http://jongallant.com/images/blog/6743deaa595b_69EB/image_thumb.png&quot; style=&quot;background-image: none; display: inline;&quot; title=&quot;image&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;2. Flash &lt;a href=&quot;https://www.raspberrypi.org/downloads/raspbian/&quot; target=&quot;_blank&quot;&gt;Raspbian&lt;/a&gt; to SD Card using &lt;a href=&quot;https://sourceforge.net/projects/win32diskimager/&quot; target=&quot;_blank&quot;&gt;Win32 Disk Imager&lt;/a&gt;&lt;/h2&gt;&lt;a href=&quot;http://jongallant.com/images/blog/6743deaa595b_69EB/image_3.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; src=&quot;http://jongallant.com/images/blog/6743deaa595b_69EB/image_thumb_3.png&quot; style=&quot;background-image: none; display: inline;&quot; title=&quot;image&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;3. Insert Card in Raspberry Pi and Power On&lt;/h2&gt;&lt;h2&gt;4. Setup Wifi&lt;/h2&gt;Click on Wifi icon in top right. Select your network.&lt;br /&gt;&lt;h2&gt;5. Install Raspbian Updates&lt;/h2&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/32e11482b5f4847413cd479548689a3f.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;&lt;h2&gt;6. Enable Remote Access&lt;/h2&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/d56700b4d6972a8ce71f232e475ba2a9.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;&lt;h2&gt;&lt;br /&gt;&lt;/h2&gt;&lt;h2&gt;6.5 Rename your PI&lt;/h2&gt;&lt;div&gt;Give it a unique name in Raspberry Pi Config - do this now or you will have issues later.&lt;/div&gt;&lt;div&gt;&lt;img alt=&quot;image&quot; src=&quot;https://images-blogger-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2Fjongallant.com%2Fimages%2Fblog%2F6743deaa595b_69EB%2Fimage_thumb_6.png&amp;amp;container=blogger&amp;amp;gadget=a&amp;amp;rewriteMime=image%2F*&quot; /&gt;&lt;/div&gt;&lt;h2&gt;7. Login to Pi from Windows&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://jongallant.com/images/blog/6743deaa595b_69EB/image_4.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; src=&quot;http://jongallant.com/images/blog/6743deaa595b_69EB/image_thumb_4.png&quot; style=&quot;background-image: none; display: inline;&quot; title=&quot;image&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://jongallant.com/images/blog/6743deaa595b_69EB/image_5.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; src=&quot;http://jongallant.com/images/blog/6743deaa595b_69EB/image_thumb_5.png&quot; style=&quot;background-image: none; display: inline;&quot; title=&quot;image&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Consolas;&quot;&gt;username: pi&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Consolas;&quot;&gt;password: raspberry&lt;/span&gt;&lt;br /&gt;&lt;h2&gt;7. Configuration&lt;/h2&gt;&lt;strong&gt;System: &lt;/strong&gt;&lt;br /&gt;&lt;li&gt;Click Expand Filesystem&lt;/li&gt;&lt;li&gt;Change Password&lt;/li&gt;&lt;li&gt;Change Hostname – to anything you want.&lt;/li&gt;&lt;a href=&quot;http://jongallant.com/images/blog/6743deaa595b_69EB/image_6.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; src=&quot;http://jongallant.com/images/blog/6743deaa595b_69EB/image_thumb_6.png&quot; style=&quot;background-image: none; display: inline;&quot; title=&quot;image&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Interfaces: &lt;/strong&gt;&lt;br /&gt;&lt;li&gt;Enable All Interfaces&lt;/li&gt;&lt;a href=&quot;http://jongallant.com/images/blog/6743deaa595b_69EB/image_7.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; src=&quot;http://jongallant.com/images/blog/6743deaa595b_69EB/image_thumb_7.png&quot; style=&quot;background-image: none; display: inline;&quot; title=&quot;image&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Localisation:&lt;/strong&gt;&lt;br /&gt;&lt;li&gt;Set Locale&lt;/li&gt;&lt;a href=&quot;http://jongallant.com/images/blog/6743deaa595b_69EB/image_8.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; src=&quot;http://jongallant.com/images/blog/6743deaa595b_69EB/image_thumb_8.png&quot; style=&quot;background-image: none; display: inline;&quot; title=&quot;image&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;li&gt;Set Timezone&lt;/li&gt;&lt;a href=&quot;http://jongallant.com/images/blog/6743deaa595b_69EB/image_9.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; src=&quot;http://jongallant.com/images/blog/6743deaa595b_69EB/image_thumb_9.png&quot; style=&quot;background-image: none; display: inline;&quot; title=&quot;image&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;li&gt;Set Keyboard&lt;/li&gt;&lt;br /&gt;Not sure why, but I had to set keyboard on the device itself. The dialog wouldn’t popup over xrdp.&amp;nbsp;&amp;nbsp; I set to US.&lt;br /&gt;&lt;a href=&quot;http://jongallant.com/images/blog/6743deaa595b_69EB/image_9.png&quot;&gt;&lt;br /&gt;&lt;/a&gt;&lt;li&gt;Set Wifi Country&lt;/li&gt;&lt;a href=&quot;http://jongallant.com/images/blog/6743deaa595b_69EB/image_10.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; src=&quot;http://jongallant.com/images/blog/6743deaa595b_69EB/image_thumb_10.png&quot; style=&quot;background-image: none; display: inline;&quot; title=&quot;image&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;8. Setup Windows File Share&lt;/h2&gt;Run to set a file share and password for samba that you will use to connect via Windows.&lt;br /&gt;&lt;br /&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/d41a6b562a235f5ea9683cc31a3228bf.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Map Network Drive to &lt;/strong&gt;&lt;strong&gt;&lt;a href=&quot;file://rpi1/PiShare&quot;&gt;\\rpi1\PiShare&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;&lt;a href=&quot;http://jongallant.com/images/blog/6743deaa595b_69EB/image_11.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; src=&quot;http://jongallant.com/images/blog/6743deaa595b_69EB/image_thumb_11.png&quot; style=&quot;background-image: none; display: inline;&quot; title=&quot;image&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Enter Creds&lt;/strong&gt;&lt;br /&gt;&lt;a href=&quot;http://jongallant.com/images/blog/6743deaa595b_69EB/image_12.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; src=&quot;http://jongallant.com/images/blog/6743deaa595b_69EB/image_thumb_12.png&quot; style=&quot;background-image: none; display: inline;&quot; title=&quot;image&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Create a directory called “code” to put your code in.&lt;/strong&gt;&lt;br /&gt;&lt;a href=&quot;http://jongallant.com/images/blog/6743deaa595b_69EB/image_13.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; src=&quot;http://jongallant.com/images/blog/6743deaa595b_69EB/image_thumb_13.png&quot; style=&quot;background-image: none; display: inline;&quot; title=&quot;image&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;9. Install Node.js&lt;/h2&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/ac21356083a65096f6ea4204fa5d01a9.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;&lt;h2&gt;10. Configure npm to run without sudo&lt;/h2&gt;This moves your npm global node_modules folder to /home/pi/.npm-packages/lib/ and allows you to install packages without using “sudo”&lt;br /&gt;&lt;br /&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/38b691659d0e985c8da99a7556f515d0.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Hit enter when it asks you for home directory&lt;/li&gt;&lt;li&gt;Type “y” and hit enter when it asks you to update bashrc/zshrc files&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;11. Install Packages&lt;/h2&gt;Here are the packages I need at the moment. Yours will be different.Remove/add as you see fit.&lt;br /&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/52f55f49372c2ffd80a30b160cf53479.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;If you run the above and get node-gyp, you can ignore them.&lt;br /&gt;&lt;h2&gt;12. Configure Packages&lt;/h2&gt;The “noble” package doesn’t run without “sudo” by default.&amp;nbsp; Here’s how to configure to allow you to run without sudo.&amp;nbsp; Instructions from &lt;a href=&quot;https://github.com/sandeepmistry/noble#running-on-linux&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;. You don’t need to do this step if you don’t install noble.&lt;br /&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/76b4f0a82d82621d8298eea09722a8ef.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;13. Create Raspberry Pi Base Image&lt;/h2&gt;Now that you have all the settings the way you want them, you can use Win32 Disk Imager to write it to disk, so you can use this as a base image for future Raspberry Pis.&lt;br /&gt;&lt;a href=&quot;http://jongallant.com/images/blog/6743deaa595b_69EB/image_14.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; src=&quot;http://jongallant.com/images/blog/6743deaa595b_69EB/image_thumb_14.png&quot; style=&quot;background-image: none; display: inline;&quot; title=&quot;image&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;IMPORTANT: Make sure you use an SD card that is smaller than your target SD card or else you won&#39;t be able to copy this image to it later.&lt;br /&gt;&lt;br /&gt;Jon&lt;br /&gt;&lt;a href=&quot;http://jongallant.com/images/blog/6743deaa595b_69EB/image.png&quot;&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/2166039958863228385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/2166039958863228385'/><link rel='alternate' type='text/html' href='http://jongallant.blogspot.com/2016/09/raspberry-pi-nodejs-base-image.html' title='How to Create a Raspberry Pi (Raspbian) Base Image for Node.js Development'/><author><name>Jon Gallant</name><uri>https://plus.google.com/108260055196724354556</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-oEMvFFsC9yE/AAAAAAAAAAI/AAAAAAAADHk/Q0ks4lBpVB0/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-1365818330962585368.post-3143174392738273717</id><published>2016-09-01T15:38:00.001-07:00</published><updated>2016-09-01T15:39:04.550-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dev"/><category scheme="http://www.blogger.com/atom/ns#" term="solution"/><category scheme="http://www.blogger.com/atom/ns#" term="visual studio"/><category scheme="http://www.blogger.com/atom/ns#" term="vsts"/><title type='text'>Solution: “You cannot use this account for this purpose because it belongs to an organization. Please choose a different account or sign up for a new one.” when trying to signing to a Visual Studio Team Services project from within Visual Studio</title><content type='html'>&lt;p&gt;I just spent way too much time trying to login to a VSTS instance from VS. Turns out to have something to do with how Microsoft Account is configured in Visual Studio.&amp;nbsp; So, if you get this error: &lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“You cannot use this account for this purpose because it belongs to an organization. Please choose a different account or sign up for a new one.”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/15262229c434_D99C/2016-09-01.png&quot;&gt;&lt;img width=&quot;464&quot; height=&quot;570&quot; title=&quot;2016-09-01&quot; style=&quot;border-image: none; display: inline;&quot; alt=&quot;2016-09-01&quot; src=&quot;http://jongallant.com/images/blog/15262229c434_D99C/2016-09-01_thumb.png&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Open a cmd prompt as administrator and run the following:&lt;/p&gt;&lt;p&gt;For VS2015&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;reg add HKCU\Software\Microsoft\VisualStudio\14.0\TeamFoundation /v LegacyMSA /t REG_SZ /d True&lt;/code&gt;&lt;/pre&gt;&lt;p&gt; For VS2013&lt;/p&gt;&lt;pre&gt;&lt;code&gt;reg add HKCU\Software\Microsoft\VisualStudio\12.0\TeamFoundation /v LegacyMSA /t REG_SZ /d True&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Restart VS and try to signin again. &lt;/p&gt;&lt;p&gt;You should now see this auth dialog&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/15262229c434_D99C/newvs.png&quot;&gt;&lt;img title=&quot;newvs&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;newvs&quot; src=&quot;http://jongallant.com/images/blog/15262229c434_D99C/newvs_thumb.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Jon&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/3143174392738273717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/3143174392738273717'/><link rel='alternate' type='text/html' href='http://jongallant.blogspot.com/2016/09/solution-you-cannot-use-this-account.html' title='Solution: “You cannot use this account for this purpose because it belongs to an organization. Please choose a different account or sign up for a new one.” when trying to signing to a Visual Studio Team Services project from within Visual Studio'/><author><name>Jon Gallant</name><uri>https://plus.google.com/108260055196724354556</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-oEMvFFsC9yE/AAAAAAAAAAI/AAAAAAAADHk/Q0ks4lBpVB0/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-1365818330962585368.post-8643089089184138708</id><published>2016-08-29T16:31:00.001-07:00</published><updated>2016-08-29T16:33:52.675-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="nodejs"/><category scheme="http://www.blogger.com/atom/ns#" term="raspberrypi"/><category scheme="http://www.blogger.com/atom/ns#" term="sphero"/><title type='text'>How to Control a Sphero SPRK+ with a Raspberry Pi 3 and Node.js</title><content type='html'>&lt;p&gt;I’m working on a demo that involves streaming &lt;a href=&quot;http://www.sphero.com/&quot; target=&quot;_blank&quot;&gt;Sphero&lt;/a&gt; data through the &lt;a href=&quot;https://azure.microsoft.com/en-us/suites/iot-suite/&quot; target=&quot;_blank&quot;&gt;Azure IoT&lt;/a&gt; stack.&amp;nbsp; I got my &lt;a href=&quot;http://www.sphero.com/sprk-plus&quot; target=&quot;_blank&quot;&gt;Sphero SPRK+&lt;/a&gt; last week and quickly discovered that it only has &lt;a href=&quot;https://en.wikipedia.org/wiki/Bluetooth_low_energy&quot; target=&quot;_blank&quot;&gt;Bluetooth Low Energy (BLE)&lt;/a&gt; enabled and not regular Bluetooth. So, I couldn’t get it to connect to my Windows or OSX machines because they don’t have a BLE chipset.&amp;nbsp; I suspect that Sphero will push Bluetooth support via a firmware update later this fall. Until then, you can do the following to code against your SPRK+ using a Raspberry Pi 3, which ships with BLE.&lt;/p&gt;&lt;h2&gt;Raspberry Pi 3&lt;/h2&gt;&lt;p&gt;Get a Raspberry Pi 3 and plug it in. Monitor, keyboard, mouse, network cable.&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://images-na.ssl-images-amazon.com/images/I/913XYU1VtjL._SX522_.jpg&quot;&gt;&lt;/p&gt;&lt;h2&gt;Sphero SPRK+&lt;/h2&gt;&lt;p&gt;Get a Sphero SPRK+ and plug it in.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/d15999e44a95_CFB4/image.png&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;484&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/d15999e44a95_CFB4/image_thumb.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;Install Raspbian&lt;/h2&gt;&lt;p&gt;Flash Raspbian Jessie onto a MicroSD card and boot up your RPI3.&amp;nbsp; Use &lt;a href=&quot;http://blog.jongallant.com/2016/08/azure-iot-gateway-raspberry-pi-3.html&quot; target=&quot;_blank&quot;&gt;this blog post&lt;/a&gt; if you need help with this step.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;Install TightVNC&lt;/h2&gt;&lt;p&gt;This is helpful for accessing the RPI3 from your desktop. This step isn’t required if you want to control RPI3 using locally keyboard and mouse.&lt;/p&gt;&lt;p&gt;Install on Desktop: &lt;a title=&quot;http://www.tightvnc.com/download.php&quot; href=&quot;http://www.tightvnc.com/download.php&quot; target=&quot;_blank&quot;&gt;http://www.tightvnc.com/download.php&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Install on RPI3: &lt;a title=&quot;https://www.raspberrypi.org/documentation/remote-access/vnc/&quot; href=&quot;https://www.raspberrypi.org/documentation/remote-access/vnc/&quot; target=&quot;_blank&quot;&gt;https://www.raspberrypi.org/documentation/remote-access/vnc/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Use the following to start VNC Server on your RPI3&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;vncserver :1&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Use the following to get your RPI3 IP Address.&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;hostname -I&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;&lt;a href=&quot;http://jongallant.com/images/blog/d15999e44a95_CFB4/image_3.png&quot;&gt;&lt;img width=&quot;617&quot; height=&quot;89&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/d15999e44a95_CFB4/image_thumb_3.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Then use that IP when connecting from your desktop&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/d15999e44a95_CFB4/image_4.png&quot;&gt;&lt;img width=&quot;455&quot; height=&quot;325&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/d15999e44a95_CFB4/image_thumb_4.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;Pair the SPRK+&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/d15999e44a95_CFB4/image_5.png&quot;&gt;&lt;img width=&quot;244&quot; height=&quot;180&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/d15999e44a95_CFB4/image_thumb_5.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;It will be named SK-XXXX.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/d15999e44a95_CFB4/image_6.png&quot;&gt;&lt;img width=&quot;644&quot; height=&quot;182&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/d15999e44a95_CFB4/image_thumb_6.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;You will need to click OK on your RPI3 here:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/d15999e44a95_CFB4/image_7.png&quot;&gt;&lt;img width=&quot;644&quot; height=&quot;295&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/d15999e44a95_CFB4/image_thumb_7.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;You might see this…ignore it.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/d15999e44a95_CFB4/image_8.png&quot;&gt;&lt;img width=&quot;656&quot; height=&quot;297&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/d15999e44a95_CFB4/image_thumb_8.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;Get SPRK+ BLE Address&lt;/h2&gt;&lt;p&gt;Run this in Terminal&lt;/p&gt;&lt;pre&gt;&lt;code&gt;bluetoothctl&lt;/code&gt;&lt;/pre&gt; &lt;br&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/d15999e44a95_CFB4/image_9.png&quot;&gt;&lt;img width=&quot;686&quot; height=&quot;153&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/d15999e44a95_CFB4/image_thumb_9.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Copy the SPRK+ BLE Address. You will need it later.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;Install Node.js on RPI3&lt;/h2&gt;&lt;p&gt;Follow instructions in &lt;a href=&quot;http://blog.jongallant.com/2016/08/install-nodejs-raspbian.html&quot; target=&quot;_blank&quot;&gt;this blog post&lt;/a&gt; to get Node.js onto the RPI3&lt;/p&gt;&lt;h2&gt;Install Sphero SDK&lt;/h2&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;sudo npm install sphero&lt;br /&gt;sudo npm install noble&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;You can ignore any errors you get with the noble install&lt;/p&gt;&lt;h2&gt;Create Node.js File&lt;/h2&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;cd ~&lt;br&gt;mkdir sphero&lt;br&gt;cd sphero&lt;br&gt;touch sphero.js&lt;br&gt;leafpad sphero.js&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/d15999e44a95_CFB4/image_10.png&quot;&gt;&lt;img width=&quot;543&quot; height=&quot;98&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/d15999e44a95_CFB4/image_thumb_10.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;Copy Code to Node.js File&lt;/h2&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;script src=&quot;https://gist.github.com/jonbgallant/0f354313489ccd7a138df3c902d00cdb.js&quot;&gt;&lt;/script&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;Change the BLE Address to your SPRK+ BLE Address&lt;/h2&gt;&lt;p&gt;Open the sphero.js file and change the BLE Address to your SPRK+ BLE Address&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/d15999e44a95_CFB4/image_11.png&quot;&gt;&lt;img width=&quot;656&quot; height=&quot;183&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/d15999e44a95_CFB4/image_thumb_11.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;Run and Watch with Delight!&lt;/h2&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;sudo node sphero.js&lt;/code&gt;&lt;/pre&gt; &lt;iframe width=&quot;420&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/jrO-nhmAC_I&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/8643089089184138708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/8643089089184138708'/><link rel='alternate' type='text/html' href='http://jongallant.blogspot.com/2016/08/sphero-sprkplus-rpi-nodejs.html' title='How to Control a Sphero SPRK+ with a Raspberry Pi 3 and Node.js'/><author><name>Jon Gallant</name><uri>https://plus.google.com/108260055196724354556</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-oEMvFFsC9yE/AAAAAAAAAAI/AAAAAAAADHk/Q0ks4lBpVB0/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/jrO-nhmAC_I/default.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-1365818330962585368.post-6378395050519498404</id><published>2016-08-29T11:12:00.001-07:00</published><updated>2016-08-29T11:12:53.061-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="howto"/><category scheme="http://www.blogger.com/atom/ns#" term="nodejs"/><category scheme="http://www.blogger.com/atom/ns#" term="raspberrypi"/><title type='text'>How to Install Node.js on Raspberry Pi 3 (Raspbian)</title><content type='html'>&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Here’s how to install Node.js on Raspberry Pi (originally posted as a SoF answer for Ubuntu &lt;a href=&quot;http://stackoverflow.com/a/34974626/5500618&quot;&gt;here&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;Install curl&lt;/h2&gt;&lt;pre&gt;&lt;code&gt;sudo apt-get install curl&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Install node&lt;/h2&gt;&lt;p&gt;v4&lt;/p&gt;&lt;pre&gt;&lt;code&gt;curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -&lt;br /&gt;sudo apt-get install -y nodejs&lt;/code&gt;&lt;/pre&gt;&lt;p&gt; v5&lt;/p&gt;&lt;pre&gt;&lt;code&gt;curl -sL https://deb.nodesource.com/setup_5.x | sudo -E bash -&lt;br /&gt;sudo apt-get install -y nodejs&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;v6&lt;/p&gt;&lt;pre&gt;&lt;code&gt;curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -&lt;br /&gt;sudo apt-get install -y nodejs&lt;/code&gt;&lt;/pre&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/6378395050519498404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/6378395050519498404'/><link rel='alternate' type='text/html' href='http://jongallant.blogspot.com/2016/08/install-nodejs-raspbian.html' title='How to Install Node.js on Raspberry Pi 3 (Raspbian)'/><author><name>Jon Gallant</name><uri>https://plus.google.com/108260055196724354556</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-oEMvFFsC9yE/AAAAAAAAAAI/AAAAAAAADHk/Q0ks4lBpVB0/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-1365818330962585368.post-8379279046980825305</id><published>2016-08-25T16:03:00.001-07:00</published><updated>2016-08-25T16:03:58.500-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="raspberrypi"/><category scheme="http://www.blogger.com/atom/ns#" term="solution"/><title type='text'>Solution to “No Bluetooth adapter found” on RaspberryPi 3</title><content type='html'>&lt;p&gt;If you see this:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/d2f2b475b229_E135/image.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/d2f2b475b229_E135/image_thumb.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;It probably means your Bluetooth service is stopped:&lt;/p&gt;&lt;p&gt;Try this:&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;sudo service bluetooth start&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;then &lt;pre&gt;&lt;code&gt;sudo service bluetooth status&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;If that doesn’t work, try this:&lt;a title=&quot;https://www.pi-supply.com/make/fix-raspberry-pi-3-bluetooth-issues/&quot; href=&quot;https://www.pi-supply.com/make/fix-raspberry-pi-3-bluetooth-issues/&quot;&gt;https://www.pi-supply.com/make/fix-raspberry-pi-3-bluetooth-issues/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Jon&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/8379279046980825305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/8379279046980825305'/><link rel='alternate' type='text/html' href='http://jongallant.blogspot.com/2016/08/rpi3-no-bluetooth-adapter-found.html' title='Solution to “No Bluetooth adapter found” on RaspberryPi 3'/><author><name>Jon Gallant</name><uri>https://plus.google.com/108260055196724354556</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-oEMvFFsC9yE/AAAAAAAAAAI/AAAAAAAADHk/Q0ks4lBpVB0/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-1365818330962585368.post-3210380201797182465</id><published>2016-08-17T11:09:00.001-07:00</published><updated>2016-08-17T11:09:22.667-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="azure"/><category scheme="http://www.blogger.com/atom/ns#" term="howto"/><category scheme="http://www.blogger.com/atom/ns#" term="iot"/><title type='text'>How to Directly Connect to Azure IoT Hub&#39;s Underlying Event Hub</title><content type='html'>&lt;p&gt;Here’s how to directly connect to the Event Hub that backs an IoT Hub.&lt;/p&gt;&lt;p&gt;Here’s the connection string template, copy this, then copy each highlighted part from each step below.&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;Consolas&quot;&gt;&lt;strong&gt;Endpoint&lt;/strong&gt;=&lt;font style=&quot;background-color: rgb(255, 255, 0);&quot;&gt;&amp;lt;Event Hub-compatible endpoint&amp;gt;&lt;/font&gt;;&lt;strong&gt;SharedAccessKeyName&lt;/strong&gt;=&lt;font style=&quot;background-color: rgb(255, 255, 0);&quot;&gt;iothubowner&lt;/font&gt;;&lt;strong&gt;SharedAccessKey&lt;/strong&gt;=&lt;font style=&quot;background-color: rgb(255, 255, 0);&quot;&gt;&amp;lt;iothubowner primary key&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;p&gt;&lt;br&gt;&lt;h2&gt;1. Event Hub Compatible Endpoint&lt;/h2&gt;&lt;p&gt;In the Azure Portal, go to your IoT Hub, Settings, Operations monitoring:&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/64d09c2507ef_9A3F/image.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/64d09c2507ef_9A3F/image_thumb.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;h2&gt;2. SharedAccessKeyName&lt;/h2&gt;&lt;p&gt;Set to iothubowner or whatever user you want to use&lt;p&gt;&lt;br&gt;&lt;h2&gt;3. SharedAccessKey&lt;/h2&gt;&lt;p&gt;In the Azure Portal, go to IoT Hub, Settings, Shared access policies, select user and copy Primary Key&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/64d09c2507ef_9A3F/image_3.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/64d09c2507ef_9A3F/image_thumb_3.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/3210380201797182465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/3210380201797182465'/><link rel='alternate' type='text/html' href='http://jongallant.blogspot.com/2016/08/iothub-eventhub-connectionstring.html' title='How to Directly Connect to Azure IoT Hub&#39;s Underlying Event Hub'/><author><name>Jon Gallant</name><uri>https://plus.google.com/108260055196724354556</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-oEMvFFsC9yE/AAAAAAAAAAI/AAAAAAAADHk/Q0ks4lBpVB0/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-1365818330962585368.post-4480665539038564908</id><published>2016-08-10T10:47:00.001-07:00</published><updated>2016-08-11T12:57:07.806-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="job"/><title type='text'>HIRING: Senior PM Evangelist - Internet of Things (IoT) - Microsoft, Redmond, WA</title><content type='html'>&lt;p&gt;I joined the Developer Experience team not too long ago and am focused on helping partners develop IoT products on the &lt;a href=&quot;https://www.microsoft.com/en-us/cloud-platform/internet-of-things&quot;&gt;Azure IoT&lt;/a&gt; stack. I just found out that a sister team is looking for a Senior PM Evangelist to help develop the official IoT related programs we run.&amp;nbsp; Full details below.&amp;nbsp; &lt;/p&gt;&lt;p&gt;If interested, send me your resume here: &lt;a href=&quot;http://bit.ly/emailjon&quot;&gt;http://bit.ly/emailjon&lt;/a&gt; – it’s not a bad idea to include a blurb about yourself and why this role is a fit.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Jon&lt;/p&gt;&lt;p&gt;--------&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Senior Program Manager Evangelist &lt;p&gt;As a company, Microsoft is looking to realize 3 bold ambitions: to create more personal computing, to reinvent productivity and business processes with better collaboration and new workflows, and to build an intelligent cloud that can accommodate rich data.  Internet of Things (IoT) is a key enabler of these ambitions and a significant growth opportunity for Microsoft. &lt;p&gt;The Platform Evangelism and Planning (PEP) team within the Developer Experience and Evangelism (DX) Team responsible for defining DX strategic plans from programs and offers through to metrics and field execution to advance the Independent Software Vendor (ISV) and Evangelism agenda for Microsoft technologies. The PEP team works in a cross-functional manner, partnering with Microsoft product teams to define priorities and outcomes, then working with outbound ISV and Evangelism teams to land programs that drive adoption. &lt;br&gt;We are looking for an experienced Business Program Manager / Planner interested in being on the leading edge of IoT planning across the MS Platform. Due to the importance and dynamic nature of the work, the ideal candidate must have a strong sense of entrepreneurship and market/technical thought leadership, paired with a proven track record across all phases: from program design to implementation to sustained monitoring of performance. &lt;p&gt;This PEP Program Manager will work with teams across Microsoft to formulate impactful ISV and Evangelism plans, programs, offers and metrics that advance our technical marketing and engineering agendas aligned to roadmap or disclosure moments. In addition, Platform Business Program Managers provide critical customer feedback that will improve MSFT offerings. Success in this position requires working well in a team environment and building strong partnerships across different organizations. This role is an excellent opportunity for someone who wants to work on a high visibility project that will drive impact and help them grow professionally as a domain expert in an increasingly cloud and mobile connected world.&lt;p&gt;&lt;b&gt;Role Qualifications: &lt;/b&gt;&lt;ul&gt;&lt;li&gt;Strong understanding of mobile and cloud computing technologies, business drivers, and emerging trends &lt;b&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;Ability to present insights in concise and effective manner to a variety of stakeholders. &lt;/li&gt;&lt;li&gt;Proven track record working across large corporate and field organizations to build consensus with at least 7 years of experience doing so&lt;/li&gt;&lt;li&gt;Results driven; strong analytical skills with exceptional verbal and written communication&lt;b&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;7+ years of experience leading product or program cycles from initial design through deployment and monitoring&lt;b&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;Strong background in working with ISV Startups or high profile application development projects&lt;b&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;Passion and drive about productivity and great mobile and cloud experience&lt;b&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;7 years of related experience in program planning, business development or technical evangelism in related industries &lt;b&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;Exceptional decision making, organizational and negotiation skills with attention to detail&lt;b&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;Excellent project planning and management skills with ability to juggle multiple projects at once&lt;b&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;Solid written and verbal communications skills with range from end-user and developers through to senior executives&lt;b&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;MBAs preferred but not required.&lt;br&gt;&lt;/li&gt;&lt;b&gt;&lt;/b&gt;&lt;/ul&gt;&lt;p&gt;&lt;b&gt;In the role you will be responsible for: &lt;/b&gt;&lt;br&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Setting the strategic direction and overall program/project definitions across ISV and Evangelism&lt;/li&gt;&lt;li&gt;Defining strategic App Acquisition, Go To Market (GTM - incl. “sell with” opportunity) and Early Adopter Evangelism programs that compel developers and ISV to bet on Microsoft; then enable them to accelerate their success in IoT scenarios. &lt;/li&gt;&lt;li&gt;Target setting and prioritization (focus on &quot;why&quot; and &quot;what&quot;) for the different sub-projects&lt;/li&gt;&lt;li&gt;Representing the voice of the customer, partner and developer in the process&lt;/li&gt;&lt;li&gt;Definition of the requirements and policies for the programs&lt;/li&gt;&lt;li&gt;Providing quality marketing analysis and insight within a crisp set of priorities and story line that DX, Engineering and Marketing can get behind&lt;/li&gt;&lt;li&gt;Synthesizing data and market insight Decision-making on program related issues related to the purpose/definition&lt;/li&gt;&lt;li&gt;Building trusted relationships across range of Microsoft teams to advance shared agenda and priorities&lt;/li&gt;&lt;li&gt;Proven Escalation management capabilities&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Estimated 15% travel required domestic and Internationally. &lt;/p&gt;&lt;p&gt;DXREQ&lt;p&gt;Microsoft is an equal opportunity employer. All qualified applicants will receive consideration for employment without regard to race, color, sex, sexual orientation, gender identity or expression, religion, national origin or ancestry, age, disability, marital status, pregnancy, protected veteran status, protected genetic information, political affiliation, or any other characteristics protected by local laws, regulations, or ordinances.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/4480665539038564908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/4480665539038564908'/><link rel='alternate' type='text/html' href='http://jongallant.blogspot.com/2016/08/hiring-senior-pm-evangelist.html' title='HIRING: Senior PM Evangelist - Internet of Things (IoT) - Microsoft, Redmond, WA'/><author><name>Jon Gallant</name><uri>https://plus.google.com/108260055196724354556</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-oEMvFFsC9yE/AAAAAAAAAAI/AAAAAAAADHk/Q0ks4lBpVB0/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-1365818330962585368.post-4187397848145903882</id><published>2016-08-05T13:02:00.001-07:00</published><updated>2016-08-05T13:06:21.951-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="azure"/><category scheme="http://www.blogger.com/atom/ns#" term="azureiot"/><category scheme="http://www.blogger.com/atom/ns#" term="howto"/><category scheme="http://www.blogger.com/atom/ns#" term="iot"/><category scheme="http://www.blogger.com/atom/ns#" term="raspberrypi"/><title type='text'>How to Run the Azure IoT Field Gateway on a Raspberry Pi 3</title><content type='html'>&lt;p&gt;The &lt;a href=&quot;https://github.com/Azure/azure-iot-gateway-sdk&quot;&gt;Azure IoT Field Gateway SDK&lt;/a&gt; is a set of libraries that allow you to build a device that acts as a proxy between an individual IoT device and Azure IoT Hub.&lt;p&gt;Individual IoT devices will connect to the Gateway via some transport layer (BLE, NFC, etc) and the Gateway will forward the device data to IoT Hub. The Gateway will usually aggregate many messages into a single message or convert it to a data protocol (MQTT, AMQP, etc) that IoT Hub understands.&lt;p&gt;Here’s how to get it the Field Gateway running on a Raspberry Pi 3.&lt;h2&gt;Download Raspbian&lt;/h2&gt;&lt;p&gt;I’m using &lt;a href=&quot;https://www.raspberrypi.org/downloads/raspbian/&quot;&gt;Raspbian Jessie&lt;/a&gt; full desktop image.&lt;/p&gt;&lt;h2&gt;Get a MicroSD Card and MicroSD USB Card Reader&lt;/h2&gt;&lt;p&gt;I have a &lt;a href=&quot;https://www.amazon.com/Kingston-Digital-microSDHC-SDC10-32GB/dp/B00519BEQY&quot;&gt;Kingston 32GB Class 10&lt;/a&gt; MicroSD card and a &lt;a href=&quot;https://www.amazon.com/Transcend-microSDHC-Reader-TS-RDF5K-Black/dp/B009D79VH4/&quot;&gt;Transcend USB 3.0 Card Reader&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;Install Win32DiskImager&lt;/h2&gt;&lt;p&gt;This will be used to write Raspbian to the MicroSD card&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;https://sourceforge.net/projects/win32diskimager/&quot; href=&quot;https://sourceforge.net/projects/win32diskimager/&quot;&gt;https://sourceforge.net/projects/win32diskimager/&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;Copy Raspbian to MicroSD card&lt;/h2&gt;&lt;p&gt;Open Win32DiskImager. Find the yyyy-mm-dd-raspbian-jessie.img file. Select your USB drive. Click Write. This took about 5 minutes on my machine.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/533c87e4ef7b_9338/image.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/533c87e4ef7b_9338/image_thumb.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;Get Raspberry Pi Ready&lt;/h2&gt;&lt;p&gt;Plug in HDMI monitor, keyboard, mouse and Ethernet cable (you can also use Wifi instead)&lt;/p&gt;&lt;h2&gt;Configure Remote Access to Pi&lt;/h2&gt;&lt;p&gt;TightVNC allows you to remote desktop into the Raspberry Pi from your Windows desktop.&amp;nbsp; This step is optional. You could also just use the monitor, mouse and keyboard that is connected to the Pi, but that gets old quick.&amp;nbsp; There are other options here, but I’ve found TightVNC to be the most reliable when you just need to connect to the Pi from the same wireless network.&amp;nbsp; If the Pi is on a difference network, then use &lt;a href=&quot;https://www.raspberrypi.org/documentation/remote-access/access-over-Internet/internetaccess.md&quot;&gt;Weaved&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;All your remote options are located here: &lt;a title=&quot;https://www.raspberrypi.org/documentation/remote-access/&quot; href=&quot;https://www.raspberrypi.org/documentation/remote-access/&quot;&gt;https://www.raspberrypi.org/documentation/remote-access/&lt;/a&gt;. Feel free to use one that best suits your needs.&amp;nbsp; SSH with Putty is a good option if you don’t need to access the desktop.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;Go to Azure IoT Field Gateway SDK GitHub Page&lt;/h2&gt;&lt;p&gt;If you are using TightVNC, on the Pi, open the web browser and go to &lt;a href=&quot;http://bit.ly/azuregatewaypi&quot;&gt;http://bit.ly/azuregatewaypi&lt;/a&gt; – that will redirect you to this page on your Pi, so you can easily copy and paste the following commands.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;If you are using SSH, then just execute the commands below in your SSH window.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;Install Packages&lt;/h2&gt;&lt;pre&gt;&lt;code&gt;sudo apt-get update&lt;br /&gt;&lt;br /&gt;sudo apt-get install curl build-essential libcurl4-openssl-dev git cmake libssl-dev uuid-dev valgrind libglib2.0-dev&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Clone the Azure IoT Field Gateway Repo&lt;/h2&gt;&lt;p&gt;You can clone into any directly you want. I usually put everything in a /code folder.&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;git clone --recursive https://github.com/Azure/azure-iot-gateway-sdk.git&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Checkout the Develop Branch&lt;/h2&gt;&lt;p&gt;This is the branch that contains a fix that allows the Gateway to be built on the Pi&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;git checkout develop&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;Init Submodules&lt;/h2&gt;&lt;p&gt;I like to execute this command after I checkout a branch to be sure I have the latest submodule bits that correspond to my current branch.&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;git submodule update --init --recursive&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;Run Build.sh&lt;/h2&gt;&lt;p&gt;Change to the /tools directory and excute ./build.sh&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;cd tools&lt;br /&gt;./build.sh&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;This will take a while. Come back in 30 mins or so.&lt;/p&gt;&lt;h2&gt;Test Failures&lt;/h2&gt;&lt;p&gt;You will likely see these test failures, which are known issues reported &lt;a href=&quot;https://github.com/Azure/azure-iot-sdks/issues/556&quot;&gt;here on GitHub&lt;/a&gt;.&amp;nbsp; The e2e tests fail because we didn’t setup the IoT Hub connection.&amp;nbsp; That’ll be the topic of a different blog post.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The following tests FAILED:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 27 - constbuffer_unittests (Failed)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 34 - httpapiex_unittests (Failed)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 41 - sastoken_unittests (Failed)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 63 - mqtt_client_unittests (Failed)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 77 - iothubclient_http_e2etests (Failed)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 79 - iothubclient_mqtt_e2etests (Failed)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 81 - iothubclient_amqp_e2etests (Failed)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 109 - gw_e2etests (Failed)&lt;br&gt;Errors while running CTest&lt;br&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h2&gt;Copy JSON Settings File to Build Folder&lt;/h2&gt;&lt;p&gt;From the root of the repo run this command to copy the sample JSON settings file to the build output folder.&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;cp ./samples/hello_world/src/hello_world_lin.json ./build/samples/hello_world/hello_world_lin.json&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Run Hello_World_Sample&lt;/h2&gt;&lt;p&gt;Change to the /build folder&lt;/p&gt;&lt;p&gt;Run the following command to start the sample.&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;./samples/hello_world/hello_world_sample ./samples/hello_world/hello_world_lin.json&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;You should now see this output.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/533c87e4ef7b_9338/image_3.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/533c87e4ef7b_9338/image_thumb_3.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;This sample writes an entry to the /build/log.txt file. If you open that file you will see the entries. From the /build folder just enter “vi log.txt” to view the file.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/533c87e4ef7b_9338/image_4.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/533c87e4ef7b_9338/image_thumb_4.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;h3&gt;You now have the Azure IoT Gateway Running on a Raspberry Pi 3!&lt;/h3&gt;&lt;/blockquote&gt;&lt;h2&gt;Error When Stopped&lt;/h2&gt;&lt;p&gt;You might see this error when you stop the gateway – it appears that you can ignore it because it is still writing data to the log file.&amp;nbsp; I have reported the issue on &lt;a href=&quot;https://github.com/Azure/azure-iot-gateway-sdk/issues/19&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Error: Time:Fri Aug&amp;nbsp; 5 19:41:42 2016 File:/home/pi/code/azure-iot-gateway-sdk/deps/azure-c-shared-utility/src/consolelogger.c Func:consolelogger_log Line:31 byte array is not a gateway message serialization&lt;br&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;References&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Azure IoT Field Gateway SDK: &lt;a title=&quot;https://github.com/Azure/azure-iot-gateway-sdk&quot; href=&quot;https://github.com/Azure/azure-iot-gateway-sdk&quot;&gt;https://github.com/Azure/azure-iot-gateway-sdk&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Good Design Overview: &lt;a title=&quot;https://github.com/Azure/azure-iot-gateway-sdk/blob/master/doc/getting_started.md&quot; href=&quot;https://github.com/Azure/azure-iot-gateway-sdk/blob/master/doc/getting_started.md&quot;&gt;https://github.com/Azure/azure-iot-gateway-sdk/blob/master/doc/getting_started.md&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Jon&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/4187397848145903882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/4187397848145903882'/><link rel='alternate' type='text/html' href='http://jongallant.blogspot.com/2016/08/azure-iot-gateway-raspberry-pi-3.html' title='How to Run the Azure IoT Field Gateway on a Raspberry Pi 3'/><author><name>Jon Gallant</name><uri>https://plus.google.com/108260055196724354556</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-oEMvFFsC9yE/AAAAAAAAAAI/AAAAAAAADHk/Q0ks4lBpVB0/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-1365818330962585368.post-3130300284938756807</id><published>2016-08-05T11:40:00.001-07:00</published><updated>2016-08-05T11:41:00.990-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dev"/><category scheme="http://www.blogger.com/atom/ns#" term="lync"/><category scheme="http://www.blogger.com/atom/ns#" term="solution"/><title type='text'>Solution to: Microsoft Lync 2013 not found. Go here to download and install: http://go.microsoft.com/fwlink/?LinkID=248583</title><content type='html'>&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;If you get the following error when trying to install the Lync 2013 SDK….&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Microsoft Lync 2013 not found. Go here to download and install: &lt;a href=&quot;http://go.microsoft.com/fwlink/?LinkID=248583&quot;&gt;http://go.microsoft.com/fwlink/?LinkID=248583&lt;a href=&quot;http://jongallant.com/images/blog/eb07baf8891f_A2B8/2016-08-05-2.png&quot;&gt;&lt;img title=&quot;2016-08-05 (2)&quot; style=&quot;margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;&quot; alt=&quot;2016-08-05 (2)&quot; src=&quot;http://jongallant.com/images/blog/eb07baf8891f_A2B8/2016-08-05-2_thumb.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Do not go to that fwlink.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;You need to unzip the &lt;a href=&quot;https://www.microsoft.com/en-us/download/details.aspx?id=36824&quot;&gt;lyncsdk.exe&lt;/a&gt; and manually install the MSI. I used 7-zip, but you can use whatever zip tool you prefer.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/eb07baf8891f_A2B8/image.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/eb07baf8891f_A2B8/image_thumb.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I’m on a x64 machine so I used that one and it installed.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Jon&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/eb07baf8891f_A2B8/2016-08-05-2.png&quot;&gt;&lt;br&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/3130300284938756807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/3130300284938756807'/><link rel='alternate' type='text/html' href='http://jongallant.blogspot.com/2016/08/solution-lync-2013-not-found.html' title='Solution to: Microsoft Lync 2013 not found. Go here to download and install: http://go.microsoft.com/fwlink/?LinkID=248583'/><author><name>Jon Gallant</name><uri>https://plus.google.com/108260055196724354556</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-oEMvFFsC9yE/AAAAAAAAAAI/AAAAAAAADHk/Q0ks4lBpVB0/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-1365818330962585368.post-4745258697227306168</id><published>2016-08-02T14:41:00.001-07:00</published><updated>2016-08-02T15:21:50.375-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dev"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="windows"/><title type='text'>Linux on Windows for Everyone! - How to Enable the Windows Subsystem for Linux (Beta) on Windows 10 Anniversary Update</title><content type='html'>&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;The most anticipated Windows 10 Anniversary Update developer feature is now available for everyone…not just Windows Insiders.&lt;/p&gt;&lt;h2&gt;Step 0: Install Windows 10 Anniversary Update via Windows Update&lt;/h2&gt;&lt;p&gt;Go to Windows Update, get updates. It should automatically install.&lt;/p&gt;&lt;h2&gt;Step 1: Enabled Developer Mode&lt;/h2&gt;&lt;p&gt;Hit the Windows key and type “developer”. Click on “For developer settings”&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/e89c66bb7b1a_C691/image.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/e89c66bb7b1a_C691/image_thumb.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Select the “Developer mode” radio button.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/e89c66bb7b1a_C691/image_3.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/e89c66bb7b1a_C691/image_thumb_3.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;Step 2: Turn on Windows Subsystem for Linux (Beta)&lt;/h2&gt;&lt;p&gt;Hit the Windows key, type “Windows features” and select “Turn Windows features on or off”&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/e89c66bb7b1a_C691/image_4.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/e89c66bb7b1a_C691/image_thumb_4.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Select “Windows Subsystem for Linux (Beta)” click OK.&amp;nbsp; Let it install and restart.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/e89c66bb7b1a_C691/image_5.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/e89c66bb7b1a_C691/image_thumb_5.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;Step 3: Install Ubuntu on Windows&lt;/h2&gt;&lt;p&gt;Hit the Windows key, type “bash” and select “bash”&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/e89c66bb7b1a_C691/image_6.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/e89c66bb7b1a_C691/image_thumb_6.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Type “y” and enter.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/e89c66bb7b1a_C691/image_7.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/e89c66bb7b1a_C691/image_thumb_7.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Wait for Ubuntu to be installed.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/e89c66bb7b1a_C691/image_8.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/e89c66bb7b1a_C691/image_thumb_8.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Run Linux commands on Windows!&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/e89c66bb7b1a_C691/image_9.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/e89c66bb7b1a_C691/image_thumb_9.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Your Linux files will be located here: C:\Users\{username}\AppData\Local\lxss\&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Jon&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/4745258697227306168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/4745258697227306168'/><link rel='alternate' type='text/html' href='http://jongallant.blogspot.com/2016/08/linux-on-windows.html' title='Linux on Windows for Everyone! - How to Enable the Windows Subsystem for Linux (Beta) on Windows 10 Anniversary Update'/><author><name>Jon Gallant</name><uri>https://plus.google.com/108260055196724354556</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-oEMvFFsC9yE/AAAAAAAAAAI/AAAAAAAADHk/Q0ks4lBpVB0/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-1365818330962585368.post-5235282858825773282</id><published>2016-07-29T15:13:00.001-07:00</published><updated>2016-08-15T14:56:15.801-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="powerbi"/><title type='text'>Power BI Offering Index - A Complete List of all Power BI Products, Services and Developer Resources</title><content type='html'>&lt;a href=&quot;http://jongallant.com/images/blog/4f3811a24419_CF29/powerbi.png&quot;&gt;&lt;img alt=&quot;powerbi&quot; border=&quot;0&quot; src=&quot;http://jongallant.com/images/blog/4f3811a24419_CF29/powerbi_thumb.png&quot; height=&quot;200&quot; style=&quot;background-image: none; display: inline;&quot; title=&quot;powerbi&quot; width=&quot;504&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Here’s a &lt;a href=&quot;http://powerbi.com/&quot;&gt;Power BI&lt;/a&gt; offering index with short and sweet descriptions.&amp;nbsp; I’ll keep evolving this list as the service develops.&lt;br /&gt;&lt;h2&gt;For Consumers&lt;/h2&gt;&lt;a href=&quot;https://powerbi.microsoft.com/desktop&quot;&gt;Desktop&lt;/a&gt; – Create Reports locally and push to cloud.&lt;br /&gt;&lt;a href=&quot;http://app.powerbi.com/&quot;&gt;Web&lt;/a&gt; – Create, view share Reports and Dashboards&lt;br /&gt;&lt;a href=&quot;https://powerbi.microsoft.com/en-us/mobile/&quot;&gt;Mobile&lt;/a&gt; – Windows Phone, iOS and Android apps to view Reports and Dashboards&lt;br /&gt;&lt;a href=&quot;https://powerbi.microsoft.com/en-us/gateway/&quot;&gt;Gateway&lt;/a&gt; – Connect on-premises data to Power BI&lt;br /&gt;&lt;a href=&quot;https://powerbi.microsoft.com/en-us/publishtoweb/&quot;&gt;Publish to Web&lt;/a&gt; – Share reports on any website&lt;br /&gt;&lt;a href=&quot;https://go.microsoft.com/fwlink/?LinkId=820617&amp;amp;clcid=0x409&quot;&gt;Data Stories Gallery&lt;/a&gt; – See how others are using Power BI to tell their data story.&lt;br /&gt;&lt;a href=&quot;https://visuals.powerbi.com/&quot;&gt;Visuals Gallery&lt;/a&gt; – Browse and install community published custom visuals.&lt;br /&gt;&lt;h2&gt;For Developers&lt;/h2&gt;&lt;a href=&quot;https://powerbi.microsoft.com/en-us/developers/&quot;&gt;Developer Documentation&lt;/a&gt; – Read about all the ways you can integrate with Power BI&lt;br /&gt;&lt;a href=&quot;https://azure.microsoft.com/en-us/services/power-bi-embedded/&quot;&gt;Power BI Embedded&lt;/a&gt; – Embed Power BI assets into your own SaaS application&lt;br /&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-US/library/mt147898.aspx&quot;&gt;REST APIs&lt;/a&gt; (&lt;a href=&quot;http://docs.powerbi.apiary.io/#&quot;&gt;apiary.io docs&lt;/a&gt;) – Learn how to use the REST APIs&lt;br /&gt;&lt;a href=&quot;https://dev.powerbi.com/apps&quot;&gt;Developer App Registration&lt;/a&gt; – Register a developer application to use the APIs.&lt;br /&gt;&lt;a href=&quot;https://github.com/Microsoft/PowerBI-visuals-tools&quot;&gt;Custom Visuals SDK&lt;/a&gt; – Create your own d3.js custom visual&lt;br /&gt;&lt;a href=&quot;https://github.com/search?p=1&amp;amp;q=org%3AMicrosoft+powerbi&amp;amp;type=Repositories&quot;&gt;SDKs on GitHub&lt;/a&gt; – Easily integrate Power BI Embedded and REST APIs into your app. &lt;br /&gt;&lt;a href=&quot;https://powerbi.microsoft.com/en-us/documentation/powerbi-developer-content-pack-overview/&quot;&gt;Content Pack Certification&lt;/a&gt; – Certification process to onboard your own content pack to Power BI.&lt;br /&gt;&lt;a href=&quot;https://www.npmjs.com/search?q=powerbi&quot;&gt;npm packages&lt;/a&gt; – Install SDKs and helpers via npm</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/5235282858825773282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/5235282858825773282'/><link rel='alternate' type='text/html' href='http://jongallant.blogspot.com/2016/07/power-bi-offering-index.html' title='Power BI Offering Index - A Complete List of all Power BI Products, Services and Developer Resources'/><author><name>Jon Gallant</name><uri>https://plus.google.com/108260055196724354556</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-oEMvFFsC9yE/AAAAAAAAAAI/AAAAAAAADHk/Q0ks4lBpVB0/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-1365818330962585368.post-6391322139951703550</id><published>2016-07-28T13:59:00.001-07:00</published><updated>2016-07-28T13:59:39.306-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="howto"/><category scheme="http://www.blogger.com/atom/ns#" term="ifttt"/><category scheme="http://www.blogger.com/atom/ns#" term="twitter"/><title type='text'>How to Automatically Email Yourself When You Like a Tweet with IFTTT.com</title><content type='html'>&lt;p&gt;I just published this IFTTT (If This Than That) Recipe that will send me an email when I like a tweet. I then have an Outlook rule that flags the email so I can have a look in detail later.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Click “Add” below to create this recipe for yourself.&lt;/p&gt;&lt;p&gt;&lt;a class=&quot;embed_recipe embed_recipe-l_36&quot; id=&quot;embed_recipe-445563&quot; href=&quot;https://ifttt.com/view_embed_recipe/445563-send-me-an-email-when-i-like-a-tweet&quot; target=&quot;_blank&quot;&gt;&lt;img width=&quot;370&quot; style=&quot;max-width: 100%;&quot; alt=&quot;IFTTT Recipe: Send Me an Email When I Like a Tweet connects twitter to email&quot; src=&quot;https://ifttt.com/recipe_embed_img/445563&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Here’s a sample of what the email will look like.&lt;a href=&quot;http://jongallant.com/images/blog/f423150d4363_C2C0/image.png&quot;&gt;&lt;img width=&quot;998&quot; height=&quot;772&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/f423150d4363_C2C0/image_thumb.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;  &lt;script async type=&quot;text/javascript&quot; src=&quot;//ifttt.com/assets/embed_recipe.js&quot;&gt;&lt;/script&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt; Jon&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/6391322139951703550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/6391322139951703550'/><link rel='alternate' type='text/html' href='http://jongallant.blogspot.com/2016/07/email-twitter-like-ifttt.html' title='How to Automatically Email Yourself When You Like a Tweet with IFTTT.com'/><author><name>Jon Gallant</name><uri>https://plus.google.com/108260055196724354556</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-oEMvFFsC9yE/AAAAAAAAAAI/AAAAAAAADHk/Q0ks4lBpVB0/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-1365818330962585368.post-6552243636557686447</id><published>2016-07-28T11:38:00.001-07:00</published><updated>2016-07-28T11:38:36.513-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="howto"/><title type='text'>How to Save Open Live Writer Drafts to Dropbox (or any other location)</title><content type='html'>&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;I have &lt;a href=&quot;http://openlivewriter.org/&quot;&gt;OpenLiveWriter&lt;/a&gt; on two desktops and one laptop.&amp;nbsp; I sync my drafts to Dropbox.&amp;nbsp; Here’s how:&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;1. Open Regedit&lt;/p&gt;&lt;p&gt;2. Navigate to HKEY_CURRENT_USER\SOFTWARE\OpenLiveWriter&lt;/p&gt;&lt;p&gt;3. Create a new String Value&lt;/p&gt;&lt;p&gt;Name: PostsDirectory&lt;/p&gt;&lt;p&gt;Value: Path to dropbox, mine is C:\Users\jon\Dropbox\posts&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/09cedcce109b_A24E/image.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/09cedcce109b_A24E/image_thumb.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Close and re-open up OpenLiveWriter, safe a draft and you can now see it saved to your Dropbox folder&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/09cedcce109b_A24E/image_3.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/09cedcce109b_A24E/image_thumb_3.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Jon&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/6552243636557686447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/6552243636557686447'/><link rel='alternate' type='text/html' href='http://jongallant.blogspot.com/2016/07/openlivewriter-dropbox.html' title='How to Save Open Live Writer Drafts to Dropbox (or any other location)'/><author><name>Jon Gallant</name><uri>https://plus.google.com/108260055196724354556</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-oEMvFFsC9yE/AAAAAAAAAAI/AAAAAAAADHk/Q0ks4lBpVB0/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-1365818330962585368.post-1236834723894971938</id><published>2016-07-27T10:52:00.001-07:00</published><updated>2016-07-27T10:58:25.697-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="c#"/><category scheme="http://www.blogger.com/atom/ns#" term="dev"/><category scheme="http://www.blogger.com/atom/ns#" term="fiddler"/><category scheme="http://www.blogger.com/atom/ns#" term="howto"/><category scheme="http://www.blogger.com/atom/ns#" term="visual studio"/><title type='text'>Fiddler Extension Development Tips</title><content type='html'>&lt;p&gt;I recently created a custom &lt;a href=&quot;http://www.telerik.com/fiddler&quot;&gt;Fiddler&lt;/a&gt; extension called &lt;a href=&quot;https://github.com/jonbgallant/PowerBIFiddler&quot;&gt;PowerBIFiddler&lt;/a&gt;. Here are a few tricks that I learned along the way.&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;Re-use Default Fiddler Inspectors&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;For PowerBI-Fiddler, I wanted to re-use the JSONResponseViewer that Fiddler uses for their “JSON” inspector.&amp;nbsp; I used &lt;a href=&quot;http://www.telerik.com/products/decompiler.aspx&quot;&gt;JustDecompile&lt;/a&gt; to decompile Fiddler.exe and discovered that the default inspectors are located in this DLL: C:\Program Files (x86)\Fiddler2\Inspectors\Standard.dll.&amp;nbsp; The JSONResponseViewer is sealed, so you have to use a composition pattern instead of inheritance.&amp;nbsp; You can see an example here: &lt;a title=&quot;https://github.com/jonbgallant/PowerBIFiddler/blob/master/PowerBIFiddler/TileDataViewer.cs&quot; href=&quot;https://github.com/jonbgallant/PowerBIFiddler/blob/master/PowerBIFiddler/TileDataViewer.cs&quot;&gt;https://github.com/jonbgallant/PowerBIFiddler/blob/master/PowerBIFiddler/TileDataViewer.cs&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/8eabae91e1ff_D2C8/image_3.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/8eabae91e1ff_D2C8/image_thumb_3.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;Inspector loading&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;Fiddler searches %userprofile%\Documents\Fiddler2\Inspectors and C:\Program Files (x86)\Fiddler2\Inspectors for Inspectors when it launches.&amp;nbsp; You’ll want to copy your custom Inspectors into either of those folders.&amp;nbsp; I setup the following Post-build event to automatically copy the DLL over after each build.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;font face=&quot;Consolas&quot;&gt;mkdir &quot;%userprofile%\My Documents\Fiddler2\Inspectors\&quot;&lt;br&gt;copy &quot;$(TargetPath)&quot; &quot;%userprofile%\My Documents\Fiddler2\Inspectors\$(TargetFilename)&quot;&lt;br&gt;copy &quot;Newtonsoft.Json.dll&quot; &quot;%userprofile%\My Documents\Fiddler2\Inspectors\&quot;&lt;br&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;font face=&quot;Consolas&quot;&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/8eabae91e1ff_D2C8/image_4.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/8eabae91e1ff_D2C8/image_thumb_4.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;Debugging&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;To get F5 debugging, you’ll want to set your Start Action to Fiddler.exe, like this:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jongallant.com/images/blog/8eabae91e1ff_D2C8/image.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;http://jongallant.com/images/blog/8eabae91e1ff_D2C8/image_thumb.png&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;br&gt;&lt;/strong&gt;&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;Learn by Decompiling Existing Extensions&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;You’ll find a bunch of good examples here: &lt;a title=&quot;http://www.telerik.com/fiddler/add-ons&quot; href=&quot;http://www.telerik.com/fiddler/add-ons&quot;&gt;http://www.telerik.com/fiddler/add-ons&lt;/a&gt;. You can install them and then use JustDecompile to see how they were built.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;&lt;strong&gt;Helpful Links&lt;/strong&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Fiddler Extensions on Codeplex: &lt;a title=&quot;https://www.codeplex.com/site/search?query=fiddler&amp;amp;ac=2&quot; href=&quot;https://www.codeplex.com/site/search?query=fiddler&amp;amp;ac=2&quot;&gt;https://www.codeplex.com/site/search?query=fiddler&amp;amp;ac=2&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Fiddler Extensions on GitHub: &lt;a title=&quot;https://github.com/search?utf8=%E2%9C%93&amp;amp;q=fiddler+extension&amp;amp;type=Repositories&amp;amp;ref=searchresults&quot; href=&quot;https://github.com/search?utf8=%E2%9C%93&amp;amp;q=fiddler+extension&amp;amp;type=Repositories&amp;amp;ref=searchresults&quot;&gt;https://github.com/search?utf8=%E2%9C%93&amp;amp;q=fiddler+extension&amp;amp;type=Repositories&amp;amp;ref=searchresults&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Fiddler Extension Docs: &lt;a href=&quot;http://docs.telerik.com/fiddler/extend-fiddler/extendwithdotnet&quot;&gt;http://docs.telerik.com/fiddler/extend-fiddler/extendwithdotnet&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Jon&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/1236834723894971938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1365818330962585368/posts/default/1236834723894971938'/><link rel='alternate' type='text/html' href='http://jongallant.blogspot.com/2016/07/fiddler-extension-tips.html' title='Fiddler Extension Development Tips'/><author><name>Jon Gallant</name><uri>https://plus.google.com/108260055196724354556</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-oEMvFFsC9yE/AAAAAAAAAAI/AAAAAAAADHk/Q0ks4lBpVB0/s512-c/photo.jpg'/></author></entry></feed>