Xamarin: Live Webinar | Continuous Everything: Why You Need Mobile DevOps

Join Xamarin VP of Product Keith Ballinger on Thursday, August 11 at 11 am PT / 2 pm ET / 6 pm GMT for his webinar on why you need to implement Mobile DevOps. Whether you’re a mobile-only startup looking to turn early adopters into evangelists or a multi-million dollar enterprise mobilizing your workforce, you […]

The post Live Webinar | Continuous Everything: Why You Need Mobile DevOps appeared first on Xamarin Blog.

Xamarin: Power Up Visual Studio Using XAML Power Toys

Xamarin.Forms makes it fast, easy, and fun to create cross-platform mobile apps for iOS, Android, and Windows. When combined with Visual Studio 2015, the most powerful development environment, developers can be massively productive. From a single IDE, developers can build apps that run on any device, from mobile to IoT devices to the cloud. Apart […]

The post Power Up Visual Studio Using XAML Power Toys appeared first on Xamarin Blog.

Gerald Versluis: The road to being a Xamarin Certified Developer

For the past time I have been enrolled in Xamarin University with as main goal to verify if the knowledge I had gained by learning myself was the right way. And of course, while I’m at it get certified in the process. In this post I would like to tell you about my experience with University and how you can get started today as well! Not a very technical post this time, so skip this one if you’re looking for that!

So, what is it?

Let’s get something out of the way immediately; Xamarin University is awesome, a bit expensive at about 1800 dollars per year if you are a one-man developer, but awesome.

If you’re used to a Pluralsight, Channel 9 or even YouTube then you’re om for a treat! Xamarin University is not just static videos which you can watch and skip you as you like – although they are available! – they are actual live classes! With actual instructors and the opportunity to ask questions etc. So that is really great!

This also allows for some cool interactions, some instructors start off by greeting everyone and checking where everyone is from and also be prepared for flash quizes! Almost all classes have some individual of class exercises so you get the hang of the subject right away instead of just listening passively.

Besides that you can watch back the videos, do some self-guided classes (with the same flash quizes and exercises) and.. GET CERTIFIED!

Another caveat of this method is that attendance is required for the classes that are required for certification. You cannot start the exam until you have attended all of the mandatory classes. Which are awesome, so no worries there!

Getting to it!

Once you have signed up, the first thing you need to do is specify the times you are available for classes. If you’re in Europe, like me, then some time slots aren’t ideal. But hey, they try their best! And if you really can’t find any suitable time slot you can request a separate session which does suit you. Keeping this in mind it might take you a while to follow all the courses you want, unless you are willing to follow classes which happen in the middle of the night local time.

Choosing preferred time slots
Choosing preferred time slots

Then when you look around you have several pages to point you in the right direction depending on what you main goal is. Also there are some classes which are recommended to follow first. One that is more or less mandatory is the ‘Orientation and Welcome [XAM101]’. This explains all basics kind of like I’m doing now!

You may notice the XAM101 tag at the end. This is a coding system which gives you a hint about the subject and the level of expertise that is required before following this class. These are the prefixes available today:

  • XAM; Xamarin general, mostly in the form of Xamarin Forms and cross-platform stuff
  • IOS; targeting Xamarin.iOS
  • AND; targeting Xamarin.Android
  • CSC; in-depth C# concepts
  • ENT; enterprise, targeting enterprise solutions
  • FSC; for you scarce F# developers out there
  • XTC; you won’t get high, but you’ll learn everything about Test Cloud and testing in more general

These are all separate tracks. Or some of them can be combined to a track to achieve some goal like certification. The number behind it tells you something about the expert level. I’m not sure on the details, but as a general rule: the higher the number, the more guru you need to be to understand it.

In the below graphic you can see the recommended path to certification.

Path to certification diagram (image by Xamarin University)
Path to certification diagram (image by Xamarin University)

Per track you can see what classes are available, which you have already completed and which is recommended next. The latter can also be found at more places along with the information on which times the class is available next and the ability to sign up for that specific class right away!

Underneath you can see an example of that. Here are the Self-Guided Learning classes again, they are very great! They can serve as a replacement session for an actual instructor session. So if you cannot find a suitable time or feel confident enough about a certain subject you can check out the Self-Guided class and go through it in your own time at your own pace. And the awesome thing is that it also counts as a completed class! So with this you can even achieve your goal faster!

