I was quite honored to be invited to deliver a keynote and sessions at .NET Developer Days Poland just a few weeks ago during October 19–20, 2017. Sharing the slides here, and they are posted on SlideShare as well.
For the keynote, I focused on surviving microservices. I had a little bit of fun with the keynote, being a game of thrones fan. I’ll typically try to throw in some fun memes and images in my talks, but this time the theme “Surviving” kept bringing me to game of thrones so I went with it :)
https://medium.com/media/16fc3fec1be6be9f3f79290dfda1a6af/hrefHere’s a PDF as well, as this may show the crazy font I used a little better: http://bit.ly/2h8igXb
For my sessions I continued to focus on microservices architecture with a session covering scheduling patterns for containers; and another covering the latest rendition of my “taste of all the platforms”.
https://medium.com/media/bd04b3f632179e44acbe92a12fbac98e/hrefhttps://medium.com/media/2be3a7e078a282a1c1c31c6f13a51f30/hrefSlides from .NET Developer Days Poland was originally published in Michele Leroux Bustamante Blog on Medium, where people are continuing the conversation by highlighting and responding to this story.
]]>I was quite honored to be invited to deliver a keynote and sessions at .NET Developer Days Poland just a few weeks ago during October 19–20, 2017. Sharing the slides here, and they are posted on SlideShare as well.
For the keynote, I focused on surviving microservices. I had a little bit of fun with the keynote, being a game of thrones fan. I’ll typically try to throw in some fun memes and images in my talks, but this time the theme “Surviving” kept bringing me to game of thrones so I went with it :)
https://medium.com/media/16fc3fec1be6be9f3f79290dfda1a6af/hrefHere’s a PDF as well, as this may show the crazy font I used a little better: http://bit.ly/2h8igXb
For my sessions I continued to focus on microservices architecture with a session covering scheduling patterns for containers; and another covering the latest rendition of my “taste of all the platforms”.
https://medium.com/media/bd04b3f632179e44acbe92a12fbac98e/hrefhttps://medium.com/media/2be3a7e078a282a1c1c31c6f13a51f30/hrefSlides from .NET Developer Days Poland was originally published in Michele Leroux Bustamante Blog on Medium, where people are continuing the conversation by highlighting and responding to this story.
]]>Machine Setup (we added some links here to be used for the day of event):
Hands on labs from the Windows Azure Training Kit 2012. Go to the labs page for 2012 and select the labs with the titles below. We’ll guide you through the day, this is for later reference.
Render lab
Originally published April 27, 2013.
gwab. 2013. san. diego. resources. was originally published in Michele Leroux Bustamante Blog on Medium, where people are continuing the conversation by highlighting and responding to this story.
]]>Machine Setup (we added some links here to be used for the day of event):
Hands on labs from the Windows Azure Training Kit 2012. Go to the labs page for 2012 and select the labs with the titles below. We’ll guide you through the day, this is for later reference.
Render lab
Originally published April 27, 2013.
gwab. 2013. san. diego. resources. was originally published in Michele Leroux Bustamante Blog on Medium, where people are continuing the conversation by highlighting and responding to this story.
]]>TF30063: You are not authorized to access…
Rebooting helped. Once.
On another occasion I wasn’t so lucky (remember me cookies, probably).
So, I searched around and found this stackoverflow link with the answer I needed. I’ll repeat it here so you know which tip fixed it ;)
I opened a browser from within Visual Studio 2012 from View->Other Windows->Web Browser.
Navigated to the TFS online account that I thought might be the one I was incorrectly logged in to:
http://accountname.visualstudio.com
Sure enough I was still signed in. So, I signed out.
Closed the browser window in VS, went back to the Team Explorer window and tried to connect to the collection I wanted to get to in the first place.
Bam, it worked! Yeah! So happy.
I don’t know if this issue persists in VS 2013, haven’t compared that scenario.
Originally published January 6, 2014.
TF30063: You are not authorized to access… was originally published in Michele Leroux Bustamante Blog on Medium, where people are continuing the conversation by highlighting and responding to this story.
]]>TF30063: You are not authorized to access…
Rebooting helped. Once.
On another occasion I wasn’t so lucky (remember me cookies, probably).
So, I searched around and found this stackoverflow link with the answer I needed. I’ll repeat it here so you know which tip fixed it ;)
I opened a browser from within Visual Studio 2012 from View->Other Windows->Web Browser.
Navigated to the TFS online account that I thought might be the one I was incorrectly logged in to:
http://accountname.visualstudio.com
Sure enough I was still signed in. So, I signed out.
Closed the browser window in VS, went back to the Team Explorer window and tried to connect to the collection I wanted to get to in the first place.
Bam, it worked! Yeah! So happy.
I don’t know if this issue persists in VS 2013, haven’t compared that scenario.
Originally published January 6, 2014.
TF30063: You are not authorized to access… was originally published in Michele Leroux Bustamante Blog on Medium, where people are continuing the conversation by highlighting and responding to this story.
]]>I finally setup a VM today. Interestingly the driver was that MySQL Workbench just DID NOT WANT TO WORK on any of my Windows 7 VM and I had heard from a friend that Windows 8 worked fine for them so…an open source tool has indeed pushed me to Windows 8 at least for a few projects involving MySQL.
Install was wicked fast. Got to this screen in no time.
But, it did not want an activation code during Parallels install so I had a bit of a time trying to get the OS activated. It kept failing on activation. I thought it was internet at first, but I was connected. I figured it was the key, but I couldn’t see a way to provide a key.
Found this blog post which instructed me to open the command window as administrator and run the following command to set the key:
slmgr.vbs /ipk “Your Product Key”
After that, success when I activated Windows:
Then I had to find Control Panel. So I eventually figure out this can be found by showing the right hand menu (whatever the fuck they call it) and select Search and type “programs and features”, NO, “programs”, NO, “Control Panel”, YES.
Finally something I know how to work with, Control Panel. So I turned on all the usual stuff, IIS, .NET 4.5, WCF related, and so on. Then, I go to the tile screen and select IE, and browse to http://localhost. Cannot connect. WTF? So I think IIS is not installed for some reason but when I go to Desktop and run IE to the same, it works. Interestingly, it worked from the tile screen after I got it to work from the Desktop IE so whatever. It works now.
But where is IIS Manager? I thought I enabled all that stuff?
Yet another baffling moment. A little googling and it turns out that the default is no longer to install IIS Manager, you have to select it in windows features:
Ok, that’s what I’m talking about:
Now, if I can just figure out how to get rid of tiles I don’t want. Oh, and what the “eff” does pinning to taskbar mean? I don’t see a taskbar and I pinned control panel “somewhere”. And…I wish that the side menu could be pinned always on cause I keep having to mouse over a specific area to bring the thing back…really annoying when you are trying to be productive.
I’m out, maybe more of this when I get moving.
At least the good news for me was that MySQL behaved perfectly on this VM…so I guess it supports WIndows 8 better than Windows 7.
Originally published May 7, 2013.
windows. 8. noob. day. 1. was originally published in Michele Leroux Bustamante Blog on Medium, where people are continuing the conversation by highlighting and responding to this story.
]]>I finally setup a VM today. Interestingly the driver was that MySQL Workbench just DID NOT WANT TO WORK on any of my Windows 7 VM and I had heard from a friend that Windows 8 worked fine for them so…an open source tool has indeed pushed me to Windows 8 at least for a few projects involving MySQL.
Install was wicked fast. Got to this screen in no time.
But, it did not want an activation code during Parallels install so I had a bit of a time trying to get the OS activated. It kept failing on activation. I thought it was internet at first, but I was connected. I figured it was the key, but I couldn’t see a way to provide a key.
Found this blog post which instructed me to open the command window as administrator and run the following command to set the key:
slmgr.vbs /ipk “Your Product Key”
After that, success when I activated Windows:
Then I had to find Control Panel. So I eventually figure out this can be found by showing the right hand menu (whatever the fuck they call it) and select Search and type “programs and features”, NO, “programs”, NO, “Control Panel”, YES.
Finally something I know how to work with, Control Panel. So I turned on all the usual stuff, IIS, .NET 4.5, WCF related, and so on. Then, I go to the tile screen and select IE, and browse to http://localhost. Cannot connect. WTF? So I think IIS is not installed for some reason but when I go to Desktop and run IE to the same, it works. Interestingly, it worked from the tile screen after I got it to work from the Desktop IE so whatever. It works now.
But where is IIS Manager? I thought I enabled all that stuff?
Yet another baffling moment. A little googling and it turns out that the default is no longer to install IIS Manager, you have to select it in windows features:
Ok, that’s what I’m talking about:
Now, if I can just figure out how to get rid of tiles I don’t want. Oh, and what the “eff” does pinning to taskbar mean? I don’t see a taskbar and I pinned control panel “somewhere”. And…I wish that the side menu could be pinned always on cause I keep having to mouse over a specific area to bring the thing back…really annoying when you are trying to be productive.
I’m out, maybe more of this when I get moving.
At least the good news for me was that MySQL behaved perfectly on this VM…so I guess it supports WIndows 8 better than Windows 7.
Originally published May 7, 2013.
windows. 8. noob. day. 1. was originally published in Michele Leroux Bustamante Blog on Medium, where people are continuing the conversation by highlighting and responding to this story.
]]>Check it out here: http://googledevelopers.blogspot.com/2014/01/get-started-with-google-cloud-platform.html
Congrats Lynn!
Originally published January 15, 2014.
learning. google. cloud. was originally published in Michele Leroux Bustamante Blog on Medium, where people are continuing the conversation by highlighting and responding to this story.
]]>Check it out here: http://googledevelopers.blogspot.com/2014/01/get-started-with-google-cloud-platform.html
Congrats Lynn!
Originally published January 15, 2014.
learning. google. cloud. was originally published in Michele Leroux Bustamante Blog on Medium, where people are continuing the conversation by highlighting and responding to this story.
]]>We spend quite a lot of time in Dev Ops as a team at -Solliance — since we have helped many customers move to the cloud. Doing this safely is a delicate process, and together we have created some useful techniques for safely managing customer deployments. I shared many of these tips on the show…hope you enjoy!
http://dotnetrocks.com/default.aspx?showNum=945
Originally published January 30, 2014.
Dev Ops and Windows Azure was originally published in Michele Leroux Bustamante Blog on Medium, where people are continuing the conversation by highlighting and responding to this story.
]]>We spend quite a lot of time in Dev Ops as a team at -Solliance — since we have helped many customers move to the cloud. Doing this safely is a delicate process, and together we have created some useful techniques for safely managing customer deployments. I shared many of these tips on the show…hope you enjoy!
http://dotnetrocks.com/default.aspx?showNum=945
Originally published January 30, 2014.
Dev Ops and Windows Azure was originally published in Michele Leroux Bustamante Blog on Medium, where people are continuing the conversation by highlighting and responding to this story.
]]>Hello World Podcast — Episode 10
Originally published January 30, 2014.
Hello World with Shawn Wildermuth was originally published in Michele Leroux Bustamante Blog on Medium, where people are continuing the conversation by highlighting and responding to this story.
]]>Hello World Podcast — Episode 10
Originally published January 30, 2014.
Hello World with Shawn Wildermuth was originally published in Michele Leroux Bustamante Blog on Medium, where people are continuing the conversation by highlighting and responding to this story.
]]>I’ll paraphrase the letter written by my very good friend RIchard Campbell, of .NET Rocks, who is also one of the conference owners.
THE LETTER
I want to take this opportunity invite you to the most dynamic developer event in our industry this spring, DEVintersection, April 13–16 in Orlando and Nov 10–13 back in MGM Grand in Vegas. We focus on Visual Studio, ASP.NET, HTML 5, Windows Azure, ALM and Open Source technologies. This fast growing event is in its second year and is a collaboration between Microsoft, .NET Rocks and NextGen Conference Productions. Together we have created the next generation of technology learning events that will exceed your expectations. On top of that, sign up for the conference and a workshop and you will receive your choice of a Surface 2 or XBOX ONE as part of your package.
If you want to know where your favorite presenters are this spring — they’re at DEVintersection. You can expect exciting insider keynotes delivered by key Microsoft personnel like Executive Vice President Scott Guthrie. Scott will take you on an exciting journey through the latest of Microsoft’s cloud offerings and their potential to transform your business. Scott Hanselman, Principal Architect for Web Platform and Tools, dives into the barriers being unlocked with open source options that allow creativity to flow. Jay Schmelzer, Microsoft Director of Program Management for Visual Studio, talks about the New Era of Development. Douglas Crockford, independent consultant and creator of the JSON Data Interchange Format, presents “The Better Parts” this keynote is not to be missed. Rob Leffert, Microsoft Director of Program Management for Office APP’s shares Modern Office Development.
Microsoft’s technical experts Doug Seven, Scott Hunter, Brady Gaster, Sayed Hashimi, Pranav Rastogi and Kris Lankford will join your favorite industry experts, among them John Papa, Todd Anglin, Juval Lowy, Ward Bell, Dan Wahlin, Elijah Manor, Billy Hollis, Michele Leroux Bustamante, Tim Huckaby, Carl Franklin, Brian Randell, Miguel Castro, Paul Litwin, Kathleen Dollard, Paul Sheriff, Brain Benz, Jesse Liberty, Jeff Fritz, Joe Guadagno, Denise Jacobs, Rob Eisenberg, Phil Japikse, Michael Krasowski, Shayne Boyer, Zoiner Tejada and more. Only speakers considered to be industry experts will be at DEVintersection and this line up will not disappoint you.
I know an important aspect of an event is the interaction with your favorite Microsoft experts and industry gurus. We’ve created “intersection times” when attendees get together with presenters for lively discussions. We believe it’s in the “white spaces” that cool things happen.
At DEVintersection everyone is a VIP! You can attend the co-located events SQL intersection, SharePoint intersection and the very cool open web event <anglebrackets/> at no extra charge. Use the discount code online of “msdn” for $50 off registration.
END LETTER
There are plenty of amazing sessions, and we have also planned some great Windows Azure centric sessions as well. I’ll be talking DevOps, SaaS tools that help you ship product faster, and doing an updated whirlwind session on Azure Essentials to get you off and running with some time saving tips.
In short, I hope you to see you in Orlando April 13–16 at the JW Marriott and if you can’t make spring mark your calendars for fall: Nov 10–13, 2014 in Las Vegas at MGM Grand.
Originally published March 13, 2014.
DEVintersection Conference — the place to be April 13–16, 2014 was originally published in Michele Leroux Bustamante Blog on Medium, where people are continuing the conversation by highlighting and responding to this story.
]]>I’ll paraphrase the letter written by my very good friend RIchard Campbell, of .NET Rocks, who is also one of the conference owners.
THE LETTER
I want to take this opportunity invite you to the most dynamic developer event in our industry this spring, DEVintersection, April 13–16 in Orlando and Nov 10–13 back in MGM Grand in Vegas. We focus on Visual Studio, ASP.NET, HTML 5, Windows Azure, ALM and Open Source technologies. This fast growing event is in its second year and is a collaboration between Microsoft, .NET Rocks and NextGen Conference Productions. Together we have created the next generation of technology learning events that will exceed your expectations. On top of that, sign up for the conference and a workshop and you will receive your choice of a Surface 2 or XBOX ONE as part of your package.
If you want to know where your favorite presenters are this spring — they’re at DEVintersection. You can expect exciting insider keynotes delivered by key Microsoft personnel like Executive Vice President Scott Guthrie. Scott will take you on an exciting journey through the latest of Microsoft’s cloud offerings and their potential to transform your business. Scott Hanselman, Principal Architect for Web Platform and Tools, dives into the barriers being unlocked with open source options that allow creativity to flow. Jay Schmelzer, Microsoft Director of Program Management for Visual Studio, talks about the New Era of Development. Douglas Crockford, independent consultant and creator of the JSON Data Interchange Format, presents “The Better Parts” this keynote is not to be missed. Rob Leffert, Microsoft Director of Program Management for Office APP’s shares Modern Office Development.
Microsoft’s technical experts Doug Seven, Scott Hunter, Brady Gaster, Sayed Hashimi, Pranav Rastogi and Kris Lankford will join your favorite industry experts, among them John Papa, Todd Anglin, Juval Lowy, Ward Bell, Dan Wahlin, Elijah Manor, Billy Hollis, Michele Leroux Bustamante, Tim Huckaby, Carl Franklin, Brian Randell, Miguel Castro, Paul Litwin, Kathleen Dollard, Paul Sheriff, Brain Benz, Jesse Liberty, Jeff Fritz, Joe Guadagno, Denise Jacobs, Rob Eisenberg, Phil Japikse, Michael Krasowski, Shayne Boyer, Zoiner Tejada and more. Only speakers considered to be industry experts will be at DEVintersection and this line up will not disappoint you.
I know an important aspect of an event is the interaction with your favorite Microsoft experts and industry gurus. We’ve created “intersection times” when attendees get together with presenters for lively discussions. We believe it’s in the “white spaces” that cool things happen.
At DEVintersection everyone is a VIP! You can attend the co-located events SQL intersection, SharePoint intersection and the very cool open web event <anglebrackets/> at no extra charge. Use the discount code online of “msdn” for $50 off registration.
END LETTER
There are plenty of amazing sessions, and we have also planned some great Windows Azure centric sessions as well. I’ll be talking DevOps, SaaS tools that help you ship product faster, and doing an updated whirlwind session on Azure Essentials to get you off and running with some time saving tips.
In short, I hope you to see you in Orlando April 13–16 at the JW Marriott and if you can’t make spring mark your calendars for fall: Nov 10–13, 2014 in Las Vegas at MGM Grand.
Originally published March 13, 2014.
DEVintersection Conference — the place to be April 13–16, 2014 was originally published in Michele Leroux Bustamante Blog on Medium, where people are continuing the conversation by highlighting and responding to this story.
]]>So I’ve moved my node.js development to the OSX environment to stay out of a Parallels VM and find I often have to reuse my Terminal commands. Problem has become finding the commands I want to remember. Shoulda blogged those I guess!
I finally looked up how to get my Terminal history. This is really helpful for finding past commands, fast. The only thing faster may have been if I blogged the instructions in the first place ;)
So next time I need those pesky openssl commands (or, whatever else) I’m finding it much faster.
/hth
Originally published June 23, 2014.
The Little Things #1 — Terminal History is Useful was originally published in Michele Leroux Bustamante Blog on Medium, where people are continuing the conversation by highlighting and responding to this story.
]]>So I’ve moved my node.js development to the OSX environment to stay out of a Parallels VM and find I often have to reuse my Terminal commands. Problem has become finding the commands I want to remember. Shoulda blogged those I guess!
I finally looked up how to get my Terminal history. This is really helpful for finding past commands, fast. The only thing faster may have been if I blogged the instructions in the first place ;)
So next time I need those pesky openssl commands (or, whatever else) I’m finding it much faster.
/hth
Originally published June 23, 2014.
The Little Things #1 — Terminal History is Useful was originally published in Michele Leroux Bustamante Blog on Medium, where people are continuing the conversation by highlighting and responding to this story.
]]>So #4 requires a little command line love. So, if someone throws a node project at you and you don’t have time to learn all things GIT commands, maybe these few instructions will help as they are the commands I frequently execute.
And so once you have things running, you edit some code in Sublime Text, then you want to check in you can try out these commands.
1.get latest first
git pull origin master
2.commit with comments
git commit -am “awesome changes”
3.if you have files to add try this
git add .
4.push the changes up
git push origin master
PLEASE NOTE — follow at your own risk!!! These are commands that work for me in my environment and this is not a post that covers all things node or GIT clearly…I’m a noob trying to help noobs so that is dangerous ;)
Originally published June 24, 2014.
The Little Things #2 — GIT, get latest, check in was originally published in Michele Leroux Bustamante Blog on Medium, where people are continuing the conversation by highlighting and responding to this story.
]]>So #4 requires a little command line love. So, if someone throws a node project at you and you don’t have time to learn all things GIT commands, maybe these few instructions will help as they are the commands I frequently execute.
And so once you have things running, you edit some code in Sublime Text, then you want to check in you can try out these commands.
1.get latest first
git pull origin master
2.commit with comments
git commit -am “awesome changes”
3.if you have files to add try this
git add .
4.push the changes up
git push origin master
PLEASE NOTE — follow at your own risk!!! These are commands that work for me in my environment and this is not a post that covers all things node or GIT clearly…I’m a noob trying to help noobs so that is dangerous ;)
Originally published June 24, 2014.
The Little Things #2 — GIT, get latest, check in was originally published in Michele Leroux Bustamante Blog on Medium, where people are continuing the conversation by highlighting and responding to this story.
]]>You can get the first two chapters right away and new chapters are right around corner.
Here's what I cover:
Microsoft Azure has over 20 platform-as-a-service (PaaS) offerings that can act in support of a big data analytics solution. So which one is right for your project? This practical book helps you understand the breadth of Azure services by organizing them into a reference framework you can use when crafting your own big data analytics solution.
You’ll not only be able to determine which service best fits the job, but also learn how to implement a complete solution that scales, provides human fault tolerance, and supports future needs.
VertexFailedFast. Vertex failure triggered quick job abort. Vertex failed: SV1_Extract[0][0] with error: Vertex user code error.
RESOLUTION
DETAILS
In my experience so far, the root causes you can check for that trigger this error include:
@r1 = EXTRACT id string, name string, street string, city string, zip string, age string FROM "/temp/CsvWithHdr.csv" USING Extractors.Csv(); @option1_knownheader = SELECT Int32.Parse(id) AS id, name, street, city, zip, string.IsNullOrEmpty(age) ? (Int16?) null: (Int16?) Int16.Parse(age) AS age FROM @r1 WHERE id != "Id"; OUTPUT @option1_knownheader TO "/temp/opt1.csv" USING Outputters.Csv(); @option2_tryparse = SELECT Int32.Parse(id) AS id, name, street, city, zip, String.IsNullOrEmpty(age) ? (Int16?) null : (Int16?) Int16.Parse(age) AS age FROM @r1 WHERE ((Func<string, bool>)(p => { Int32 dummy; return Int32.TryParse(p, out dummy); }))(id); OUTPUT @option2_tryparse TO "/temp/opt2.csv" USING Outputters.Csv();
Kudos go out to Micheal Rys for this excellent example script.
]]>#1 Messaging Directions
Event Hubs provides what I like to call a "multi-consumer" queue that defers state management responsibility (e.g., progress reading thru the queue) to the consumer. This type of queue is great for ingesting huge amounts of events/messages with great throughput from device to cloud. In a typical IoT scenario, you would configure your devices to send their messages to the Event Hub. Not to be out-done, IoT Hub also offers the same functionality. In fact, I like to explain IoT Hub as a package that wraps Event Hubs for message ingest from devices and Service Bus Brokered Messaging for sending messages from cloud to device. Event Hubs does not provide this cloud-to-device messaging flow.
#2 Device Management
Naturally, a service like IoT Hub should be more specialized than a more general purpose highly scalable queue like Event Hubs. IoT Hub provides a registry that can manage the list of devices that are "registered" as well control if those devices are actually allowed to connect and send messages. While you can build some aspects of this with Event Hubs on its own, the registry management and the supporting API's are somethings you would need to build from scratch.
#3 Protocols
Event Hubs supports HTTP and AMQP for message ingest. IoT Hubs supports HTTP, AMQP and the super-common-in-the-IoT-space MQTT protocol.
Hopefully this helps you making the course grain decisions without getting lost in the details.
]]>To that aim, I felt there was a illustration missing in the official blueprints provided by Microsoft and so I created my own for IoT. It explores some of the options for creating a lambda architecture on Azure that can be used to process the telemetry produced by IoT devices.
You can download a PDF of my template here: Download IoT 3D
Check it out!
]]>In this post, we'll examine how to save a DataFrame to permanent table, that could be queryable via Hive or via external tools.
In the previous version of Spark, you could have simply called saveAsTable against a DataFrame created from and RDD, as follows:
val textLines = hiveContext.textFile("wasb:///subfolder/mydata.csv")
val processedTextLines = textLines.map(s => s.split(","))
val resultDataFrame = processedTextLines.map(
s => /* do something */
).toDF()
resultDataFrame.saveAsTable("MyTable")
In Spark 1.6, there are few changes that might be gotchas. The main difference, is that in order for you to be able to save a DataFrame as managed table, the DataFrame must have been created from a SparkContext. This means the approach above which uses a DataFrame created from an RDD (the output of map), would throw an error. The simple solution is to create a DataFrom from the RDD by using the HiveContext explicitly:
val textLines = hiveContext.read.text("wasb:///subfolder/mydata.csv")
val processedTextLines = textLines.map(row => row.getString(0).split(","))
val resultsRDD = processedTextLines.map(
s => /* do something */
)
val resultsDataFrame = hiveContext.createDataFrame(resultsRDD)
resultsDataFrame.write.saveAsTable("MyTable")
]]>
In this post, we'll begin at the beginning- loading a CSV text file.
In the previous version of HDI you would have loaded a text file using the following syntax:
val textLines = sparkContext.textFile("wasb:///subfolder/myfile.csv")
In Spark 1.6 the loading of data has be unified underneath a the DataFrameReader, which is accessed using the read property as follows:
val textLines = sparkContext.read.text("wasb:///subfolder/myfile.csv")
When it comes time to process the lines of your text file, the output of map has changed as well. In Spark 1.3 you would have iterated over the lines in this fashion:
val myRdd = textLines.map(line => line.split(","))
In Spark 1.6, this has changed, requiring you to first get the string representation out of the iterand object:
val myRdd = textLines.map(line => line.getString(0).split(","))
Hopefully this helps you get started quickly!
]]>While it's true Azure search does a great job supporting full text search, I encourage thinking about its application with a broader lens- as the external index to another data store. For example, Azure Table Storage has long been bemoaned as not having support for secondary indexes (it only supports a single composite partition key, row key). How could you "add" a secondary index to Table Storage? Use Azure Search.
Another example is Blob storage. Effectively, files in blob storage are indexed with a single key as well that consists of the account name, container name and blob path. But what if you need to search for file stored in blob storage along different axes, for example based on some aspect of their content or properties like keywords? Again, using Azure Search as the external index is a great solution.
While we're on the topic of thinking differently about Azure Search, one final notable perspective to hold is: Azure Search is a Document datastore (it stores and indexes JSON documents after all). Does that change your thinking on where you might apply it? I thought so-- happy indexing!
]]>
The process to getting at the "nightly" builds turned out to be surprisingly simple.
First of all, like the title suggests, Azure Notification Hubs does not itself provide SMS text messaging to mobile devices.
What it does provide is in-app, push notifications. In other words, your recipients need to have your mobile app installed on their device before they can receive notifications. There is often confusion on this with because the SMS and push notifications are often used together in a solution and obviously both target the mobile device. They key difference is that SMS text messages will arrive to intended device without an app pre-install. To send SMS text messages from Azure, for example, you can use services like Twilio which is available in the Azure Marketplace. You can use Twilio Connector as an API App (for example that you can invoke from Logic Apps) or your can use the Twilio API directly.
Second of all, Notification Hubs is not for back end messaging like Azure Queues, Service Bus Brokered Messaging (Queues and Topics) or Event Hubs. It is used for the explicit purpose of sending push notifications from your solution to an app installed on a device, and it does a great job of abstracting away the peculiarities of each device's push notification system (e.g., Apple APNS, Google GCM, etc.).
Now that we're clear on that, go use Xamarin to build an awesome app and send your notifications to it using Notification Hubs already- in case you haven't heard Xamarin is now free to Visual Studio users.
]]>
With the latest update linux is the new black, and its your only option for running Spark with HDInsight.
To be clear, various Hadoop options on Windows are still available with HDInsight, just not Spark.
This change comes with it some other ramifications if you are coming from the HDInsight + Spark on Windows. The most notable is the notebook (sorry, I couldn't resist the pun). In the latest incarnations the standard notebook is shifting away from Zeppelin to only Jupyter. This should prove a small hiccup, since this Jupyter install now also supports Scala (which was the language of choice for Zeppelin on the Windows HDI clusters), in addition to Python which Jupyter effectively grew up supporting.
While these changes are about taking something away, you are also getting some new goodness-- in the form of the much anticipated latest releases of Spark 1.5.2 and Spark 1.6.0.
Now that you are aware of this new goodness, go build some epic ahem "stuff".
]]>
Rich Data Services with ASP.NET Web API Slides Demos
Build Maintainable and Extensible WPF Applications with Prism Slides Demos
WPF Data Binding in Depth Slides Demos
Enjoy!
]]>We have been working hard on getting an initial release out since turning full OSS, which we are calling Prism 6. Things had fragmented a bit with Prism in recent years with Prism 5 being the most recent release for WPF, and Prism for Windows Runtime having what they called a 2.0 release that targeted Windows 8.1 and Windows Phone 8.1 Universal apps. Well the world keeps on moving and now we have Windows 10 UWP to target as well, and Xamarin Forms has been quickly gaining momentum in the mobile space.
We’ve had some great engagement from the community in the form of jumping in and helping us make decisions on what way to go with issues being raised with the code base, new feature suggestions, and pull requests to help get us there. I want to especially call out Bart Lannoeye who has jumped in as an advisor and has been contributing a ton to managing the project, submitting pull requests, helping us get our NuGet story together and lots of other stuff… in reality he has been working a lot more on Prism than me lately, so thanks for that Bart!
So the focus lately has been:
1. Get Prism 6 for WPF out the door, which happened about a month ago. We just pushed out a new release today (6.1). NuGets should be live within a day or so, Brian Lagunas is working on automating our process for generating those since we have a lot of them now due to targeting three platforms and 5 different DI containers. We’ve still got a lot of new things planned, but this is a good stable release that people can feel confident moving to from Prism 5 if they want to be able to move along with us as we release incremental changes. Because of the change of ownership, that did mean we changed namespaces, and also based on our focus moving forward of targeting WPF, Windows 10 UWP, and Xamarin Forms there was some moving things around into a new assembly structure. But those changes are all quick and easy to patch up when you move to Prism 6 by removing the old NuGet packages for Prism 5, add the new ones for Prism 6, and do some find and replace on namespaces to get everything good to go. Our release notes here tell you what the breaking changes were in this release.
2. Get an initial release of Prism 6 for UWP out the door. The starting point for this was to migrate the code base of Prism for Windows Runtime to UWP. Most things came over pretty cleanly, but there are a lot of things different there as well. That is out now and available on NuGet.
3. Build up a new Prism 6 for Xamarin Forms library. Brian Lagunas has been leading this effort and has the code out there as a prerelease that you can start using today, but we are still a little ways out on getting a first release of that out. There are some changes coming in an update from Xamarin that affect Prism, so we are holding off until that update comes out.
So if you are a previous user of Prism, or are just brand new to it, check it out! We have a lot to offer to help you structure your XAML apps for long term maintainability and extensibility using patterns including MVVM, Dependency Injection, modularity, UI composition and so on. And if you want to get involved helping us evolve it, get engaged with us through our Github repo https://github.com/PrismLibrary/Prism.
]]>But one scenario that I did not get into in the course that I want to cover here as supplementary material is when you want to use MVVM inside of a UserControl but the ViewModel should be an implementation detail of the control that is hidden from the user of the control (as in programmer user, not end user – the end user shouldn’t have any idea how the code is constructed of course). You just want to be able to reuse that user control in a number of places in your app, you want to expose some properties on the control to drive its functionality, and you want the code “inside” that control to be well factored, easier to maintain, and possibly unit testable.
If you are trying to encapsulate some layout and presentation of controls and functionality in WPF for small scale reuse instead of large scale general purpose reuse (as in “I’m going to need this in a number of places in this app”, as opposed to “I am writing a control for a component library that will be used in all kinds of scenarios outside my development organization”), a UserControl is a great way to go. Of course if you are trying to address the wide scale general purpose reuse, you should probably consider implementing a true custom control – a class with an associated ControlTemplate that derives directly or indirectly from Control. Doing a true custom control opens the door for the user of that control to provide their own control template, or derive their own control class from yours, two things you can’t do with UserControls.
When doing MVVM in WPF, most views are UserControls, and they have a ViewModel class associated with them. Those are typically just “chunks of screen” – a decomposition of the overall screen full of presentation you want to show the user. But if you want to be able to reuse that chunk of screen in a number of places and be able to pass data into it and possibly get data, events, or commands out of it as a reusable chunk, then you want to think in terms of implementing your view as a UserControl first, and having MVVM just be an implementation choice for how you built that thing.
Doing this requires a good understanding of how data binding and DataContexts work, because if you are going to use that UserControl inside of other MVVM views, the way you are going to feed data, events, and commands in and out of the control is going to be through data binding, probably to properties exposed from the ViewModel of the containing view. But then the DataContext of the UserControl content needs to be its ViewModel to follow the MVVM panel internally. But you don’t want those two different DataContexts to conflict when setting and getting properties on the control through data binding.
To illustrate how I would go about this, I’m going to implement a scenario where I want a control that can show icons that each represent something that a user can click on to take some action in the app. Maybe the action will be to navigate to a detail view for that thing in one view, maybe it will be to show a popup to the user in another view, maybe it will be to let them re-order or delete an item in a data collection in another view. But I want the presentation of those collections of icons in my app to be consistent and I’d like the implementation to be reusable. And I need the containing view to be able to supply the data that causes the icons to be presented and the actions (commands) to be taken when an icon is clicked on.
Now with those requirements as stated I could just satisfy them without necessarily wanting or needing to implement MVVM inside of the control – the UserControl would not necessarily need a ViewModel. But if there is also some interactions that are going to be common across all the presentations of the icon view, there might be cause to put a ViewModel behind that UserControl and implement the data management and interaction handling for the view in the ViewModel following the MVVM pattern.
So in addition to the requirements described above, lets say there is also some functionality I always want present when I am showing one of those icon views – for my example I’ll limit that functionality to being able to sort the icons in ascending or descending order. For some real world usage, you might also have a filter input where you could only show icons that meet some filter criteria. Or maybe it switches between small and large icon views and a details table view like Windows Explorer does. So bottom line there will be some interactions that the user can do inside that UserControl that are common, and the logic that supports those interactions needs to manipulate the data that is driving the presentation of the control.
Here is what the app is going to look like at completion:
The Load button is in the containing View. The blue border is just there to make it very clear where the boundary of the UserControl is. Everything inside the blue border is implemented by the UserControl and its supporting ViewModel. The small up/down icons are controls that are part of the UserControl view itself and support commands to sort the icons ascending or descending. The rest of the icons are the data being presented by this control. You can see in the middle it is also set up so that each icon can present a tooltip that tells the user a little more about what that icon represents.
For my example, I want to be able to provide info to my icon view about what icons to show, and want to be able to leave it to the View/ViewModel that are containing the icon view to supply the info through data binding, as well as letting that code handle when a user clicks on a given icon. I might also want to support some sort of text to go with the icons.
So I need a simple model type that will be the objects I am binding as a collection. For my example, that model type looks like this:
1: public class IconInfo
2: {
3: public string Label { get; set; }
4: public string ResourcePath { get; set; }
5: public ICommand Command { get; set; }
6: }
Depending on which order you want to work in, you can either first define the markup and structure of the UI elements of your UserControl or you could start by defining the properties the underlying ViewModel needs to support. I’m going to start with the markup and work my way down to the ViewModel.
I’ll add a new UserControl, and call it IconView. Pretty standard stuff, hopefully you don’t need a screen shot for that step. Next I’m going to choose to use a WrapPanel as the way I want to layout my icons within the view, but I know I want to drive what items are presented through data binding. Best way to do that is to use an ItemsControl and set its ItemsPanel property to the layout panel that you want as shown below. The code below also contains the StackPanel with the two sort buttons at the top.
1: <Grid x:Name="rootGrid">
2: <Grid.DataContext>
3: <local:IconViewModel />
4: </Grid.DataContext>
5: <Grid.RowDefinitions>
6: <RowDefinition Height="Auto" />
7: <RowDefinition Height="*" />
8: </Grid.RowDefinitions>
9: <StackPanel Orientation="Horizontal">
10: <Button Command="{Binding AscSortCommand}"
11: Width="16"
12: Margin="3">
13: <Image Source="/MVVMUserControls;component/Images/DownArrow.png" />
14: </Button>
15: <Button Command="{Binding DescSortCommand}"
16: Width="16"
17: Margin="3">
18: <Image Source="/MVVMUserControls;component/Images/UpArrow.png" />
19: </Button>
20: </StackPanel>
21: <ItemsControl ItemsSource="{Binding IconInfos}"
22: ItemTemplate="{StaticResource IconTemplate}"
23: Grid.Row="1">
24: <ItemsControl.ItemsPanel>
25: <ItemsPanelTemplate>
26: <WrapPanel />
27: </ItemsPanelTemplate>
28: </ItemsControl.ItemsPanel>
29: </ItemsControl>
30: </Grid>
Note that I am setting the DataContext to the ViewModel not on the root UserControl element, but on the first child – the root grid element that contains all the markup. That is so the DataContext on the root element of the UserControl can still be whatever DataContext flowed down to it from the containing View. Otherwise, when you try to set properties on the instance of your UserControl in the containing view like shown below, the DataContext on the UserControl element will be the one that was set by its own implementation, rather than the one of the containing view.
1: <Window x:Class="MVVMUserControls.MainWindow"...>
2: <Window.DataContext>
3: <local:MainWindowViewModel />
4: </Window.DataContext>
5: <Grid>
6: ...
7: <local:IconView IconInfos="{Binding SourceIconInfos}"
8: IconWidth="32"
9: IconMargin="3"
10: Grid.Row="1"
11: Margin="10"
12: />
13: ...
14: </Grid>
15: </Window>
If the IconViewModel is set as the DataContext on the root UserControl element in IconView’s markup, you end up with this error:
System.Windows.Data Error: 40 : BindingExpression path error: ‘SourceIconInfos’ property not found on ‘object’ ”IconViewModel’ (HashCode=48519443)’. BindingExpression:Path=SourceIconInfos; DataItem=’IconViewModel’ (HashCode=48519443); target element is ‘IconView’ (Name=”); target property is ‘IconInfos’ (type ‘ObservableCollection`1’)
Instead of looking for SourceIconInfos on the MainWindowViewModel (the containing View is MainWindow), it ends up looking for it on IconViewModel because that is the current DataContext for that element after construction because it gets set by the UserControl during the parsing process. But by setting the DataContext to the IconViewModel on the root Grid element inside the UserControl, it fixes that problem.
You might want to have some properties exposed by the UserControl that can be set in its use, such as the IconWidth and IconMargin properties you can see in the previous snippet. To use the values of those in the XAML of the UserControl, you will need to use a RelativeBinding to get to them on the root element.
The presentation of each icon in my sample is driven by a DataTemplate in the UserControl markup (you could potentially even expose another property for setting by the User for IconTemplate or something like that). That template looks like this.
1: <DataTemplate x:Key="IconTemplate">
2: <Button Command="{Binding Command}"
3: CommandParameter="{Binding Label}"
4: Width="{Binding RelativeSource={RelativeSource AncestorType=local:IconView},
5: Path=IconWidth}"
6: Margin="{Binding RelativeSource={RelativeSource AncestorType=local:IconView},
7: Path=IconMargin}">
8: <Button.ToolTip>
9: <TextBlock Text="{Binding Label}" />
10: </Button.ToolTip>
11: <Image Source="{Binding ResourcePath}" />
12: </Button>
13: </DataTemplate>
If you remember from the markup of the UserControl structure itself, we have an ItemsControl that is bound to its ViewModel’s IconInfos collection. In the template above that renders each item, you can see that the button command, tooltip, and image source are just bound to the properties of the current IconInfo that the template is being rendered out for. But to get to those properties that were exposed by the control itself for setting by the user, you need to use a RelativeSource binding to “escape” the current DataContext and get to the properties that are defined on the control instance itself.
To define those properties (IconInfos at the UserControl level, IconWidth, and IconMargin), you should define DependencyProperties in the code behind of the UserControl.
1: public partial class IconView : UserControl
2: {
3: IconViewModel _vm;
4: public IconView()
5: {
6: InitializeComponent();
7: _vm = (IconViewModel)rootGrid.DataContext;
8: }
9:
10: public ObservableCollection<IconInfo> IconInfos
11: {
12: get { return (ObservableCollection<IconInfo>)GetValue(IconInfosProperty); }
13: set { SetValue(IconInfosProperty, value); }
14: }
15:
16: public static readonly DependencyProperty IconInfosProperty =
17: DependencyProperty.Register("IconInfos", typeof(ObservableCollection<IconInfo>),
18: typeof(IconView), new PropertyMetadata(null, OnIconInfosSet));
19:
20: private static void OnIconInfosSet(DependencyObject d,
21: DependencyPropertyChangedEventArgs e)
22: {
23: ((IconView)d)._vm.IconInfos = e.NewValue as ObservableCollection<IconInfo>;
24: }
25:
26: public double IconWidth
27: {
28: get { return (double)GetValue(IconWidthProperty); }
29: set { SetValue(IconWidthProperty, value); }
30: }
31:
32: public static readonly DependencyProperty IconWidthProperty =
33: DependencyProperty.Register("IconWidth", typeof(double),
34: typeof(IconView), new PropertyMetadata(-1.0));
35:
36: public Thickness IconMargin
37: {
38: get { return (Thickness)GetValue(IconMarginProperty); }
39: set { SetValue(IconMarginProperty, value); }
40: }
41:
42: public static readonly DependencyProperty IconMarginProperty =
43: DependencyProperty.Register("IconMargin", typeof(Thickness),
44: typeof(IconView), new PropertyMetadata(new Thickness(0)));
45:
46: }
Note that I have a PropertyChanged handler for the IconInfos property so I can push the value set on the control down into the ViewModel for it to manage and interact with that data. The other two properties (IconWidth and IconMargin) are just consumed by the bindings in the markup.
Finally, the implementation of the ViewModel is straightforward for this simple example:
1: internal class IconViewModel : BindableBase
2: {
3: private ObservableCollection<IconInfo> _IconInfos;
4:
5: public IconViewModel()
6: {
7: AscSortCommand = new RelayCommand(OnSortAsc);
8: DescSortCommand = new RelayCommand(OnSortDesc);
9: }
10:
11: public RelayCommand AscSortCommand { get; set; }
12: public RelayCommand DescSortCommand { get; set; }
13:
14: public ObservableCollection<IconInfo> IconInfos
15: {
16: get { return _IconInfos; }
17: set { SetProperty(ref _IconInfos, value); }
18: }
19:
20: private void OnSortAsc()
21: {
22: if (IconInfos != null)
23: IconInfos = new ObservableCollection<IconInfo>(
24: IconInfos.OrderBy(i => i.Label));
25: }
26: private void OnSortDesc()
27: {
28: if (IconInfos != null)
29: IconInfos = new ObservableCollection<IconInfo>(
30: IconInfos.OrderByDescending(i=>i.Label));
31: }
32: }
Hope that makes it clear how you can manage having the implementation of a UserControl use MVVM itself, but still act like a fully encapsulated reusable control that exposes bindable properties that can be set in the containing view.
You can find the full source code for the sample here.
]]>There are a few other features that I need to do a bit more work to get ready for UWP including search and settings support, secondary tiles, and the validation classes from Prism for Windows Runtime. I hope to get all that done this week.
After that, the next priority is to start trying to migrate some or all of the modularity and region functionality of Prism for WPF into Prism for UWP.
So check it out and let us know what you think, any problems you have, or features you would like to see added there:
]]>Wanted to share my slide deck here in case anyone wants it for reference. Slides
Demos were mostly from the platform SDK samples found here: https://github.com/Microsoft/Windows-universal-samples
And my one converted 8.1 app I showed you can grab here.
Enjoy!
]]>Enjoy!
]]>The basis for this question is usually that they tried, but quickly discovered that the Password property on PasswordBox is not a DependencyProperty, therefore it cannot be the target of a Binding, and therefore there is no straightforward way of reading and writing the value through a binding to a property in your ViewModel.
So the first thing you have to ask yourself before you pursue an MVVM-compatible solution is: Am I using PasswordBox just to get the password hiding behavior that is built in from a user experience perspective, or am I using it because I want the password encrypted in memory that the PasswordBox gives me?
If you are not sure why encrypting the value of your password entry in memory is important, I won’t go into the background of what kinds of exploits exist there in detail. The short answer is that if someone (or some code – as in a virus or worm) gets access to your program memory, they could steal your password and impersonate you to that program or system at some point. The chances of that are fairly remote, but bottom line if you want your program to be as secure as possible, it is a fairly easy attack vector to protect against. Let the PasswordBox does what it does, and don’t do something in your code that sits behind it that causes the password to be exposed in memory for long periods of time.
That means even if you could data bind the PasswordBox value into a string property on your ViewModel or Model, you shouldn’t. Because you would be leaving the value just as exposed in memory in your ViewModel property’s backing field as if the PasswordBox did not store it encrypted itself.
So what can you do in the context of MVVM? As long as you are just grabbing a reference to the SecureString that the PasswordBox stores the value in and holding on to that in your ViewModel or Model property, you are still protected. Then the only challenge in terms of MVVM is that there is no straightforward way to do that with a Binding and the properties exposed by the control.
Now you could wire up everything I am going to show here as code behind in the view that has the PasswordBox since this shouldn’t be something you will be doing all over the place in your app. But my intent here is to show you how you can follow the same patterns you do for other fields you are binding in your MVVM screens.
I’m going to show it using a Behavior – a chunk of reusable code that you can wire up easily in XAML. If you want more background on behaviors, check out my Pluralsight course Extending XAML Applications with Behaviors – http://www.pluralsight.com/courses/extending-xaml-applications-behaviors. A behavior is a great way to encapsulate code that bridges between an API on a control that is not conducive to data binding, and exposing that information from the behavior in a way that is conducive to data binding.
So the idea is to create a behavior that listens to the PasswordChanged event that PasswordBox will raise as the user types characters into the PasswordBox and use that to set some property on our ViewModel. To make the behavior reusable, we don’t want to couple it to the ViewModel type at all. So what we can do is expose a DependencyProperty on the behavior itself that can be bound to a property on your ViewModel. Then, when the event fires, we go set the property that the binding points to using the value of the SecurePassword property of the control, which is a reference to the SecureString being managed by the PasswordBox.
Here is what that behavior looks like in code:
1: public class PasswordBoxBindingBehavior : Behavior<PasswordBox>
2: {
3: protected override void OnAttached()
4: {
5: AssociatedObject.PasswordChanged += OnPasswordBoxValueChanged;
6: }
7:
8: public SecureString Password
9: {
10: get { return (SecureString)GetValue(PasswordProperty); }
11: set { SetValue(PasswordProperty, value); }
12: }
13:
14: public static readonly DependencyProperty PasswordProperty =
15: DependencyProperty.Register("Password", typeof(SecureString),
16: typeof(PasswordBoxBindingBehavior), new PropertyMetadata(null));
17:
18:
19: private void OnPasswordBoxValueChanged(object sender, RoutedEventArgs e)
20: {
21: var binding = BindingOperations.GetBindingExpression(this, PasswordProperty);
22: if (binding != null)
23: {
24: PropertyInfo property = binding.DataItem.GetType()
25: .GetProperty(binding.ParentBinding.Path.Path);
26: if (property != null)
27: property.SetValue(binding.DataItem, AssociatedObject.SecurePassword, null);
28: }
29: }
30:
31: }
You can see that in the OnAttached override, I hook the PasswordChanged event. I also expose a DependencyProperty of type SecureString named Password. Then, the only trick is how to set the underlying property of a Binding that is set on the Password property. We can’t simply set Password from inside the Behavior because that ends up replacing the current value, which is the reference to the Binding, with the new value, thus breaking the link to the underlying property the binding points to. So you have to obtain the binding expression for the property, and use that to go set the underlying property through the binding. You can see the (somewhat obscure) code in the behavior that does that for us.
Once you have that Behavior created, hooking it and the binding up to the PasswordBox is as simple as this:
1: <PasswordBox Grid.Row="1"
2: Grid.Column="1">
3: <i:Interaction.Behaviors>
4: <local:PasswordBoxBindingBehavior Password="{Binding Password}"/>
5: </i:Interaction.Behaviors>
6: </PasswordBox>
You will have to add an xmlns namespace for Blend SDK to bring in the Interaction.Behaviors attached property. Easiest way to do that is to build the project, go open the solution in Blend, and drag and drop the behavior from the Behaviors collection in the Assets panel onto the PasswordBox in the designer or the Objects and Timeline panel. I show how to do that in my course. You can see then it is just a matter of Binding the Password property on the behavior to the appropriate SecureString property on the ViewModel and let the behavior take care of transferring the value of the SecureString to the ViewModel property whenever it changes.
Because SecureString is a reference type, you could just set it once but doing so on each change ensures that if the binding hookup happens after the behavior is attached it will still work.
At some point you will have to pull the value out of the SecureString to pass it off to a Login API or validate it. To do that you write code that looks like the following:
1: public class AuthenticationService : IAuthenticationService
2: {
3: public bool Login(string username, SecureString password)
4: {
5: IntPtr passwordBSTR = default(IntPtr);
6: string insecurePassword = "";
7: try
8: {
9: passwordBSTR = Marshal.SecureStringToBSTR(password);
10: insecurePassword = Marshal.PtrToStringBSTR(passwordBSTR);
11: }
12: catch
13: {
14: insecurePassword = "";
15: }
16: return MockServiceProxyCall(username, insecurePassword);
17: }
18:
19: private bool MockServiceProxyCall(string username, string password)
20: {
21: if (username == "Brian" && password == "password") return true;
22: else return false;
23: }
24: }
The key thing is to leave it in the SecureString as long as possible while the value is at rest in a member variable or field on an object. Only pull out the value into an insecure string as briefly as possible and only in a stack variable (local variable in a method) so that it only lives in an unprotected state in memory on the stack as long as that stack frame (method) is executing.
So that is it, a somewhat straightforward, reusable way to bind WPF PasswordBox controls to properties on an MVVM ViewModel that still keeps the password value protected until you are really ready to use it.
]]>You can download or view that video here.
The video walks through creating a HelloWorld app with Prism for Windows Runtime 2.0, including setting up your application class, your first view and view model, using the ViewModelLocator to tie them together, and then adding the Unity container and overriding the default view model factory for the ViewModelLocator.
Enjoy!
]]>For those that attended… thanks! For them and anyone else who wants to check out my slides and demos from my sessions, here you go:
Building Azure Mobile Services with ASP.NET Web API | Slides | Demos |
Building Rich Data Web APIs with ASP.NET OData | Slides | Demos |
WPF Data Binding in Depth | Slides | Demos |