Yep, you read that correctly. Microsoft is at it again – changing the licensing for PowerApps and Flow. Even though they just changed the licensing in February of 2019, they are making significant changes that will be launching in October. These changes come on the heels of the launch of PowerApps Portals, which are low-code websites for external users. Although I understand the need to add new/different levels of licensing for this new feature, it seems like overkill to change all the licensing just 5 months after a major overhaul. Furthermore, the changes could have significant financial implications for some, and the announcement has left the community up in arms.
I attended the Azure Virtual Day Camp put on by the Power Platform Users Group earlier this week. I registered for sessions from two different tracks (Developer and Architect); but in the end, they only registered me for 3 sessions in the Architect track (some of which were sessions for which I had not even registered). I was a bit disappointed, because I really wanted to attend the Developer sessions. The saving grace is that they sent me the recordings from the Developer sessions. Hopefully, I can find some time to watch them.
Developing with PowerApps, Flow and Azure Cognitive Services
My first session by Mariano Gomez was the most interesting. Mariano walked us through developing a Conference Badge Scanner App. The app scans a badge, converts the data to text, and sends an email to the badge owner. This same technology could easily be used to scan business cards and send them to a contacts list/data base. The App uses PowerApps, Flow and the Computer Vision API. Mariano demontrated building the app during the 45-minute session. That is how easy it is to leverage the power of the power platform. Continue reading “Azure Virtual Day Camp Review”
Earlier this month I attended the Codemash developers conference at the Kalahari Waterpark in Sandusky, OH. This was my 11th time going to the conference and I always come back with a list of things I want to learn more about. This year was no different and overall it was probably the best one I have attended. Following are a few of the more interesting sessions I attended.
This was full day workshop that went through in detail a typical API architecture written in .NET Core and including other common packages for Dependency Injection (Autofac), Testing (XUnit), Logging (SeriLog), Mocking (Moq), API Documentation (Swagger), Object Mapping (AutoMapper), plus a working example of using MongoDB with .NET Core. Lots of good takeaways from this.
Although Docker is not new, I have not really done anything with it before. This ½ day session included an AWS instance with the prerequisites already setup so we were able to go over creating a Docker image, and using DockerHub to find existing images to work with. It was a perfect to getting-started workshop for my level of Docker experience.
This session, in addition to the Docker pre-compiler, went over some cool uses of Docker images. The most interesting one to me was where the speaker described how each night that take a backup of the their production database, scrub the data of private information, and update an internal Docker image with the database backup. Then each morning all of the developers can pull the new image and do their development with data that is essentially production data.
These were two separate sessions but they are very much related technologies. Service Workers are a key part of Progress Web Apps. I have many years of web development experience and PWA’s are something I have been interested in learning more about. The PWA session was a great introduction and included details on when a PWA is the appropriate choice for an app, and a lot of good examples on how to setup a PWA.
Overall I feel like the time at Codemash was well spent and as usual I have a list of new tech to on my list of things to learn more about this year.
I didn’t actually attend the summit, but rather took advantage of the fact that Microsoft is generous enough to make all of the sessions available on-demand. The Advanced Expressions for MS Flow session, led by Stephen Siciliano, was chock-full of information on the various types of advanced expressions available in MS Flow, suggested uses for these different types, and real-world demos. Using advanced expressions can seriously kick up your MS Flow game, so I highly recommend becoming familiar with these gems.
Advanced expressions are function expressions that can be written in a compose action or inline in a conditional. When an advanced expression is written in a compose action, the result of the expression can then be used in other areas of your flow. On the other hand, if the expression is written in a conditional, the result of the expression will be used to determine to which path the flow will continue. In this case, the expression must begin with the @ character, and the expressions that can be used here include equals(), and(), or(), not(), less(), lessOrEquals(), greater(), and greaterOrEquals().
However, I may be getting ahead of myself. You may still be asking “Where do I find advanced expressions?” So, let me start there. Once you create an action, click on “Add dynamic content”, in the pop up, there are tabs for “Dynamic content” and “Expression”. Click on “Expression”. All of the advanced expressions are listed by type. They also include a short snippet description to assist you in determining what they do and how you might use them. It helps that most of their names are fairly descriptive as well.
The beauty of advanced expressions is they give you many more options for working with your data; and therefore, you can create flows that can do more for you. With advanced expressions you have the power to manipulate and generate data in the following ways:
Converting Data Types
- MS Flow automatically converts some data types. For example, integers will automatically be converted to strings. What this means is that the data will be available both as an integer and as a string in the data content.
- Other, less obvious, conversions can be written as an expression by the flow author. For example, if you need to convert a base64 encoded string to a string, you would use base64ToString(). There are advanced expressions for converting to string, floating point, integer, boolean, base64, Data URI, URI component, binary, array, JSON object, and XML content.
Working with Strings
- There are expressions for joining two strings, concat(); extracting a chunk of a string, substring(); or replacing sections of a string, replace().
- If you need to convert the case of a string, you can use toLower() and toUpper().
- Finding the location of text in a string is easy with indexOf() and lastIndexOf().
- Lastly, if you need to check if a string starts with or ends with a value, you can use startsWith() or endsWith().
- Doing simple arithmetic, or even advanced arithmetic, can be achieved with the arithmetic expressions. These include:
- add(), returns the result of adding two numbers
- sub(), returns the result of subtracting two numbers
- mul(), returns the result of multiplying two numbers
- div(), returns the result of dividing two numbers
- mod(), returns the remainder after dividing two numbers
- Advanced arithmetic is possible, because you can use expressions within expressions. For example, if you want to complete a + b / c, your expression would be add(a, div(b,c)).
- Min() and max() are expressions that return the minimum or maximum value from an array of numbers.
- There are a bunch of advanced expressions for manipulating date/time. These include, but are not limited to, expressions for:
- Returning the current timestamp as a string, utcNow()
- Adding times together, addMinutes(), addHours(), addDays(), etc
- Converting time zones, convertTimeZone(), convertToUtc(), convertFromUtc()
- Formatting date/time into a string, formatDateTime()
- Returning a segment of time from a timestamp, dayOfWeek(), dayOfMonth(), etc.
- The two most helpful examples of expressions that generate data are:
- guid(), returns a globally unique string
- rand(), which returns a random integer within the specified range
The if() expression can be helpful if you are simply trying to add styling or set a value based on a condition. You can write a simple if() expression rather than add an additional layer of conditions into the flow. Multiple layers of nested conditions can become confusing and can get short circuited if a missing property gets referenced.
Properties that are not set or return as null will cause your flow to fail. To avoid this, use the coalesce() function in conjunction with the ? character. The idea is to set a default value for the property that will be used if the property returns as null. This looks something like this: coalesce(body(‘Get_record’)?[‘content’], ‘Default Value’).
There are also some really cool advanced expressions for working with lists/arrays, and workflows. I encourage you to poke around in the Expression tab to see what else is available. In the session, Siciliano also briefly discussed asynchronous actions (using 2 triggers in the same flow), working with other flows (using the Flow Management Connector), and calling nested workflows (use this to break up larger flows into smaller chunks). As I stated earlier, this session was chock-full of information. It was well worth the time spent. I’d like to think my Flow game has been kicked up a notch as a result.
Time flies when you’re having fun and that means Ignite will be here before we know it. As expected Microsoft has already started to lay the ground work for some of the talking points at Ignite with their feature and enhancement announcements in August and will likely continue that trend through September.
Office 365 Roadmap Transitioning to Microsoft 365 Roadmap
When Microsoft first rolled out the Microsoft 365 package (Office 365, Windows 10, and Enterprise Mobility & Security) there was a lot of confusion around what the differences were between Microsoft 365 and Office 365. In fact, we still get questions about this regularly and with this latest change that trend is likely to tick upward. In mid-September 2018 Microsoft will be moving the Office 365 Roadmap to a new location on the web and adding Microsoft 365 features. Continue reading “WHAT’S NEW IN OFFICE 365 (SEPTEMBER 2018)”
It’s a new year, a chance to have a clean slate. As humans, we want to make the most of this clean start to a fresh new year. What better way to start a new year out by analyzing what we did wrong last year and vowing to fix it in the coming year.
New Year’s Resolutions.
They can be personal or professional, secret or open for the world to know. They’re made with the best of intentions and the strongest of convictions.
And yet, only 8% of those that make resolutions will actually succeed.
Why do we tend to fail? What takes us from being hopeful and determined to slowly giving up? and how can we get those resolutions to stick?
In the 1970’s, a book called Psycho–Cyberkinetics by Maxwell Maltz sent a popular notion out into society: It takes three weeks to create a habit and three days to break one.
It’s a catchy saying and for some people, 21 days is ample time to create a habit. However, according to a 2009 study, the time it takes to form a habit really isn’t that clear-cut. Researchers from University College London examined the new habits of 96 people over the space of 12 weeks, and found that the average time it takes for a new habit to stick is actually 66 days; furthermore, individual times varied from 18 to a whopping 254 days.
Is there any more paradoxical time of year than Winter Solstice? At its heart, Winter Solstice brings the shortest day of the year mixed with the heightened anticipation of the holidays. It is a time of year where you have endless feel-good Hallmark movies and Christmas songs on every radio station, yet the cold, cloudy-quickly-turned-to-dark days makes average Midwest citizens prone to Seasonal Affective Disorder (SAD). Continue reading “Staying Focused & Overcoming the SADness of the Winter Season”