Xamarin University Tracks
Xamarin University Tracks

Basically all pages in here are a different view for the same thing; what classes are upcoming? What classes have you planned/done already? How far along are you on a certain track? Etc. That last bit is a nice one, they’ve added some gamification to it. And damn it, I am a sucker for it, wanting to fill up all those progress bars.

That rotten nifty gamification
That rotten nifty gamification

This gives you a direct overview of how far along you are on all subjects. Of course there is no restrictions on how often you follow one class and each class has a recorded session as well if things went a little too fast for you. Note: watching (back) a video doesn’t count as attending the class.

Ok great, but how about that certification?

Woops, sorry, lost track there. So, certification!

As I have mentioned; there are 15 classes you need to follow before having a try at the certification exam. This should take you about 4 months if you’re a starting Xamarin developer. If you already have some experience, no worries, there are a couple of things you can do to get to the exam faster. First there is the Introductory Assessment Exam. This is a test you can take to prove that you already have (basic) knowledge of Xamarin. If you can pass the test with 80% or more then you can skip 7 (seven!) of the 15 classes, so you’re halfway there already. The test consists of 50 questions for which you have 60 minutes.

It certainly is doable, but there are some tricky questions in there, so pay attention! Even more so because you only get one shot. If you don’t make it, no worries, but you’ll have to attend to those 7 classes in order to qualify.

Now the classes are awesome! The instructors are even better. They take all the time to explain everything to you, have a lot of patience and all have the own trademark. One asks you where in the world all attendees are from, the other goes through the list and giving everyone the chance to introduce themselves shortly. Classes tend to be about 20-30 persons which also has a bit of a downside.
When all mics are unmuted and you are responsible for your own muting, people sometimes forget or people simply just don’t know it because they come in later. So you hear a lot of noise and ‘oops, let me mute the mic of someone coming in’. It isn’t a total disaster, but could be a bit disruptive. He total upside from that is that you can use you mic! And ask everything you like! Which rhymes.

With each class comes some materials which usually consists of some code to get you started and a recap of everything that is handled in class.

GoToTraining class session
GoToTraining class session

GIEV NOW!

So you’re all excited now and want to check it out for yourself? You can start a trial right here. And you know what’s awesome? All courses you follow here, including the self-guided once, count towards certification already! So try it, and if you like it, sign up when you are ready and pick up right where you left off not losing any time! The rewards in knowledge is great, but check out these these bad boys below. That makes it all worth it right?!

Xamarin Certified Developer glass plaques
Xamarin Certified Developer glass plaques

Edit 27-07

Guest lecture: Continuous Integration & Continuous Deployment for Your Xamarin App

Quickly after certification I have been selected to give an actual guest lecture on Xamarin University! How awesome is that?! From student to tutor!

So if you have a University account already, quickly head over there and sign up, it’s on next Tuesday already!

Xamarin: Learn How Xamarin Customers Ship Five-Star Apps

Today, we’re happy to announce our new Xamarin Customers website, which highlights our global customers across verticals, use cases, and geographies. From indie developers building their first app to multi-million dollar organizations with hundreds of apps in the pipeline, our customers are creating amazing mobile experiences. To recognize their success, we’ve captured more than 25 […]

The post Learn How Xamarin Customers Ship Five-Star Apps appeared first on Xamarin Blog.

Greg Shackles: Updated Olo.BuildTools Xamarin Studio Add-In

A couple years back I posted about an add-in we wrote to expose a command to use as part of our build process to grab a snapshot of the current versions of all the tools in the Xamarin Studio build chains. For us this is essential in being able to track how a specific app was built long after versions have been updated on the build server.

With the release of Xamarin Studio 6 the add-in model changed a bit, so add-ins needed to be updated in order to support it. We just published version 2.0 of Olo.BuildTools to the gallery which is built to support Xamarin Studio 6:

Add-In Gallery

The command itself is identical to 1.0, Hat tip to my colleague Andrew Strickland for doing the lion’s share of the work there! We left 1.0 published as well for those of you still using Xamarin Studio 5.0.

Hope others find this useful!

Johan Karlsson: Thoughts on making TinyPubSub a little less tiny

body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-top: 10px; padding-bottom: 10px; background-color: white; padding: 30px; } body > *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } a { color: #4183C4; } a.absent { color: #cc0000; } a.anchor { display: block; padding-left: 30px; margin-left: -30px; cursor: pointer; position: absolute; top: 0; left: 0; bottom: 0; } h1, h2, h3, h4, h5, h6 { margin: 20px 0 10px; padding: 0; font-weight: bold; -webkit-font-smoothing: antialiased; cursor: text; position: relative; } h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, h5:hover a.anchor, h6:hover a.anchor { background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA09pVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoMTMuMCAyMDEyMDMwNS5tLjQxNSAyMDEyLzAzLzA1OjIxOjAwOjAwKSAgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OUM2NjlDQjI4ODBGMTFFMTg1ODlEODNERDJBRjUwQTQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OUM2NjlDQjM4ODBGMTFFMTg1ODlEODNERDJBRjUwQTQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5QzY2OUNCMDg4MEYxMUUxODU4OUQ4M0REMkFGNTBBNCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5QzY2OUNCMTg4MEYxMUUxODU4OUQ4M0REMkFGNTBBNCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsQhXeAAAABfSURBVHjaYvz//z8DJYCRUgMYQAbAMBQIAvEqkBQWXI6sHqwHiwG70TTBxGaiWwjCTGgOUgJiF1J8wMRAIUA34B4Q76HUBelAfJYSA0CuMIEaRP8wGIkGMA54bgQIMACAmkXJi0hKJQAAAABJRU5ErkJggg==) no-repeat 10px center; text-decoration: none; } h1 tt, h1 code { font-size: inherit; } h2 tt, h2 code { font-size: inherit; } h3 tt, h3 code { font-size: inherit; } h4 tt, h4 code { font-size: inherit; } h5 tt, h5 code { font-size: inherit; } h6 tt, h6 code { font-size: inherit; } h1 { font-size: 28px; color: black; } h2 { font-size: 24px; border-bottom: 1px solid #cccccc; color: black; } h3 { font-size: 18px; } h4 { font-size: 16px; } h5 { font-size: 14px; } h6 { color: #777777; font-size: 14px; } p, blockquote, ul, ol, dl, li, table, pre { margin: 15px 0; } hr { background: transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAECAYAAACtBE5DAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OENDRjNBN0E2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OENDRjNBN0I2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4Q0NGM0E3ODY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4Q0NGM0E3OTY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PqqezsUAAAAfSURBVHjaYmRABcYwBiM2QSA4y4hNEKYDQxAEAAIMAHNGAzhkPOlYAAAAAElFTkSuQmCC) repeat-x 0 0; border: 0 none; color: #cccccc; height: 4px; padding: 0; } body > h2:first-child { margin-top: 0; padding-top: 0; } body > h1:first-child { margin-top: 0; padding-top: 0; } body > h1:first-child + h2 { margin-top: 0; padding-top: 0; } body > h3:first-child, body > h4:first-child, body > h5:first-child, body > h6:first-child { margin-top: 0; padding-top: 0; } a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 { margin-top: 0; padding-top: 0; } h1 p, h2 p, h3 p, h4 p, h5 p, h6 p { margin-top: 0; } li p.first { display: inline-block; } li { margin: 0; } ul, ol { padding-left: 30px; } ul :first-child, ol :first-child { margin-top: 0; } dl { padding: 0; } dl dt { font-size: 14px; font-weight: bold; font-style: italic; padding: 0; margin: 15px 0 5px; } dl dt:first-child { padding: 0; } dl dt > :first-child { margin-top: 0; } dl dt > :last-child { margin-bottom: 0; } dl dd { margin: 0 0 15px; padding: 0 15px; } dl dd > :first-child { margin-top: 0; } dl dd > :last-child { margin-bottom: 0; } blockquote { border-left: 4px solid #dddddd; padding: 0 15px; color: #777777; } blockquote > :first-child { margin-top: 0; } blockquote > :last-child { margin-bottom: 0; } table { padding: 0;border-collapse: collapse; } table tr { border-top: 1px solid #cccccc; background-color: white; margin: 0; padding: 0; } table tr:nth-child(2n) { background-color: #f8f8f8; } table tr th { font-weight: bold; border: 1px solid #cccccc; margin: 0; padding: 6px 13px; } table tr td { border: 1px solid #cccccc; margin: 0; padding: 6px 13px; } table tr th :first-child, table tr td :first-child { margin-top: 0; } table tr th :last-child, table tr td :last-child { margin-bottom: 0; } img { max-width: 100%; } span.frame { display: block; overflow: hidden; } span.frame > span { border: 1px solid #dddddd; display: block; float: left; overflow: hidden; margin: 13px 0 0; padding: 7px; width: auto; } span.frame span img { display: block; float: left; } span.frame span span { clear: both; color: #333333; display: block; padding: 5px 0 0; } span.align-center { display: block; overflow: hidden; clear: both; } span.align-center > span { display: block; overflow: hidden; margin: 13px auto 0; text-align: center; } span.align-center span img { margin: 0 auto; text-align: center; } span.align-right { display: block; overflow: hidden; clear: both; } span.align-right > span { display: block; overflow: hidden; margin: 13px 0 0; text-align: right; } span.align-right span img { margin: 0; text-align: right; } span.float-left { display: block; margin-right: 13px; overflow: hidden; float: left; } span.float-left span { margin: 13px 0 0; } span.float-right { display: block; margin-left: 13px; overflow: hidden; float: right; } span.float-right > span { display: block; overflow: hidden; margin: 13px auto 0; text-align: right; } code, tt { margin: 0 2px; padding: 0 5px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-radius: 3px; } pre code { margin: 0; padding: 0; white-space: pre; border: none; background: transparent; } .highlight pre { background-color: #f8f8f8; border: 1px solid #cccccc; font-size: 13px; line-height: 19px; overflow: auto; padding: 6px 10px; border-radius: 3px; } pre { background-color: #f8f8f8; border: 1px solid #cccccc; font-size: 13px; line-height: 19px; overflow: auto; padding: 6px 10px; border-radius: 3px; } pre code, pre tt { background-color: transparent; border: none; } sup { font-size: 0.83em; vertical-align: super; line-height: 0; } * { -webkit-print-color-adjust: exact; } @media screen and (min-width: 914px) { body { width: 854px; margin:0 auto; } } @media print { table, pre { page-break-inside: avoid; } pre { word-wrap: break-word; } } /** * prism.js default theme for JavaScript, CSS and HTML * Based on dabblet (http://dabblet.com) * @author Lea Verou */ code[class*=”language-“], pre[class*=”language-“] { color: black; background: none; text-shadow: 0 1px white; font-family: Consolas, Monaco, ‘Andale Mono’, ‘Ubuntu Mono’, monospace; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } pre[class*=”language-“]::-moz-selection, pre[class*=”language-“] ::-moz-selection, code[class*=”language-“]::-moz-selection, code[class*=”language-“] ::-moz-selection { text-shadow: none; background: #b3d4fc; } pre[class*=”language-“]::selection, pre[class*=”language-“] ::selection, code[class*=”language-“]::selection, code[class*=”language-“] ::selection { text-shadow: none; background: #b3d4fc; } @media print { code[class*=”language-“], pre[class*=”language-“] { text-shadow: none; } } /* Code blocks */ pre[class*=”language-“] { padding: 1em; margin: .5em 0; overflow: auto; } :not(pre) > code[class*=”language-“], pre[class*=”language-“] { background: #f5f2f0; } /* Inline code */ :not(pre) > code[class*=”language-“] { padding: .1em; border-radius: .3em; white-space: normal; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: slategray; } .token.punctuation { color: #999; } .namespace { opacity: .7; } .token.property, .token.tag, .token.boolean, .token.number, .token.constant, .token.symbol, .token.deleted { color: #905; } .token.selector, .token.attr-name, .token.string, .token.char, .token.builtin, .token.inserted { color: #690; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string { color: #a67f59; background: hsla(0, 0%, 100%, .5); } .token.atrule, .token.attr-value, .token.keyword { color: #07a; } .token.function { color: #DD4A68; } .token.regex, .token.important, .token.variable { color: #e90; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.entity { cursor: help; }

Thoughts on making TinyPubSub a little less tiny

TinyPubSub is a very simple Publish/Subscribe library created mainly for passing events between views in an Xamarin Forms application that uses MVVM. You can read about it at https://github.com/johankson/tinypubsub.
What I’m thinking about doing is extending it with two features

  • Passing of data
  • A stack based recipient model

Passing of data

TinyPubSub only allows for publishing events from one source to many recipients. It was originally create for notifying other views to reload or refresh their data. At first this was pretty much all it was intended to do. But now I can’t help myself and I would really like to publish data as well.
This is the original way to subscribe and publish an event.
In the first view model

TinyPubSub.Subscribe("ducks-loaded", 
() => { RebindGui(); });

In another view model

TinyPubSub.Publish("ducks-loaded");

Let’s say I want to pass data, it could look like this

TinyPubSub.Subscribe("duck-color-updated", 
(c) => { RecolorDuck( c ) } );

And in the publish part

TinyPubSub.Publish("duck-color-updated", c);

An example

Let’s say you’re buildning an app for configuring a car. The first page is to choose the model. On this page there is a button to choose your color. The original page simply registers for the color-chosen event and waits happily for that to happen. We then create a generic choose color page that knows nothing about what page that really needs that color. When the color finally is choosen the page fires a color-chosen event and the first page will receive it.
All is fine until you get another subpage that also wants a color choosen. You can solve that in a number of ways. The first being to register different events for different colors choosers and pass an argument to when we create the color picker page. This is messy and could easily get out of hand.
My proposed solution is to create a function where you can state that only the latest registered listener will handle the event.

A stack based recipient model

Enter the stack based recipient model.
The mechanism behind this is simple. The latest registered recipients of a specific event is the only one that will receive an event.
Since all events for a page is deregistered automatically in TinyPubSub it will be simple to reuse the color-picker page multiple times.
To revisit the car example, just before clicking the button for coloring your car door you register to the color-chosen event with the `SubscribeExclusive(...) method.

TinyPubSub.SubscribeExclusive("color-chosen", 
(c) => { RecolorCarDoor( c ) } );
await Navigation.PushAsync(Resolver.Resolve());

Then it doesn’t matter if you have another page listening for the color-chosen event. Only the page before will get the event. And when the page goes out of scope, the subscription for the event will be removed and the page before will get the event instead.
This also means that the ColorPickerPage could check at runtime to see if there are any recipients at all and throw an Exception if there is none.

Summary

This is still not implemented. I thought I just write it down first and get some comments on it.
var _self=”undefined”!=typeof window?window:”undefined”!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(){var e=/blang(?:uage)?-(w+)b/i,t=0,n=_self.Prism={util:{encode:function(e){return e instanceof a?new a(e.type,n.util.encode(e.content),e.alias):”Array”===n.util.type(e)?e.map(n.util.encode):e.replace(/&/g,”&”).replace(/,”<").replace(/u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).match(/[object (w+)]/)[1]},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++t}),e.__id},clone:function(e){var t=n.util.type(e);switch(t){case"Object":var a={};for(var r in e)e.hasOwnProperty(r)&&(a[r]=n.util.clone(e[r]));return a;case"Array":return e.map&&e.map(function(e){return n.util.clone(e)})}return e}},languages:{extend:function(e,t){var a=n.util.clone(n.languages[e]);for(var r in t)a[r]=t[r];return a},insertBefore:function(e,t,a,r){r=r||n.languages;var l=r[e];if(2==arguments.length){a=arguments[1];for(var i in a)a.hasOwnProperty(i)&&(l[i]=a[i]);return l}var o={};for(var s in l)if(l.hasOwnProperty(s)){if(s==t)for(var i in a)a.hasOwnProperty(i)&&(o[i]=a[i]);o[s]=l[s]}return n.languages.DFS(n.languages,function(t,n){n===r[e]&&t!=e&&(this[t]=o)}),r[e]=o},DFS:function(e,t,a,r){r=r||{};for(var l in e)e.hasOwnProperty(l)&&(t.call(e,l,e[l],a||l),"Object"!==n.util.type(e[l])||r[n.util.objId(e[l])]?"Array"!==n.util.type(e[l])||r[n.util.objId(e[l])]||(r[n.util.objId(e[l])]=!0,n.languages.DFS(e[l],t,l,r)):(r[n.util.objId(e[l])]=!0,n.languages.DFS(e[l],t,null,r)))}},plugins:{},highlightAll:function(e,t){var a={callback:t,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};n.hooks.run("before-highlightall",a);for(var r,l=a.elements||document.querySelectorAll(a.selector),i=0;r=l[i++];)n.highlightElement(r,e===!0,a.callback)},highlightElement:function(t,a,r){for(var l,i,o=t;o&&!e.test(o.className);)o=o.parentNode;o&&(l=(o.className.match(e)||[,""])[1],i=n.languages[l]),t.className=t.className.replace(e,"").replace(/s+/g," ")+" language-"+l,o=t.parentNode,/pre/i.test(o.nodeName)&&(o.className=o.className.replace(e,"").replace(/s+/g," ")+" language-"+l);var s=t.textContent,u={element:t,language:l,grammar:i,code:s};if(!s||!i)return n.hooks.run("complete",u),void 0;if(n.hooks.run("before-highlight",u),a&&_self.Worker){var c=new Worker(n.filename);c.onmessage=function(e){u.highlightedCode=e.data,n.hooks.run("before-insert",u),u.element.innerHTML=u.highlightedCode,r&&r.call(u.element),n.hooks.run("after-highlight",u),n.hooks.run("complete",u)},c.postMessage(JSON.stringify({language:u.language,code:u.code,immediateClose:!0}))}else u.highlightedCode=n.highlight(u.code,u.grammar,u.language),n.hooks.run("before-insert",u),u.element.innerHTML=u.highlightedCode,r&&r.call(t),n.hooks.run("after-highlight",u),n.hooks.run("complete",u)},highlight:function(e,t,r){var l=n.tokenize(e,t);return a.stringify(n.util.encode(l),r)},tokenize:function(e,t){var a=n.Token,r=[e],l=t.rest;if(l){for(var i in l)t[i]=l[i];delete t.rest}e:for(var i in t)if(t.hasOwnProperty(i)&&t[i]){var o=t[i];o="Array"===n.util.type(o)?o:[o];for(var s=0;s<o.length;++s){var u=o[s],c=u.inside,g=!!u.lookbehind,h=!!u.greedy,f=0,d=u.alias;u=u.pattern||u;for(var p=0;pe.length)break e;if(!(m instanceof a)){u.lastIndex=0;var y=u.exec(m),v=1;if(!y&&h&&p!=r.length-1){var b=r[p+1].matchedStr||r[p+1],k=m+b;if(p=m.length)continue;var _=y.index+y[0].length,P=m.length+b.length;if(v=3,P>=_){if(r[p+1].greedy)continue;v=2,k=k.slice(0,P)}m=k}if(y){g&&(f=y[1].length);var w=y.index+f,y=y[0].slice(f),_=w+y.length,S=m.slice(0,w),O=m.slice(_),j=[p,v];S&&j.push(S);var A=new a(i,c?n.tokenize(y,c):y,d,y,h);j.push(A),O&&j.push(O),Array.prototype.splice.apply(r,j)}}}}}return r},hooks:{all:{},add:function(e,t){var a=n.hooks.all;a[e]=a[e]||[],a[e].push(t)},run:function(e,t){var a=n.hooks.all[e];if(a&&a.length)for(var r,l=0;r=a[l++];)r(t)}}},a=n.Token=function(e,t,n,a,r){this.type=e,this.content=t,this.alias=n,this.matchedStr=a||null,this.greedy=!!r};if(a.stringify=function(e,t,r){if(“string”==typeof e)return e;if(“Array”===n.util.type(e))return e.map(function(n){return a.stringify(n,t,e)}).join(“”);var l={type:e.type,content:a.stringify(e.content,t,r),tag:”span”,classes:[“token”,e.type],attributes:{},language:t,parent:r};if(“comment”==l.type&&(l.attributes.spellcheck=”true”),e.alias){var i=”Array”===n.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(l.classes,i)}n.hooks.run(“wrap”,l);var o=””;for(var s in l.attributes)o+=(o?” “:””)+s+’=”‘+(l.attributes[s]||””)+'”‘;return””+l.content+””},!_self.document)return _self.addEventListener?(_self.addEventListener(“message”,function(e){var t=JSON.parse(e.data),a=t.language,r=t.code,l=t.immediateClose;_self.postMessage(n.highlight(r,n.languages[a],a)),l&&_self.close()},!1),_self.Prism):_self.Prism;var r=document.currentScript||[].slice.call(document.getElementsByTagName(“script”)).pop();return r&&(n.filename=r.src,document.addEventListener&&!r.hasAttribute(“data-manual”)&&document.addEventListener(“DOMContentLoaded”,n.highlightAll)),_self.Prism}();”undefined”!=typeof module&&module.exports&&(module.exports=Prism),”undefined”!=typeof global&&(global.Prism=Prism); Prism.languages.clike={comment:[{pattern:/(^|[^\])/*[wW]*?*//,lookbehind:!0},{pattern:/(^|[^\:])//.*/,lookbehind:!0}],string:{pattern:/([“‘])(\(?:rn|[sS])|(?!1)[^\rn])*1/,greedy:!0},”class-name”:{pattern:/((?:b(?:class|interface|extends|implements|trait|instanceof|new)s+)|(?:catchs+())[a-z0-9_.\]+/i,lookbehind:!0,inside:{punctuation:/(.|\)/}},keyword:/b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)b/,”boolean”:/b(true|false)b/,”function”:/[a-z0-9_]+(?=()/i,number:/b-?(?:0x[da-f]+|d*.?d+(?:e[+-]?d+)?)b/i,operator:/–?|++?|!=?=?|=?|==?=?|&&?|||?|?|*|/|~|^|%/,punctuation:/[{}[];(),.:]/}; Prism.languages.csharp=Prism.languages.extend(“clike”,{keyword:/b(abstract|as|async|await|base|bool|break|byte|case|catch|char|checked|class|const|continue|decimal|default|delegate|do|double|else|enum|event|explicit|extern|false|finally|fixed|float|for|foreach|goto|if|implicit|in|int|interface|internal|is|lock|long|namespace|new|null|object|operator|out|override|params|private|protected|public|readonly|ref|return|sbyte|sealed|short|sizeof|stackalloc|static|string|struct|switch|this|throw|true|try|typeof|uint|ulong|unchecked|unsafe|ushort|using|virtual|void|volatile|while|add|alias|ascending|async|await|descending|dynamic|from|get|global|group|into|join|let|orderby|partial|remove|select|set|value|var|where|yield)b/,string:[/@(“|’)(11|\1|\?(?!1)[sS])*1/,/(“|’)(\?.)*?1/],number:/b-?(0x[da-f]+|d*.?d+f?)b/i}),Prism.languages.insertBefore(“csharp”,”keyword”,{preprocessor:{pattern:/(^s*)#.*/m,lookbehind:!0,alias:”property”,inside:{directive:{pattern:/(s*#)b(define|elif|else|endif|endregion|error|if|line|pragma|region|undef|warning)b/,lookbehind:!0,alias:”keyword”}}}});

Xamarin: Preview: Android Nougat is on the Way

Today, we’re excited to release a new version of our Android N Developer Preview, which features bindings to the final APIs of the Android N SDK. The new version includes several exciting features including multi-window UI, direct reply notifications, advanced memory and power optimizations, and more for developers to integrate into their applications. Get Started […]

The post Preview: Android Nougat is on the Way appeared first on Xamarin Blog.

Gone Mobile: Gone Mobile 37: Hybrid Xamarin Apps with Drew Colthorp and Shawn Anderson

Hybrid apps with Xamarin? You bet! In this episode we’re joined by Drew Colthorp and Shawn Anderson to talk about why and how they converted their hybrid app, written in Ember, from Cordova to Xamarin.

Hosts: Greg Shackles, Jon Dick

Guests: Drew Colthorp, Shawn Anderson

Links:

Thanks to our Sponsors!

http://raygun.com

Raygun Pulse
is now available for mobile – Real user monitoring for your mobile apps! Get deep detail into how your mobile applications are performing for your users.