Magazine: The Microsoft Journal For Developers
Magazine: The Microsoft Journal For Developers
Magazine: The Microsoft Journal For Developers
magazine
magazine
Featuring
� Xamarin UI controls with innovative, code-generating productivity tools
� JavaScript/HTML5 and ASP.NET MVC components, with support for:
To speak with sales or request a product demo with a solutions consultant call 1.800.231.8588
AUGUST 2017 VOLUME 32 NUMBER 8
ID STATEMENT MSDN Magazine (ISSN 1528-4859) is
published 13 times a year, monthly with a special issue in
November by 1105 Media, Inc., 9201 Oakdale Avenue,
General Manager Jeff Sandquist Ste. 101, Chatsworth, CA 91311. Periodicals postage paid
at Chatsworth, CA 91311-9998, and at additional mailing
Director Dan Fernandez offices. Annual subscription rates payable in US funds
Editorial Director Mohammad Al-Sabt [email protected] are: U.S. $35.00, International $60.00. Annual digital
subscription rates payable in U.S. funds are: U.S. $25.00,
Site Manager Kent Sharkey International $25.00. Single copies/back issues: U.S. $10,
Editorial Director, Enterprise Computing Group Scott Bekker all others $12. Send orders with payment to: MSDN
Magazine, P.O. Box 3167, Carol Stream, IL 60132, email
Editor in Chief Michael Desmond [email protected] or call (847) 763-9560.
POSTMASTER: Send address changes to MSDN
Features Editor Sharon Terdeman
Magazine, P.O. Box 2166, Skokie, IL 60076. Canada
Features Editor Ed Zintel Publications Mail Agreement No: 40612608. Return
Undeliverable Canadian Addresses to Circulation Dept.
Group Managing Editor Wendy Hernandez or XPO Returns: P.O. Box 201, Richmond Hill,
Senior Contributing Editor Dr. James McCaffrey ON L4B 4R5, Canada.
Contributing Editors Dino Esposito, Frank La Vigne, Julie Lerman, Mark Michaelis, Printed in the U.S.A. Reproductions in whole or part
Ted Neward, David S. Platt prohibited except by written permission. Mail requests
to “Permissions Editor,” c/o MSDN Magazine, 4 Venture,
Vice President, Art and Brand Design Scott Shultz Suite 150, Irvine, CA 92618.
Art Director Joshua Gould
LEGAL DISCLAIMER The information in this magazine
has not undergone any formal testing by 1105 Media,
Inc. and is distributed without any warranty expressed
LEAD SERVICES or implied. Implementation or use of any information
contained herein is the reader’s sole responsibility. While
Vice President, Lead Services Michele Imgrund the information has been reviewed for accuracy, there
President Senior Director, Audience Development is no guarantee that the same or similar results may be
Henry Allain & Data Procurement Annette Levee achieved in all environments. Technical inaccuracies may
result from printing errors and/or new developments
Chief Revenue Officer Director, Audience Development in the industry.
Dan LaBianca & Lead Generation Marketing Irene Fincher
Director, Client Services & Webinar CORPORATE ADDRESS 1105 Media, 9201 Oakdale Ave.
Chief Marketing Officer Production Tracy Cook
Ste 101, Chatsworth, CA 91311 www.1105media.com
Carmel McDonagh
Director, Lead Generation Marketing Eric Yoshizuru MEDIA KITS Direct your Media Kit requests to Chief
Director, Custom Assets & Client Services Mallory Bastionell Revenue Officer Dan LaBianca, 972-687-6702 (phone),
ART STAFF 972-687-6799 (fax), [email protected]
Senior Program Manager, Client Services
Creative Director Jeffrey Langkau
& Webinar Production Chris Flack REPRINTS For single article reprints (in minimum
Associate Creative Director Scott Rovin quantities of 250-500), e-prints, plaques and posters
Project Manager, Lead Generation Marketing
Senior Art Director Deirdre Hoffman Mahal Ramos
contact: PARS International Phone: 212-221-9595.
E-mail: [email protected].
Art Director Michele Singh www.magreprints.com/QuickQuote.asp
Art Director Chris Main MARKETING
LIST RENTAL This publication’s subscriber list, as well as
Senior Graphic Designer Alan Tao Chief Marketing Officer Carmel McDonagh
other lists from 1105 Media, Inc., is available for rental.
Senior Web Designer Martin Peace Vice President, Marketing Emily Jacobs For more information, please contact our list manager,
Marketing & Editorial Assistant Megan Burpo Jane Long, Merit Direct. Phone: 913-685-1301;
E-mail: [email protected];
PRODUCTION STAFF
Web: www.meritdirect.com/1105
Print Production Coordinator Lee Alexander ENTERPRISE COMPUTING GROUP EVENTS
Reaching the Staff
Vice President, Events Brent Sutton
Staff may be reached via e-mail, telephone, fax, or mail.
ADVERTISING AND SALES Senior Director, Operations Sara Ross E-mail: To e-mail any member of the staff, please use the
Chief Revenue Officer Dan LaBianca Senior Director, Event Marketing Merikay Marzoni following form: [email protected]
Irvine Office (weekdays, 9:00 a.m. – 5:00 p.m. PT)
Regional Sales Manager Christopher Kourtoglou Events Sponsorship Sales Danna Vedder Telephone 949-265-1520; Fax 949-265-1528
4 Venture, Suite 150, Irvine, CA 92618
Advertising Sales Associate Tanya Egenolf Senior Manager, Events Danielle Potts Corporate Office (weekdays, 8:30 a.m. – 5:30 p.m. PT)
Coordinator, Event Marketing Michelle Cheng Telephone 818-814-5200; Fax 818-734-1522
9201 Oakdale Avenue, Suite 101, Chatsworth, CA 91311
ONLINE/DIGITAL MEDIA Coordinator, Event Marketing Chantelle Wallace The opinions expressed within the articles and other
Vice President, Digital Strategy Becky Nagel contentsherein do not necessarily express those of
the publisher.
Senior Site Producer, News Kurt Mackie
Senior Site Producer Gladys Rama
Site Producer Chris Paoli Chief Executive Officer
Site Producer, News David Ramel Rajeev Kapur
Director, Site Administration Shane Lee Chief Operating Officer
Front-End Developer Anya Smolinski Henry Allain
Junior Front-End Developer Casey Rysavy Chief Financial Officer
Executive Producer, New Media Michael Domingo Craig Rucker
Office Manager & Site Assoc. James Bowling Chief Technology Officer
Erik A. Lindgren
Executive Vice President
Michael J. Valenti
Chairman of the Board
Jeffrey S. Klein
2 msdn magazine
MEAN Machine
It was August 2015 when Ted Neward officially settled down. Neward solve thorny problems that seem to bedevil other platforms, the
for years has used his column, The Working Programmer, as a plat- bill eventually comes due.
form to cover everything and anything—from his 10-part opus on “When you’re deeper in, you discover that what was easy on your
Multiparadigmatic .NET development, to his experiment with an old platform—like .NET or JVM or whatever—is not so easy here,
ELIZA-like intelligent conversation bot (this back in 2012, mind and you’re forced to sit back in your chair and go, ‘Huh.’”
you), to his work with alternative frameworks and databases like
Oak, Cassandra and MongoDB. And don’t even get me started on
his brilliant LOLCODE column (msdn.com/magazine/dn166934)—I’m “I originally thought this would
still chuckling about that.
But it was two years ago this month that Neward—accidentally, maybe be a six- to nine-piece
it turns out—settled on a single topic. Since his August 2015 column,
“How To Be MEAN: Getting Started” (msdn.com/magazine/mt185576), series, and then we’d move on to
Neward has been exploring the popular MEAN stack, consisting of
MongoDB, Express, Angular and Node.js. That article was intended some other things.”
to be the first of perhaps half a dozen columns exploring MEAN.
Now, 24 months later, Neward is still at it. And judging by the online Ted Neward, MSDN Magazine Columnist
traffic his columns are generating, he could go another 24 months.
“I originally thought this would maybe be a six- to nine-piece
series, and then we’d move on to some other things,” Neward says. At the end of the day, MEAN is just an architectural stack, much
“In fact, I have a number of .NET-centric ideas waiting in the wings, like LAMP (Linux, Apache, MySQL, PHP) before it, and Neward
including a piece or two on static code analyzers, which is about cautions against ascribing too much to it.
as far from the world of dynamic, typeless, JavaScript-y program- “We talked about this a year or so ago: You can build an ASP.NET
ming as you can get.” WebAPI + CouchDB + ReactJS stack, and call it ‘ARC,’ if you like, and
Neward describes writing about the MEAN stack as “both tricky have just as much success with it as you can with MEAN.”
and rewarding,” with frequent, major updates unveiling green fields Neward should know. He’s been having success with MEAN for
to explore. This was particularly true of the Angular 2 release in two years now, and he’s not done yet. In upcoming issues, he says
September 2016, which Neward describes as a “complete transfor- he plans to dive into Angular Routing, and from there into testing
mation,” but he also singles out changes to both TypeScript and and forms.
the ECMAScript language. And while Neward says MEAN can
Visit us at msdn.microsoft.com/magazine. Questions, comments or suggestions for MSDN Magazine? Send them to the editor: [email protected].
4 msdn magazine
ActivePDF provides developers and IT professionals with the capability to move closer to a fully
functional digital environment. Digitalize your organization by integrating PDF manipulation
and automation into your business process workflow. Join the PDF Revolution!
DocSight™ Unattended server applications that enable creation, conversion and other PDF functionality.
OCR DocConverter Meridian
Image conversion of PDF files High-volume document Network PDF printer for
to searchable text conversion unlimited users
DocSpace™ Server applications with user interfaces for viewing, creating and interacting with PDF.
ReaderPlus
Browser-based PDF viewer
and editor Download your FREE 30-day trial g www.ActivePDF.com
Toll Free US: 866 468 6733 | Outside US: +1 949 582 9002
Creating Extensions
for Multiple
Visual Studio Versions
Carlos Quintero
The release of a new version of Visual Studio is always a In this article, I’ll show you how to accomplish this. For this
challenge for developers of extensions (packages, add-ins, templates purpose, I’ll focus on the most common scenario: a package with
and so forth). For example, Visual Studio 2010 introduced the new a command, created in a managed language (C#, in this case) and
Visual Studio Installer for eXtensions (VSIX files); Visual Studio deployed as a VSIX file.
2012 introduced the light/dark themes; and Visual Studio 2015 The goals to be accomplished are the following:
removed add-ins (with the Add-In Manager); not to mention that •T o use a single Visual Studio project to create the package.
each Visual Studio version provides a new SDK, new extensibility • To use Visual Studio 2017 for development and debugging.
assemblies and new APIs. With Visual Studio 2017, this challenge is •T o generate a single package DLL as the result of the build.
even bigger, due to its new modular setup based on workloads and •T o put that single DLL inside a single VSIX file.
individual components, and to a new version of the manifest for • To be able to install that VSIX file on Visual Studio 2017 and
the VSIX deployment mechanism. While some developers (most on many past versions (2015, 2013 and so on).
notably from Microsoft) release a different new extension for each Because two artifacts are needed—a DLL file (which is the package)
Visual Studio version, most would prefer to release a single updated and a VSIX file (which is the deployment vehicle for the package)—I’ll
extension that can target the widest range of Visual Studio versions. explain each of these separately: First, how they work at installation
or run time; second, how to develop them.
This article discusses:
• How Visual Studio extensions are created, deployed and installed The VSIX File
• How to create a single package for multiple Visual Studio versions As mentioned earlier, Visual Studio 2010 introduced the VSIX
• How to deploy a package with a single VSIX file
deployment mechanism to install Visual Studio extensions, and it’s
been the preferred way ever since. A VSIX file has the extension .vsix
Technologies discussed: and can be installed in different ways. If the VSIX file is published
Visual Studio 2012, 2013, 2015 and 2017, on the Visual Studio Marketplace (formerly Visual Studio Gallery)
Microsoft .NET Framework, VSIX files and it’s compatible with the Visual Studio version and edition you’re
Code download available at: using, you can install it using the Extensions and Updates dialog.
msdn.com/magazine/0817magcode
Under the Tools menu, click on Extensions and Updates and then
go to Online | Visual Studio Marketplace (see Figure 1).
8 msdn magazine
magazine
Instantly Search
Terabytes of Text
Executive Summary
• The dtSearch enterprise and developer product line
instantly searches terabytes of text, with no limit on the
number of concurrent search threads.
• dtSearch’s own document filters support a wide variety of
data formats, including “Office” files, PDFs, emails and
attachments, online data and other databases.
• The products offer over 25 hit-highlighted search options,
with special forensics search options and extensive
international language support.
• Developer products include faceted searching and multiple
other advanced data classification options.
• SDKs span a wide range of platforms, with APIs for .NET,
C++ and Java.
Key Benefits
Terabyte Indexer. dtSearch enterprise and developer products
can index over a terabyte of text in a single index, spanning
multiple directories, emails and attachments, online data and and negative variable term weighting and metadata ranking. For
other databases. dtSearch products can create and search any federated searching, products have integrated relevancy ranking
number of indexes, and can search indexes during updates. with multicolor hit-highlighting search options across both online
and offline data.
Concurrent, Multithreaded Searching. dtSearch developer
products support efficient multithreaded searching, with no limit Faceted Search and Other Search Results Filtering. The
on the number of concurrent search threads. dtSearch Engine supports user-interface-driven faceted or “drill
Document Filters and Supported Data Types. dtSearch’s own down” category searching, as well as numerous other full-text
document filters support “Office” documents, PDFs, compression and metadata classification options.
formats, emails and multilevel nested attachments, online data
SDKs. The dtSearch Engine offers .NET, Java and C++ APIs.
and other databases. Document filters are built into the product
dtSearch.com has extensive code samples covering topics such
line and also available for separate licensing.
as faceted searching and indexing databases, including
Over 25 Search Options. dtSearch products have more than SharePoint, NoSQL and SQL, along with BLOB data. Platforms
25 search features, including special forensics search options and include Windows and Linux (with separate native 64-bit builds
extensive international language support. The dtSearch Engine of both) as well as UWP, Mac and Android. The dtSearch
also has a range of relevancy-ranking options, including positive Engine also works on cloud platforms like Azure and AWS.
For hundreds of developer case studies and press review, and fully-functional
evaluations (including the search engine and the document filters), visit g dtSearch.com
FREE TRIAL
MODIFY COMBINE
Manipulate Word, Excel, PDF, PowerPoint, Outlook and more than 100 other CONTACT US
file formats in your applications without installing Microsoft Office.
US: +1 903 306 1676
DOC, XLS, PDF, PPT, MSG, BMP, PNG, XML and many more! EU: +44 141 628 8900
AU: +61 2 8006 6987
Platforms supported: .NET, Java, Cloud, Android, SharePoint, Reporting
Services, and JasperReports [email protected]
How Xamarin.Forms
Customization Took an
FAA Drone App Higher
Dan Hermes
More than 1 million drones are in the hands of recre- The beauty of this Xamarin.Forms implementation is just how
ational flyers. People are taking unprecedented video footage of much of it is truly cross-platform. Of the 25 screens in the app,
events, geography and nature with drone cameras. Commercial only one requires platform-specific customization. Many, if not
drone flyers are conducting inspections of structures and surveying most, mobile app requirements today include a cross-platform
land in a way that’s changing their industries. All these drones in mandate. If such an app plan is mostly data entry and display,
the air have become the concern of the Federal Aviation Adminis- standard navigation and UI, and minimal graphics and animation,
tration (FAA), which has responded with a strategy and a series of then it should be considered a strong candidate for development
new regulations aimed at helping flyers operate safely and legally. using Xamarin.Forms.
Of course, there’s an app for that. It’s called B4UFLY, and it’s
written in Xamarin.Forms (note: B4UFLY is used with permission What Is Xamarin.Forms?
from Network Designs and the FAA). Drawing upon FAA airport Xamarin.Forms is a library of cross-platform UI classes built
and special location data, the app provides flyers with an interac- atop Xamarin.Android and Xamarin.iOS that also binds directly
tive map and real-time status updates depending on their position to the native Universal Windows Platform (UWP), as shown in
or their planned flight. The status reflects the level of flight safety Figure 2. This provides a cross-platform set of UI components
and legality and helps the flyer find areas away from airports and that render in each of the three native OSes.
restricted airspace. The app, as shown in Figure 1, has been down- Xamarin.Forms provides a cross-platform library of pages,
loaded more than 300,000 times and is in its second year of updates. layouts, and controls and is a great place to begin building an
app quickly. There are two ways to create UIs in Xamarin.Forms:
either in C# using the rich Xamarin.Forms API or using Exten-
This article discusses:
sible Markup Language (XAML), a declarative markup language
• Xamarin.Forms customization
created by Microsoft.
• Cross-platform mobile development
• Dynamic layouts What Does the Xamarin.Forms Solution Look Like?
Technologies discussed: The B4UFLY solution contains four projects. The B4UFly project
Xamarin.Forms, Custom Renderer, Effects, Native View Declaration
contains the Xamarin.Forms markup and code. The b4ufly.Droid
project contains the Android-specific code and the b4ufly.iOS
18 msdn magazine
inherits from Xamarin.Forms.Platform.iOS.FormsApplicationDelegate. Showing and hiding elements begins with a XAML layout, the
Once a Xamarin.Forms project is created, development of the “DO NOT FLY” status in this case:
UI can follow. <StackLayout x:Name="stackForbiddenToFly" Orientation="Vertical" IsVisible="false"
Padding="10, 20, 10, 5" VerticalOptions="Start">
<Label x:Name="forbiddenDoNotFlyText" Text="DO NOT FLY YOUR AIRCRAFT"
Dynamic Layouts TextColor="#DA4E5B"
FontSize="22" FontAttributes="Bold" HorizontalOptions="Center"
B4UFLY makes use of all of the standard Xamarin layouts, including HorizontalTextAlignment="Center" />
StackLayout, AbsoluteLayout and Grid. Xamarin.Forms Layouts </StackLayout>
can also be employed to create dynamic layouts with content that When the status is determined to be no-fly because a location
changes in real time. This isn’t about data binding, although that’s has been chosen where drone flight is prohibited, the StackLayout
possible, as well. This is about modifying the structure and appear- stackForbiddenToFly is made visible (as shown in Figure 3):
if (safeToFlyResult.isInForbiddenZone == true)
ance of the screens themselves. {
The two most important screens in the app are the map and the stackForbiddenToFly.IsVisible = true;
...
status page. The map is where the flyer’s GPS position is determined,
and where surrounding locations and flight restrictions and air- The final dynamic UI approach is the physical removal of ele-
ports are displayed. The map is also where a pin can be dropped, ments from a layout using C# code. Here’s an example of a layout and
in something called Planning Mode, so the flyer can determine if button being removed from a layout’s collection of child elements:
stackCurrentLocationTop.Children.Remove (refreshComboStack);
it’s safe to fly there. stackCurrentLocationTop.Children.Remove (dismissImgBtn);
The status page (Figure 3) tells the user if it’s Add a layout to a layout’s children:
safe to fly. There are three main statuses: yellow, stackCurrentLocationTop.Children.Add
orange and red. (There’s no green because of (refreshComboStack, 3, 4, 0, 1);
lawyers.) Each of these statuses is reflected on Those are the three main approaches to
the status page by a different status icon, by the dynamic UI: modify existing layouts and
text in the header and the color of the header’s their elements, showing and hiding ele-
background, as well as the text that’s displayed ments, and adding and removing elements
on the page to explain the status. Even the ad- and layouts from layout collections using C#.
ditional info buttons at the bottom of the page Xamarin.Forms has become an increas-
can change. The entire status page is dynamic. ingly easier choice with the outstanding
Xamarin.Forms provides several ways support for Xamarin.Forms customization,
to change content in midstream, providing providing access to native UI features. A
dynamic content modifiable in real time. good rule of thumb is that you don’t want to
The first way is to modify existing layouts have to customize (by platform) more than
and their elements. The second is to show 20 percent to 30 percent of your app. More
and hide elements. The third way is to add than that and you should use a platform-
and remove elements from the page using specific option, such as Xamarin.Android or
C#. B4UFLY employs all three of these Xamarin.iOS. So what does it mean to
approaches in the status screen. customize a Xamarin.Forms app?
Modifying layouts begins with a layout
to modify, created using XAML in this case, Customizing Your App
though it could just as easily be created using Using Xamarin.Forms
C#. This example is a StackLayout containing Before Xamarin.Forms was released, I
a status bar at the top of the map containing Figure 1 B4UFLY Planning Mode Helps would code my mobile app’s cross-platform
a status icon called topStatusIcon: People Find Places to Fly Their Drones business logic and data layer in C#. I
msdnmagazine.com August 2017 19
Figure 3 B4UFLY Status Page in a Figure 4 Map Page at Lexicon Systems Figure 5 B4UFLY Planning Mode Page
No-Fly Area Office in Beverly, Mass. in San Francisco, Calif.
20 msdn magazine Xamarin.Forms
JetBrains Rider:
New Cross-Platform .NET IDE
A Q&A with Kirill Skrygan,
Rider Team Lead at JetBrains
Melissa provides the full spectrum of data Our data quality solutions are available
quality to ensure you have data you can trust. on-premises and in the Cloud – fast,
easy to use, and powerful developer
We profile, standardize, verify, match and
tools and plugins for the Microsoft®
enrich global People Data – name, address,
Product Ecosystem.
email, phone, and more.
Instantly Search
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:ios="clr-namespace:UIKit;assembly=Xamarin.iOS;targetPlatform=iOS"
xmlns:androidWidget="clr-namespace:Android.Widget;assembly=
Mono.Android;targetPlatform=Android"
Terabytes of Data
xmlns:formsandroid="clr-namespace:Xamarin.Forms;assembly=
Xamarin.Forms.Platform.Android;targetPlatform=Android"
xmlns:win="clr-namespace:Windows.UI.Xaml.Controls;assembly=Windows,
Version=255.255.255.255, Culture=neutral, PublicKeyToken=null,
ContentType=WindowsRuntime;targetPlatform=Windows"
x:Class="b4ufly.NativeView" > across a desktop, network, Internet or
<ContentPage.Content>
</ContentPage.Content> Intranet site with dtSearch enterprise
</ContentPage>
and developer products
Those are the three approaches to Xamarin.Forms custom-
ization: custom renderers, effects and native view declaration.
Custom renderer is a heavyweight option offering a lot of flexi-
bility, while effects provides a surgical approach to customization.
Native view declaration is the nuclear option, circumventing Over 25 search features, with easy
Xamarin.Forms entirely.
multicolor hit-highlighting options
Wrapping Up
You’ll eventually need more from Xamarin.Forms than it gives you
out-of-the-box, just like I did with B4UFLY. When complex tasks
or designs are required by Xamarin.Forms, virtually anything is dtSearch’s document filters support
possible using Xamarin.Forms customization. Customization pro- popular file types, emails with multilevel
vides access to the lower-level, platform-specific, screen-rendering attachments, databases, web data
classes called “renderers,” which use platform-specific controls
to create all Xamarin.Forms screens. Any Xamarin.Forms screen
can be broken into platform-specific screens, classes, controls and
properties using this approach.
A lighter-weight approach is to use effects to access platform-
Developers:
specific properties and events. You can also use entire native controls • APIs for .NET, Java and C++
on your Xamarin.Forms pages using native view declaration.
This means that you can write a Xamarin.Forms page or app • SDKs for Windows, UWP, Linux,
and customize it by platform. Use customization sparingly, or Mac and Android
risk a fragmented UI code base that probably should have been
written entirely as a platform-specific UI. Used judiciously, cus-
• See dtSearch.com for articles on
tomization can turn your basic, lackluster product into a versatile, faceted search, advanced data
unique, popular app. classification, working with SQL,
In B4UFLY, the FAA’s investment in Xamarin.Forms continues NoSQL & other DBs, MS Azure, etc.
to pay off because of the many ongoing enhancements that are
generic to the many cross-platform text-based pages. The platform-
specific map page contains some cross-platform elements, but
much of that page requires platform-specific customization. This
Xamarin.Forms architecture is extensible and development times
and costs are lower because of it; the significant code reuse is Visit dtSearch.com for
practical and elegant. n
• hundreds of reviews and case studies
Dan Hermes is a Xamarin MVP, a Microsoft MVP, and author of “Xamarin • fully-functional evaluations
Mobile Application Development.” He is principal of Lexicon Systems, a Boston-
based consultancy building award-winning mobile apps and helping companies
build their own successful apps. Follow his blog at mobilecsharpcafe.com, on Twitter: The Smart Choice for Text Retrieval®
@danhermes or contact him at [email protected].
since 1991
Thanks to the following technical expert for reviewing this article:
Jesse Liberty dtSearch.com 1-800-IT-FINDS
msdnmagazine.com
In my last article (msdn.com/magazine/mt809117), I showed how IDE can sometimes lead to confusion. For example, ponder the
Git uses a directed acyclic graph (DAG) to organize a repo’s com basic workflow of adding a project to Git source control, modify
mit objects. I also explored the blob, tree and tag objects to which ing project files, staging them and then committing the staged files.
commit objects can refer. I concluded the article with an intro To do that, you open the Team Explorer Changes pane to view the
duction to branching, including the distinction between HEAD list of changed files and then you select the ones you want to stage.
and head. That article is a prerequisite to this one, in which I’ll dis Consider the leftmost image in Figure 1, which shows that I changed
cuss the Git “three-tree” architecture and the importance of its two files in the working directory (Marker 1).
index file. Understanding these additional Git internals will build on In the next image to the right, I staged one of those changed files:
the foundational knowledge that will make you a more effective Git Program.cs (Marker 2). When I did that, Program.cs appears to
user and will provide new insights as you explore various Git oper have “moved” from the Changes list to the Staged Changes list. If
ations fronted by the graphical Git tooling in the Visual Studio IDE. I further modify and then save the working directory’s copy of
Recall from the last article that Visual Studio communicates with Git Program.cs, it continues to appear in the Staged Changes section
using a Git API, and that the Visual Studio IDE Git tooling abstracts (Marker 3)—but it also appears in the Changes section (Marker
away the complexity and capabilities of the underlying Git engine. 4)! Without understanding what Git is doing behind the scenes,
That’s a boon for developers who want to implement a version-con you might be flummoxed until you figured out that two “copies”
trol workflow without needing to rely on the Git command-line of Program.cs exist: one in the working folder and one in the Git
interface (CLI). Alas, the otherwise helpful Git abstractions of the internal database of objects. Even if you realize that, you might not
have any insight as to what would happen when you unstage the
staged copy, try to stage the second changed copy of Program.cs,
This article discusses:
undo changes to the working copy or switch branches.
• Git’s three-tree architecture
To truly grasp what Git is doing as you stage, unstage, undo, commit
• How the Git index works and check out files, you first must understand how Git is architected.
• Index extensions
Technologies discussed: The Git Three-Tree Architecture
Visual Studio 2017, Git for Windows 2.10
Git implements a three-tree architecture (a “tree” in this context
refers to a directory structure and files). Working from left to right
26 msdn magazine
what’s going on. Create a new console application called MSDNCon You can issue this command at any time to generate a complete
soleApp and check the Create directory for solution and the Create list of files currently in the index. On my system, this produces
new Git repository checkboxes. Click OK to create the solution. the following output:
I’ll issue some Git commands in a moment, so if you want to run 100644 1ff0c423042b46cb1d617b81efb715defbe8054d 0 .gitattributes
100644 3c4efe206bd0e7230ad0ae8396a3c883c8207906 0 .gitignore
them on your system, open a command prompt window in the 100644 f18cc2fac0bc0e4aa9c5e8655ed63fa33563ab1d 0 MSDNConsoleApp.sln
working directory and keep that window within reach as you fol 100644 88fa4027bda397de6bf19f0940e5dd6026c877f9 0 MSDNConsoleApp/App.config
100644 d837dc8996b727d6f6d2c4e788dc9857b840148a 0 MSDNConsoleApp/
low along. One way to quickly open a Git command window for a MSDNConsoleApp.csproj
particular Git repo is to access the Visual Studio Team menu and 100644 27e0d58c613432852eab6b9e693d67e5c6d7aba7 0 MSDNConsoleApp/Program.cs
100644 785cfad3244d5e16842f4cf8313c8a75e64adc38 0 MSDNConsoleApp/Properties/
select Manage Connections. You’ll see a list of local Git repositories, AssemblyInfo.cs
along with the path to that repo’s working directory. Right-click the The first column of output is a Unix OS file mode, in octal. Git
repo name and select Open Command Prompt to launch a window doesn’t support the full range of file-mode values, however. You’re
into which you can enter Git CLI commands. likely to only ever see 100644 (for non-EXE files) and 100755 (for
Once you create the solution, open the Team Explorer Branches Unix-based EXE files—Git for Windows also uses 100644 for
pane (Figure 4, Marker 1) to see that Git created a default branch executable file types). The second column is the SHA-1 value for
called master (Marker 2). Right-click the master branch (Marker the file. The third column represents the merge stage value for
2) and select View History (Marker 3) to view the two commits the file—0 for no conflict or 1, 2 or 3 when a merge conflict exists.
Visual Studio created on your behalf (Marker 4). The first has the Finally, notice that the path and file name for each of the seven blob
commit message “Add .gitignore and .gitattributes”; the second has objects are stored in the index. Git uses the path value when it builds
the commit message “Add project files.” tree objects ahead of the next commit (more on that in a moment).
Open the Team Explorer Changes pane. Visual Studio relies on Now, let’s examine the index file itself. Because it’s a binary file,
the Git API to populate items in this window—it’s the Visual Studio I’m going to use HexEdit 4 (a freeware hex editor available at
hexedit.com) to view its contents (Figure 5 shows an excerpt).
Figure 6 The Git Index Header Data Format
The first 12 bytes of the index contain the header (see Figure 6).
Index File - Header Entry The first 4 bytes will always contain the characters DIRC (short for
00 - 03 DIRC Fixed header for a directory cache entry. directory cache)—this is one reason the Git index is often referred
(4 bytes) All index files begin with this entry. to as the cache. The next 4 bytes contain the index version num
04 - 07 Version Index version number (Git for Windows ber, which defaults to 2 unless you’re using certain features of Git
(4 bytes) currently uses version 2). (such as sparse checkout), in which case it might be set to version 3
08 - 11 Number of entries As a 4-byte value, the index supports up or 4. The final 4 bytes contain the number of file entries contained
(4 bytes) to 4,294,967,296 entries! further down in the index.
30 msdn magazine DevOps
The format for each index entry is presented in Figure 7. Git sorts Remember, this SHA-1 points to the blob object that contains
index entries in ascending order based on the path/file name field. the file contents for the file in question: .gitattributes.
The first 8 bytes represent the time the file was created as an off At 048H is a 2-byte value containing two 1-bit flags, a 2-bit merge-
set from midnight of Jan. 1, 1970. The second 8 bytes represent the stage value, and a 12-bit length of the path/file name for the current
time the file was modified as an offset from midnight of Jan. 1, 1970. index entry. Of the two 1-bit flags, the high-order bit designates
Next are five 4-byte values (device, inode, mode, user id and group whether the index entry has its assume-unchanged flag set (typi
id) of file-attribute metadata related to the host OS. The only value cally done using the Git update-index plumbing command); the
used under Windows is the mode, which most often will be the low-order bit indicates whether another two bytes of data precede
octal 100644 I mentioned earlier when showing output from the the path\file name entry—this bit can be 1 only for index versions
ls-files command (this converts to the 4-byte 814AH value, which 3 and higher). The next 2 bits hold a merge-stage value from 0 to
you can see at position 26H in Figure 5). 3, as described earlier. The 12-bit value contains the length of the
Following the metadata is the 4-byte length of the file contents. path\file name string.
In Figure 5, this value starts at 030, which shows 00 00 0A 15 If the extended flag was set, a 2-byte value holds the skip-work
(2,581 decimal)—the length of the .gitattributes file on my system: tree and intent-to-add bit flags, along with filler placeholders.
05/08/2017 09:24 PM <DIR> . Finally, a variable length sequence of bytes contains the path\file
05/08/2017 09:24 PM <DIR> ..
05/08/2017 09:24 PM 2,581 .gitattributes
name. This value is terminated with one or more NUL characters.
05/08/2017 09:24 PM 4,565 .gitignore Following that termination is the next blob object in the index or
05/08/2017 09:24 PM <DIR> MSDNConsoleApp
05/08/2017 09:24 PM 1,009 MSDNConsoleApp.sln
one or more index extension entries (as you’ll see shortly).
3 File(s) 8,155 bytes Earlier, I mentioned that Git doesn’t build tree objects until you
3 Dir(s) 92,069,982,208 bytes free commit what’s been staged. What that means is the index starts
out with only path/file names and references to blob
Figure 7 The Git Index File-Index Entry Data Format objects. As soon as you issue a commit, however, Git
Index File - Index Entry updates the index so it contains references to the tree
4 bytes 32-bit created time in Number of seconds since Jan. 1, 1970, objects it created during the last commit. If those
seconds 00:00:00. directory references still exist in your working direc
4 bytes 32-bit created time - Nanosecond component of the created tory during the next commit, the cached tree object
nanosecond component time in seconds value. references can be used to reduce the work Git needs to
4 bytes 32-bit modified time in Number of seconds since Jan. 1, 1970, do during the next commit. As you can see, the role of
seconds 00:00:00. the index is multifaceted, and that’s why it’s described
4 bytes 32-bit modified time - Nanosecond component of the created as an index, staging area and cache.
nanosecond component time in seconds value. The index entry shown in Figure 7 supports only
4 bytes device Metadata associated with the file—these blob object references. To store tree objects, Git uses
4 bytes inode originate from file attributes used on the an extension.
Unix OS.
4 bytes mode
4 bytes user id Index Extensions
4 bytes group id
The index can include extension entries that store
specialized data streams to provide additional infor
4 bytes file content length Number of bytes of content in the file.
mation for the Git engine to consider as it monitors
20 bytes SHA-1 Corresponding blob object’s SHA-1 value.
files in the working directory and when it prepares the
2 bytes Flags (High to low bits) next commit. To cache tree objects created during the
1 bit: assume-valid/assume-unchanged
flag
last commit, Git adds a tree extension object to the
1-bit: extended flag (must be 0 for index for the working directory’s root as well as for
versions less than 3; if 1 then an each sub-directory.
additional 2 bytes follow before the path\ Figure 5, Marker 2, shows the final bytes of the
file name) index and captures the tree objects that are stored
2-bit: merge stage
12-bit: path\file name length (if less than
in the index. Figure 8 shows the format for the tree-
0xFFF) extension data.
2 bytes Flags (High to low bits) The tree-extension data header, which appears at off
(version 3 1-bit: future use set 284H, is composed of the string “TREE” (marking
or higher) 1-bit: skip-worktree flag (sparse checkout) the start of the cached tree extension data) followed by
1-bit: intent-to-add flag (git add -N) a 32-bit value that indicates the length of the extension
13-bit: unused, must be zero
data that follows. Next are entries for each tree entry:
Variable Length Path/file name NUL terminated The first entry is a variable-length null-terminated
Add project files. and .git\info\exclude files and by the file pointed to by core.
commit dc0d3343fa24e912f08bc18aaa6f664a4a020079
excludesfile). It has the signature “UNTR.”
Author: Jonathan Waldman <[email protected]> • One to support a split-index mode in order to speed index
Date: Mon May 8 21:24:07 2017 -0500
updates for very large index files. It has the signature “link.”
Add .gitignore and .gitattributes. The index’s extension feature makes it possible to continue
The most recent commit is the one with the timestamp 21:24:15, adding to its capabilities.
so that’s the one that last updated the index. I can use that commit’s
SHA-1 to find the root-tree SHA-1 value: Wrapping Up
git cat-file -p 51923 In this article, I reviewed the Git three-tree architecture and delved into
This generates the following output: details behind its index file. I showed you that Git updates the index
tree 0d21e2f7f760f77ead2cb85cc128efb13f56401d in response to certain operations and that it also relies on infor
parent dc0d3343fa24e912f08bc18aaa6f664a4a020079
author Jonathan Waldman <[email protected]> 1494296655 -0500 mation the index contains in order to carry out other operations.
committer Jonathan Waldman <[email protected]> 1494296655 -0500 It’s possible to use Git without thinking much about the index.
The preceding tree entry is the root tree object. It confirms that Yet having knowledge about the index provides invaluable insight
the 0d21e2 value at offset 291H in the index dump is, in fact, the into Git’s core functionality while shedding light on how Git detects
SHA-1 for the root tree object. changes to files in the working directory, what the staging area is
The other tree entries appear immediately after the SHA-1 value, and why it’s useful, how Git manages merges, and why Git performs
starting at offset 2A5H. To confirm the SHA-1 values for cached some operations so quickly. It also makes it easy to understand com
tree objects under the root tree, run this command: mand-line variants of the check out and rebase commands—and
git ls-tree -r -d master
the difference between soft, mixed and hard resets. Such features
This displays only the tree objects, recursively on the current branch: let you specify whether the index, working directory, or both the
040000 tree c7c367f2d5688dddc25e59525cc6b8efd0df914d MSDNConsoleApp
040000 tree 2723ceb04eda3051abf913782fadeebc97e0123c MSDNConsoleApp/Properties
index and working directories should be updated when issuing
The mode value of 040000 in the first column indicates that this certain commands. You’ll see such options when reading about
object is a directory rather than a file. Git workflows, strategies and advanced operations. The purpose
Finally, the last 20 bytes of the index contain an SHA-1 hash rep of this article is to orient you to the important role the index plays
resenting the index itself: As expected, Git uses this SHA-1 value so you can better digest the ways in which it can be leveraged. n
to validate the data integrity of the index.
While I’ve covered all of the entries in this article’s example index Jonathan Waldman is a Microsoft Certified Professional who has worked with
Microsoft technologies since their inception and who specializes in software ergo-
file, larger and more complex index files are the norm. The index
nomics. Waldman is a member of the Pluralsight technical team and he currently
file format supports additional extension data streams, such as: leads institutional and private-sector software-development projects. He can be
• One that supports merging operations and merge-conflict res reached at [email protected].
olution. It has the signature “REUC” (for resolve undo conflict).
• One for maintaining a cache of untracked files (these are Thanks to the following Microsoft technical experts for reviewing this article:
files to be excluded from tracking, specified in the .gitignore Kraig Brockschmidt, Saeed Noursalehi, Ralph Squillace and Edward Thomson
Actionable Messages
for Outlook
Woon Kiat Wong
I love e-mail. At work, it’s where I go to stay on top of what’s submits an expense report, an e-mail message is sent to the
going on and what I need to do. It’s where I receive notifications manager for approval. I’ll walk through the steps on how to use
of new expense reports submitted by my team, new replies to my Actionable Messages in Outlook that lets the manager approve the
tweets, new comments to my pull requests and so on. But e-mail request within the e-mail message itself.
could be so much better. Why do I need to click a link in e-mail
and wait for the finance system Web site to load in a browser My First Actionable Message
before I can approve an expense report? Why do I have to men- In Figure 1, you see the HTML of an Actionable Message. It might
tally change my context? I should be able to approve the expense look complicated, but believe me, it’s not. I’ll explain the markup in
report directly in the context of my e-mail client. detail in the following sections. The first step is to send an e-mail
Sound familiar? Outlook is about to make your life much better, with the markup from Figure 1 to your Office 365 e-mail account.
save you time and make you more productive. As shown in Figure 2, in the message itself, there’s a message
card with two buttons with which you can interact. If you click
Introducing Actionable Messages on the Approve button, it’ll result in an error for now because you
Actionable Messages let users complete tasks within the e-mail itself. haven’t yet specified the URL for the action. You’ll add the URL
It offers a native experience in both the Outlook desktop client later. If you click on the View Expense button, a browser will open
and Outlook Web Access (OWA). In this article, I’ll use the word and navigate to the Expense Approval Web site.
Outlook to mean either Outlook desktop client or OWA.
In the example I’ll be using, the fictional company Contoso MessageCard Markup
has an internal expense approval system. Every time an employee The e-mail message itself is typical HTML markup. To make it an
Actionable Message in Outlook, you insert MessageCard markup
This article discusses: in the <script> element. One main advantage of this approach is
• Create and send Actionable Messages that e-mail messages will continue to render as usual on clients
that don’t recognize the MessageCard markup. The format of this
• Validating a JSON Web token
markup is called JSON-LD, which is a standard format to create
• Designing Web services for Actionable Messages
machine-readable data across the Internet. Now, let’s go through
Technologies discussed: the markup in detail. These two lines of code are mandatory in
Actionable Message Markup, Actionable Message JSON Web every markup:
Token, Actionable Message Security "@context": "http://schema.org/extensions",
"@type": "MessageCard",
34 msdn magazine
Q Who is Melissa, and what solutions do you provide? require complex parsing rules and multisourced reference data
for verification. For instance, the telephone number 949-555-
A Melissa Global Intelligence was founded in 1985 as Melissa
5659 might look valid from a rules-based perspective, but is it
Data. For over three decades, we have been a leading provider of
actually callable, and associated with the right customer?
data quality, ID verification, and data management solutions. Our
software, cloud services, and data integration components Active data quality relies on deep domain knowledge of contact
leverage comprehensive and authoritative reference data to and location data to parse, format, cleanse, enrich, and match
profile, verify, standardize, consolidate, match/dedupe, enrich, customer records to provide the organization with accurate,
and update U.S. and global contact data, including names, timely, and actionable information.
addresses, phone numbers and email addresses for improved
analytics, efficient operations, and strong customer relationships.
Q Should companies build out a DQ solution or purchase an
off-the-shelf one from a trusted vendor?
Q What are the most common causes of poor data quality?
A We recommend a Hybrid approach. Companies should look
A The major cause of bad data is from typographical errors and
to Build their own data quality solutions to handle rules-based
non-conforming data entered during the data entry process—
data quality processes—those where they have the expertise
either by employees or customers filling out contact forms. The
and experience with their own internal data. Where active data
next biggest cause of bad data comes from migrating data due
quality is required, a Buy approach will usually be more efficient
to irregular, missing, or misplaced data values that cause
and cost-effective in the long run. Combining both Build and
surprises. Bad data costs businesses between 10-25% of revenue
Buy can result in the best-of-both world results. We urge organi-
each year, and in 2016 cost US businesses over $3.1 trillion. That’s
zations to strive for small wins first—solve one problem at a
why implementing real-time validation of contact information
time in discreet phases. This will help you show tangible results
like addresses, email, phone, and other important information is
quickly and get the buy-in you need for future projects. Now,
essential, as well as establishing a data governance team in
rinse and repeat.
charge of understanding the impact of data quality.
Q What is the difference between rules-based and active Q How are Melissa’s solutions employed?
data quality, and why is active data quality so important? A Melissa offers every kind of integration option you can
A Data that is mostly static, internally generated and controlled— imagine. We have on-prem APIs and Cloud services that allow
like KPIs—employee performance metrics, new product develop- you to build into existing or custom applications. We also offer
ment, supplier payment optimization, and inventory reduction plugins for data integration platforms like SQL Server®, Pentaho®
data, can usually be well managed by rules-based validation. and Talend®, and CRM software like Salesforce® and Dynamics®
CRM. Our smart, sharp tools approach means we can help you
Active data like customer names, addresses, emails, phone create the best solutions based on your budget and needs and
numbers, company names, and job titles, constantly change and achieve data quality without breaking the bank.
MessageCard
Playground App
It would be great if you could
visualize how the card looks when
you’re authoring the markup.
Microsoft has a Web app that lets
you do just that. It’s called the
MessageCard Playground App
Figure 2 Actionable Message in Outlook Web Access (bit.ly/2s274S9).
36 msdn magazine Microsoft Office
BEST SELLER LEADTOOLS Document Imaging SDKs V19 from $2,995.00 SRP
Add powerful document imaging functionality to desktop, tablet, mobile & web applications.
• Universal document viewer & conversion framework for PDF, Office, CAD, TIFF & more
• OCR, MICR, OMR, ICR and Forms Recognition supporting structured & unstructured forms
• PDF SDK with text edit, hyperlinks, bookmarks, digital signature, forms, metadata
• Barcode Detect, Read, Write for UPC, EAN, Code 128, Data Matrix, QR Code, PDF417
• Zero-footprint HTML5/JavaScript UI Controls & Web Services
US Headquarters
ComponentSource
European Headquarters
ComponentSource
Asia / Pacific Headquarters
ComponentSource Sales Hotline - US & Canada:
(888) 850-9911
650 Claremore Prof Way 2 New Century Place 7F Kojimachi Ichihara Bldg
Suite 100 East Street 1-1-8 Hirakawa-cho
Woodstock Reading, Berkshire Chiyoda-ku
GA 30188-5188 RG1 4ET Tokyo, 102-0093
USA United Kingdom Japan www.componentsource.com
{
"id": "98432019",
"token": "d8a0bf4f-ae70-4df6-b129-5999b41f4b7f"
Limited-Purpose Tokens }
What follows “Bearer” in the Authorization header is a long base-64
Because the expense ID usually follows a certain format, there’s a risk
encoded string that’s a JSON Web Token (JWT). You can decode the
that an attacker can perform an attack by posting a lot of requests with
JWT at jwt.calebb.net. Figure 7 shows a sample token after it’s decoded.
different expense IDs. If an attacker successfully guesses an expense
Every JWT has three segments, separated by a dot (.). The first
ID, the attacker might be able to approve or reject that expense report.
segment is the header, which describes the cryptographic oper-
Microsoft recommends developers use “limited-purpose tokens” as
ations applied to the JWT. In this case, the algorithm (alg) used
part of the action target URL or in the body of the request. The limited-
to sign the token is RS256, which means RSA using the SHA-256
purpose token should be hard for attackers to guess. For example, I
hash algorithm. The x5t value specifies the thumbprint of the key
use a GUID, a 128-bit number as the limited-purpose token. This
used to sign the token.
token can be used to correlate service URLs with specific requests and
The second segment is the payload itself. It has a list of claims
users. It can also be used to protect Web services from replay attacks
that the token is asserting. Web services should use these claims to
(bit.ly/2sBQmdn). You update the markup to include a GUID in the body:
verify a request. The table in Figure
8 describes these claims.
The third segment is the digital
signature of the token. By verify-
ing the signature, Web services can
be confident that the token is sent
by Microsoft and trust the claims
in the token.
Verifying a digital signature is a
complex task. Fortunately, there’s
a library on NuGet that makes the
verification task easy. The library
is available at bit.ly/2stq90c and it’s
authored by Microsoft. Microsoft
also published code samples for
other languages on how to verify
the token. Links for these code
samples are available at the end
Figure 6 Expense Report with Successful Approval Notification of this article.
msdnmagazine.com August 2017 39
if (!string.Equals(result.Sender, expectedSender,
First, the method verifies there’s a bearer token in the return HttpStatusCode.OK;
}
Authorization header. Then, it initializes a new instance of
ActionableMessageTokenValidator and calls the ValidateToken [HttpPost]
[Route("approve")]
Async method. The method takes two parameters. The first one public async Task<HttpResponseMessage> Approve([FromBody]JObject jBody)
is the bearer token itself. The second one is the Web service {
HttpRequestMessage request = this.ActionContext.Request;
base URL. If you look at the decoded JWT, this is the value HttpStatusCode result = await VerifyBearerToken(
request, "https://api.contoso.com",
Figure 8 Description of Claims in Payload "[email protected]");
Actionable Messages let users complete tasks within Outlook in case HttpStatusCode.Forbidden:
HttpResponseMessage errorResponse =
a secure way. It’s available in desktop Outlook and Outlook Web this.Request.CreateErrorResponse(
Access today and the feature is coming to Outlook for Mac and HttpStatusCode.Forbidden, new HttpError());
errorResponse.Headers.Add("CARD-ACTION-STATUS",
Outlook Mobile soon. It’s straightforward to implement Action- "Invalid sender or the action performer is not allowed.");
able Messages. First, you need to add the required markup to the return errorResponse;
e-mails you’re sending out. Second, you need to verify the bearer default:
token sent by Microsoft in your Web service. Actionable Messages break;
}
will make your users happier and more productive. There is
so much more about Actionable Messages than this article can string expenseId = jBody["id"].ToString();
cover. Visit bit.ly/2rAD6AZ for the complete references and links to // Process and approve the expense report.
the code samples.
return CreateRefreshCard(
Figure 10 Markup Returned to Expense Report with Refresh Card request,
"The expense was approved.",
{ "98432019",
"@context": "http://schema.org/extensions", "83.27 USD",
"@type": "MessageCard", "Jonathan Kiev",
"hideOriginalBody": "true", "Dinner with client");
"title": "Expense report #98432019 was approved", }
"sections": [{
"facts": [{
"name": "ID", I’d like to acknowledge Sohail Zafar, Edaena Salinas Jasso, Vas-
"value": "98432019"
}, { ant Kumar Tiwari, Mark Encarnacion and Miaosen Wang, who
"name": "Amount", helped review this article for grammar, spelling, and flow. n
"value": "83.27 USD"
}, {
"name": "Submitter",
"value": "Kathrine Joseph" Woon Kiat Wong is a software engineer from the Knowledge Technologies Group
}, { in Microsoft Research. He works closely with the Outlook team to deliver Action-
"name": "Description", able Messages. Contact him at [email protected].
"value": "Dinner with client"
}]
}]
}
Thanks to the following Microsoft technical experts for reviewing this article:
Pretish Abraham, David Claux, Mark Encarnacion and Patrick Pantel
msdnmagazine.com August 2017 43
For Azure enterprise customers, a key challenge in can be done. I’ll touch on the overall design, key decision points
managing their cloud footprint is the ability to control what they and important things to consider in taking a serverless approach.
spend and to charge those costs back to the consumers. Fortu-
nately, there are several vendors that provide tools, such as Cloud Determining Consumption
Cruiser, Cloudyn, and Cloudability, to help with collecting usage The first decision is choosing between the Enterprise Agreement
data and generating a rich set of reports. Additionally, you can (EA) Billing API and the Azure Billing API, which centers its
find many good examples of how to pull data programmatically, requests around specific subscriptions. My prototype is targeted at
such as the post from a former co-worker of mine, Ed Mondek, in enterprise customers with multiple enrollments in an EA. In the
which he shows how to pull data into Excel and view it (bit.ly/2rzDOPI). scenario with which I’m working, subscriptions are being used as
However, if you want to pull that data regularly and enable his- part of the management boundaries for both specific product groups
torical, present trend and predictive views, you need to store a lot and for separating production from non-production resources.
more data. For a large enterprise with thousands of resources per This could result in a fairly high number of subscriptions in flux
subscription, that amount of data can be daunting and is certainly due to the volatile proof-of-concept (PoC) type of work being cre-
not what you’d want to fetch and keep on a local machine. ated as new groups and new product lines start up in Azure. Thus,
Luckily, there’s another way. In this article I’m going to walk you I chose to work with the EA API because it reduced the scope
through the serverless Extract-Transform-Load (ETL) process I set of work in that I don’t have to create a discovery mechanism for
up to extract such data, provide a little enrichment and store the data subscriptions. This leaves me with the noted challenge of not having
to a place where further work (analytics, map-reduce and so forth) any data for subscriptions created outside of the enrollments for
the enterprise. While this is an important area to tackle, it comes
with a number of other process and management challenges that
This article discusses:
have to be solved organizationally and is outside the scope of the
• Design considerations in a serverless architecture
work I want to accomplish.
• Integrating multiple Azure Platform-as-a-Service capabilities
• Billing data retrieval Requirements and Logical Flow
Technologies discussed: In any architecture, it’s the intersections between systems that require
Azure CosmosDB, Azure Functions, Azure Blob Storage
the most scrutiny in design and testing. A serverless architecture
doesn’t change the need to consider the volume of data that moves
44 msdn magazine
all of the documents and call RetrieveUsage for each enrollment // Get list of enrollments for which there is no match
that has “detailedEnabled” set to true, separating the logic to start var jobList = enrollments.Where(x =>
!logs.Any (l => l.enrollmentNumber == x.enrollmentNumber));
a job from the logic to retrieve the source data. I use the JobLog
LightningChart®
The fastest and most advanced
charting components
• DirectX GPU-accelerated
• Optimized for real-time monitoring
• Supports gigantic datasets
• Full mouse-interaction
• Outstanding technical support
• Hundreds of code examples
NEW
• Now with Volume Rendering extension
• Flexible licensing options
We have been developing software components for reporting A Text Control Reporting is based on the powerful word
and document processing for more than 25 years. We are processing component TX Text Control. The MS Word compatible
continually looking for new and innovative ways to improve template can be merged with a data object (business object) or
document processing to make these processes easier for database content with one line of code. At the same time, Text
end-users and more efficient. Control provides a powerful API to customize this merge process
completely. The report generation can be fully integrated into
Q What is the Text Control Reporting Framework? .NET applications.
LAST CHANCE!
Redmond
August 14-18
Chicago
September 18-21
Anaheim
October 16-19
Orlando
November 12-17
12-17
See pages 76-79
CONNECT WITH US
vslive.com
twitter.com/vslive – facebook.com – linkedin.com – Join the
@VSLive Search “VSLive” “Visual Studio Live” group!
TURN THE PAGE FOR MORE EVENT DETAILS £
Untitled-5 1 7/12/17 6:34 PM
INTENSE TRAINING FOR DEVELOPERS, ENGINEERS,
PROGRAMMERS, ARCHITECTS AND MORE!
Development Topics Include:
³VisualStudio / .NET Framework ³ASP.NET / Web Server
³JavaScript / HTML5 Client ³Agile
³Angular JS ³Xamarin
REGISTER
Register By August 18 and Save $200!
Use promo code VSLCH5
NOW
magazine
START TIME END TIME Visual Studio Live! Pre-Conference Workshops: Monday, September 18, 2017 (Separate entry fee required)
7:30 AM 9:00 AM Pre-Conference Workshop Registration - Coffee and Morning Pastries
START TIME END TIME Visual Studio Live! Day 1: Tuesday, September 19, 2017
7:00 AM 8:00 AM Registration - Coffee and Morning Pastries
START TIME END TIME Visual Studio Live! Day 2: Wednesday, September 20, 2017
7:30 AM 8:00 AM Registration - Coffee and Morning Pastries
W05 Assembling the Web - A Tour W06 Get Started with Git and W07 Building Modern Web Apps W08 Tactical DevOps for SQL Server
9:30 AM 10:45 AM
of WebAssembly - Jason Bock GitHub - Robert Green with Azure - Eric D. Boyd - Brian Randell
W09 Tools for Modern W10 Go Mobile with C#, W12 Power BI: Analytics for
W11 Build Awesome AF Apps!
1:30 PM 2:45 PM Web Development Dev Ops Visual Studio, and Xamarin Desktop, Mobile and Cloud
- Rachel Appel
- Ben Hoelting - James Montemagno - Andrew Brust
W13 Get Rid of HTML Tables for W14 Continuous Integration & W15 Microservices with Azure
W16 Power BI: Beyond the Basics
3:00 PM 4:15 PM Better Mobile Web Applications Deployment for Mobile Apps Container Service & Service Fabric
- Andrew Brust
- Paul Sheriff - James Montemagno - Vishwas Lele
START TIME END TIME Visual Studio Live! Day 3: Thursday, September 21, 2017
7:30 AM 8:00 AM Web Client
TH09:KDW·V1HZLQ7\SH6FULSW" TH10 Getting Started with Entity TH11 Open Source for Microsoft TH12 Introduction to Machine
11:00 AM 12:15 PM
- Doris Chen Framework Core - Jim Wooley Developers - Rockford Lhotka Learning with R - Raj Krishnan
CONNECT WITH US
vslive.com/chicagomsdn
twitter.com/vslive – facebook.com – linkedin.com – Join the
@VSLive Search “VSLive” “Visual Studio Live” group!
REGISTER
Register by August 25 and Save $300!
Use promo code VSLAN5
NOW
magazine
START TIME END TIME Visual Studio Live! Pre-Conference Workshops: Monday, October 16, 2017 (Separate entry fee required)
7:30 AM 9:00 AM Pre-Conference Workshop Registration - Coffee and Morning Pastries
START TIME END TIME Visual Studio Live! Day 1: Tuesday, October 17, 2017
7:00 AM 8:00 AM Registration - Coffee and Morning Pastries
START TIME END TIME Visual Studio Live! Day 2: Wednesday, October 18, 2017
7:00 AM 8:00 AM Registration - Coffee and Morning Pastries
START TIME END TIME Visual Studio Live! Day 3: Thursday, October 19, 2017
7:30 AM 8:00 AM Registration - Coffee and Morning Pastries
is general and there are several specific .32 .34 .5823 .3333
variations, including recurrent neural
networks (RNNs) and convolutional 2.0 .4301 .4915 .20 .4801
neural networks (CNNs). The most
basic form of a DNN, which I explain in .08 .30
.16
.26 .37
© 2017 GrapeCity, Inc. All rights reserved. All other product and brand names are trademarks and/or registered trademarks of their respective holders.
Figure 2 Basic Deep Neural Network Demo Run The Input-Output Mechanism
The input-output mechanism for a DNN is best explained with a
DNN shown in Figure 1 and illustrates the input-output mechanism concrete example. The first step is to use the values in the input
by displaying the values of the 13 nodes in the network. The demo code nodes to calculate the values of the nodes in the first hidden layer.
that generated the output begins with the code shown in Figure 3. The value of the top-most hidden node in the first hidden layer is:
Notice that the demo program uses only plain C# with no tanh( (1.0)(0.01) + (2.0)(0.05) + 0.27 ) =
namespaces except for System. The DNN is created by passing the tanh(0.38) = 0.3627
number of nodes in each layer to a DeepNet program-defined class In words, “compute the sum of the products of each input node
constructor. The number of hidden layers, 3, is passed implicitly and its associated weight, add the bias value, then take the hyper-
as the number of items in the numHidden array. An alternative bolic tangent of the sum.” The hyperbolic tangent, abbreviated
design is to pass the number of hidden layers explicitly. tanh, is called the activation function. The tanh function accepts
The values of the 26 weights and the 11 biases are set like so: any value from negative infinity to positive infinity, and returns
int nw = DeepNet.NumWeights(numInput, numHidden, numOutput); a value between -1.0 and +1.0. Important alternative activation
Console.WriteLine("Setting weights and biases to 0.01 to " +
(nw/100.0).ToString("F2") ); functions include the logistic sigmoid and rectified linear (ReLU)
double[] wts = new double[nw]; functions, which are outside the scope of this article.
for (int i = 0; i < wts.Length; ++i)
wts[i] = (i + 1) * 0.01; The values of the nodes in the remaining hidden layers are cal-
dn.SetWeights(wts); culated in exactly the same way. For example, hidden[1][0] is:
The total number of weights and biases is calculated using a static tanh( (0.3627)(0.09) + (0.3969)(0.11) + (0.4301)(0.13) + (0.4621)
class method NumWeights. If you refer back to Figure 1, you can (0.15) + 0.31 ) =
see that because each node is connected to all nodes in the layer tanh(0.5115) = 0.4711
to the right, the number of weights is (2*4) + (4*2) + (2*2) + (2*3) And hidden[2][0] is:
= 8 + 8 + 4 + 6 = 26. Because there’s one bias for reach hidden and tanh( (0.4711)(0.17) + (0.4915)(0.19) + 0.33 ) =
output node, the total number of biases is 4 + 2 + 2 + 3 = 11. tanh(0.5035) = 0.4649
The values of the output nodes are calculated using a different
Figure 3 Beginning of Output-Generating Code activation function, called softmax. The preliminary, pre-activation
using System; sum-of-products plus bias step is the same:
namespace DeepNetInputOutput pre-activation output[0] =
{
class DeepInputOutputProgram (.4649)(0.21) + (0.4801)(0.24) + 0.35 =
{ 0.5628
static void Main(string[] args)
{ pre-activation output[1] =
Console.WriteLine("Begin deep net IO demo"); (.4649)(0.22) + (0.4801)(0.25) + 0.36 =
Console.WriteLine("Creating a 2-(4-2-2)-3 deep network");
int numInput = 2; 0.5823
int[] numHidden = new int[] { 4, 2, 2 };
int numOutput = 3; pre-activation output[2] =
DeepNet dn = new DeepNet(numInput, numHidden, numOutput); (.4649)(0.23) + (0.4801)(0.26) + 0.37 =
...
0.6017
60 msdn magazine Test Run
nnNodes[0] is an array of input node values and nnNodes[4] is hoWeights[][] [1] [1]
The node-to-node weights are stored using these data structures: [1] [3]
public double[][] ihWeights; [0] [1] [2] [0] [1]
public double[][][] hhWeights;
public double[][] hoWeights; Figure 4 Weights and Biases Data Structures
62 msdn magazine Test Run
GroupDocs.Total
Contact Us:
US: +1 903 306 1676 Visit us at www.groupdocs.com
EU: +44 141 628 8900
AU: +61 2 8006 6987
[email protected]
+++++++++++++++++++++++++++++++++++++++++
REGISTER NOW SAVE $300 THROUGH AUGUST 7
MUST USE DISCOUNT CODE TMEB01
TECHMENTOREVENTS.COM/REDMOND
EVENT SPONSOR: GOLD SPONSOR:
SUPPORTED BY: PRODUCED BY:
9:00 AM 6:00 PM
8:00 AM 12:00 PM
12:00 PM 2:00 PM
2:00 PM 5:30 PM
7:00 PM 9:00 PM
START TIME END TIME
T0
8:00 AM 9:15 AM Vis
T06
9:30 AM 10:45 AM Dis
10:45 AM 11:15 AM
11:15 AM 12:15 PM
12:15 PM 1:30 PM
1:30 PM 2:45 PM
T11 Tak
Good a
T16
3:00 PM 4:15 PM to Ho
4:15 PM 5:45 PM
8:00 AM 9:15 AM
W01
12:00 PM
12:00 PM
1:30 PM
HANDS-ON LABS ➤ Rub elbows with blue badges W11 B
1:30 PM 2:45 PM Dev.
Choose From:
➤ Angular NEW! ➤ Experience life on campus
2:45 PM 3:15 PM
Only
➤ Dev Ops with
$695!
➤ Enjoy lunch in the Commons W16
ASP.NET Core/EF Core 3:15 PM 4:30 PM Applicat
and visit the Company Store Scott Hanselman, and
➤ SQL Server 2016
➤ And More! Keynote Speaker 6:15 PM 8:30 PM
SPACE IS LIMITED START TIME END TIME
TH0
8:00 AM 9:15 AM Re
P
biggest is getting to hear from Microsoft Use promo code RDEB01 TH16
2:15 PM 3:30 PM Princi
insiders who are “in the trenches”, working Im
TH21
with developers just like you on a daily basis. *Only 3:45 PM 5:00 PM Inj
available
on 3- and START TIME END TIME
Microsoft Speakers are noted with a
5-day 8:00 AM 5:00 PM
packages.
magazine
ND TIME NEW Full Day Hands-On Labs: Sunday, August 13, 2017 (Separate entry fee required)
00 PM
HOL01 Full Day Hands-On Lab: Busy Developer’s HOL02 Full Day Hands-On Lab: DevOps with ASP.NET HOL03 Full Day Hands-On Lab: Developer Dive
HOL on Angular - Ted Neward Core and EF Core - Benjamin Day & Brian Randell into SQL Server 2016 - Leonard Lobel
ND TIME Visual Studio Live! Pre-Conference Workshops: Monday, August 14, 2017 (Separate entry fee required)
2:00 PM
M01 Workshop: Modern Security Architecture M02 Workshop: Distributed Cross-Platform Application M03 Workshop: Big Data, BI and Analytics
for ASP.NET Core - Brock Allen Architecture - Jason Bock & Rockford Lhotka on The Microsoft Stack - Andrew Brust
00 PM Lunch @ The Mixer - Visit the Microsoft Company Store & Visitor Center
M02 Workshop Continues
30 PM M01 Workshop Continues - Brock Allen M03 Workshop Continues - Andrew Brust
- Jason Bock & Rockford Lhotka
00 PM Dine-A-Round Dinner
ND TIME Visual Studio Live! Day 1: Tuesday, August 15, 2017
T01 Go Mobile With C#, T03 New SQL Server 2016 T05 The Future of C#
T02 Angular 101: Part 1 T04 Building an Agile Culture
15 AM Visual Studio, and Xamarin Security Features for - Dustin Campbell
- Deborah Kurata that Scales - Aaron Bjork
- James Montemagno Developers - Leonard Lobel & Mads Torgersen
T06 Building Connected and T08 No Schema, No Problem! T10 Building Apps with
T07 Angular 101: Part 2 T09 Getting to the Core of
:45 AM Disconnected Mobile Apps Introduction to Azure Microsoft Graph and Visual
- Deborah Kurata .NET Core - Adam Tuliper
- James Montemagno DocumentDB - Leonard Lobel Studio - Robert Green
:15 AM Sponsored Break - Visit Exhibitors
2:15 PM KEYNOTE: Microsoft’s Open Source Developer Journey - Scott Hanselman, Principal Community Architect for Web Platform and Tools, Microsoft
30 PM Lunch - Visit Exhibitors
T12 Assembling the Web— T13 Unit Testing & Test-Driven T14 Mobile DevOps with T15 Azure for .NET
T11 Take the Tests: Can You Evaluate
:45 PM A Tour of WebAssembly Development (TDD) for the Microsoft Stack Developers: In Plain English
Good and Bad Designs? - Billy Hollis
- Jason Bock Mere Mortals - Benjamin Day - Abel Wang - Michael Crump
T16 A Developers Introduction T17 Spans, Memory, T18 Developing for Windows T19 Entity Framework Core T20 Debugging Tips and
:15 PM to HoloLens - Billy Hollis & Brian and Channels—Making and Linux Side by Side for Enterprise Applications Tricks for Visual Studio
Randell .NET Code Fast - Jason Bock - Gilles Khouzam - Benjamin Day - Kaycee Anderson
45 PM Microsoft Ask the Experts & Exhibitor Reception Sponsored by
ND TIME Visual Studio Live! Day 2: Wednesday, August 16, 2017
W02 Migrating to W04 Distributed Architecture: W05 Architecting Big Data
W01 Roll Your Own Dashboard W03 Hacker Trix - Learning from
15 AM ASP.NET Core—A True Microservices and Messaging Solutions with Azure
in XAML - Billy Hollis OWASP Top 10 - Mike Benkovich
Story - Adam Tuliper - Rockford Lhotka - Michael Rys
W06 Customizing Your UI for
W07 User Authentication for W08 From Containers to Data in W10 Agile: You Keep
Mobile Devices: Techniques to Create W09 ASP.NET Core 2.0
:45 AM ASP.NET Core MVC Applications Motion, Tour d’Azure 2017 - Mike Using That Word...
a Great User Experience - Laurent - Jass Bagga
- Brock Allen Benkovich - Philip Japikse
Bugnion
2:00 PM GENERAL SESSION: Amplifying Human Ingenuity with Microsoft AI - Paul Stubbs, Director of Product Marketing for AI and Bots, Microsoft
30 PM Birds-of-a-Feather Lunch - Visit Exhibitors
W11 Building Cross-platform App. W14 TypeScript and the Future W15 Agile Failures:
W12 Securing Web APIs in W13 Tactical DevOps with VSTS
:45 PM Dev. with CLSA.NET - Rockford of JavaScript - Jordan Matthiesen Stories from The Trenches
ASP.NET Core - Brock Allen - Brian Randell
Lhotka & Bowden Kelly - Philip Japikse
:15 PM Sponsored Break - Exhibitor Raffle @ 2:55 pm (Must be present to win)
W20 Using Angular 2,
W16 Building Truly Universal W19 SOLID—The Five
W17 Integrating AngularJS & W18 Get Started with Git JavaScript, and TypeScript
30 PM Applications with Windows, Xamarin Commandments of Good
ASP.NET MVC - Miguel Castro and GitHub - Robert Green to Build Fast and Secure
and MVVM - Laurent Bugnion Software - Chris Klug
Mobile Apps - Jordan Matthiesen
30 PM Set Sail! VSLive!’s Seattle Sunset Cruise - Advanced Reservation & $10 Fee Required
ND TIME Visual Studio Live! Day 3: Thursday, August 17, 2017
TH03 “Aurelia vs “Just
TH01 Lessons Learned from TH02 Build Real-Time
Angular” a.k.a “The TH04 Go Serverless with Azure TH05 Git at Microsoft
15 AM Real World Xamarin.Forms Websites and Apps with
Framework Formerly Known Functions - Eric D. Boyd Scale - Edward Thomson
Projects - Nick Landry SignalR - Rachel Appel
as Angular 2” - Chris Klug
TH07 Database Lifecycle
TH06 Creating Great Looking TH08 Hard Core
Management and the TH09 Breaking Down Walls with TH10 Microsoft Set List:
:45 AM Android Applications Using ASP.NET Core
SQL Server Database Modern Identity - Eric D. Boyd Details Dropping Soon
Material Design - Kevin Ford - Rachel Appel
- Brian Randell
TH12 Bots are the New Apps: TH15 What’s New in
TH13 Power BI: Analytics for TH14 Enriching MVC Sites
TH11 Software Engineering in an Building Bots with ASP.NET Visual Studio 2017 for
2:15 PM Desktop, Mobile and Cloud with Knockout JS
Agile Environment - David Corbin WebAPI & Language C# Developers
- Andrew Brust - Miguel Castro
Understanding - Nick Landry - Kasey Uhlenhuth
:15 PM Lunch @ The Mixer - Visit the Microsoft Company Store & Visitor Center
TH20 Serverless with Azure
TH16 Classic Software Design TH18 Big Data with Hadoop, TH19 Extend and Customize
TH17 Getting Started with Functions—Scale Dynamically
30 PM Principles and Why They Are Still Spark and Azure HDInsight the Visual Studio Environment
Aurelia - Brian Noyes and Pay per Execution
Important- David Corbin - Andrew Brust - Walt Ritscher
- Donna Malayeri
TH21 End-to-End Dependency TH22 Everything You Need TH23 Continuous Integration and TH24 Windows Package TH25 Securing Client Apps
00 PM Injection & Testable Code to Know About Package Deployment for Mobile using Azure Management with NuGet and with IdentityServer
- Miguel Castro Management - Alex Mullans Services - Kevin Ford Chocolatey - Walt Ritscher - Brian Noyes
ND TIME Visual Studio Live! Post-Conference Workshops: Friday, August 18, 2017 (Separate entry fee required)
00 PM F01 Workshop: Building Modern Web Apps with Azure - Eric D. Boyd F02 Workshop: Data-Centric Single Page Apps with Aurelia, Breeze, and Web API - Brian Noyes
Back in November, in the Connect(); special issue, I provided tuple on the right, the assignment to the left deconstructs the tuple
an overview of C# 7.0 ( msdn.microsoft.com/magazine/mt790178), in into its constituent parts. In example 2, the left-hand-side assign-
which I introduced tuples. In this article, I delve into tuples again, ment is to pre-declared variables. However, in examples 1, 3 and
covering the full breadth of the syntax options. 4, the variables are declared within the tuple syntax. Given that
To begin, let’s consider the question: Why tuples? On occasion, I’m only declaring variables, the naming and casing convention
you’ll likely find it useful to combine data elements. Suppose, for follows the generally accepted Framework Design Guidelines—“Do
example, you’re working with information about countries, such use camelCase for local variable names,” for example.
as the poorest country in the world in 2017: Malawi, whose capital Note that although implicit typing (var) can be distributed
is Lilongwe, with a gross domestic product (GDP) per capita of across each variable declaration within the tuple syntax, as shown
$226.50. You could obviously declare a class for this data, but it in example 4, you can’t do the same with an explicit type (such as
doesn’t really represent your typical noun/object. It’s seemingly string). In this case, you’re actually declaring a tuple type, not just
more a collection of related pieces of data than it is an object. using tuple syntax and, therefore, you’ll need to add a reference to
Surely, if you were going to have a Country object, for example, the System.ValueType NuGet package—at least until .NET Stan-
it would have considerably more data than just properties for the dard 2.0. Because tuples allow each item to be a different data type,
Name, Capital and GDP per capita. Alternatively, you could store distributing the explicit type name across all elements wouldn’t
each data element in individual variables, but the result would be necessarily work unless all the item data types were identical (and
no association between the data elements; $226.50 would have even then, the compiler doesn’t allow it).
no association with Malawi except perhaps by a common suffix In example 5, I declare a tuple on the left-hand side and then
or prefix in the variable names. Another option would be to com- assign the tuple on the right. Note that the tuple has named
bine all the data into a single string—with the disadvantage that to items—names you can then reference to retrieve the item values
work with each data element individually would require parsing back out of the tuple. This is what enables the countryInfo.Name,
it out. A final approach might be to create an anonymous type, countryInfo.Capital, and countryInfo.GdpPerCapita syntax in
but that, too, has limitations; enough, in fact, that tuples could the System.Console.WriteLine statement. The result of the tuple
potentially replace anonymous types entirely. I’ll leave this topic declaration on the left is a grouping of the variables into a single
until the end of the article. variable (countryInfo) from which you can then access the con-
The best option might be the C# 7.0 tuple, which, at its simplest, stituent parts. This is useful because you can then pass this single
provides a syntax that allows you to combine the assignment of variable around to other methods and those methods will also be
multiple variables, of varying types, in a single statement: able to access the individual items within the tuple.
(string country, string capital, double gdpPerCapita) = As already mentioned, variables defined using tuple syntax use
("Malawi", "Lilongwe", 226.50);
camelCase. However, the convention for tuple item names isn’t
In this case, I’m not only assigning multiple variables, but
well-defined. Suggestions include using parameter-naming con-
declaring them as well.
ventions when the tuple behaves like a parameter —such as when
However, tuples have several other additional syntax possibilities,
returning multiple values that before tuple syntax would’ve used
each shown in Figure 1.
out parameters. The alternative is to use PascalCase, following
In the first four examples, and although the right-hand side rep-
the naming convention for public fields and properties. I strongly
resents a tuple, the left-hand side still represents individual variables
favor the latter approach in accordance with the Capitalization
that are assigned together using tuple syntax, which involves two or
Rules for Identifiers (itl.tc/caprfi). Tuple item names are rendered
more elements separated by commas and associated with parenthe-
as members of the tuple and the convention for all (public)
ses. (I use the term tuple syntax because the underlying data type
members (which are potentially accessed using a dot operator)
the compiler generates on the left-hand side isn’t technically a
is PascalCase.
tuple.) The result is that although I start with values combined as a
Example 6 provides the same functionality as example 5, although
Code download available at itl.tc/MSDN.2017.08.
it uses named tuple items on the right-hand side tuple value and an
implicit type declaration on the left. The items’ names are persisted
72 msdn magazine
implementation for the tuple syntax 7. Assigning an unnamed tuple var countryInfo =
("Malawi", "Lilongwe", 226.50);
for all tuple instances on the right- to a single implicitly typed
System.Console.WriteLine(
hand side of the examples in variable and then accessing $@"The poorest country in the world in 2017 was {
the tuple elements by their countryInfo.Item1}, {countryInfo.Item2}: {
Figure 1. Similarly, the same set of
Item-number property. countryInfo.Item3}");
System.ValueTuple<...> generic value
8. Assigning a named item tuple var countryInfo =
types is used for the left-hand-side to a single implicitly typed (Name: "Malawi", Capital: "Lilongwe", GdpPerCapita: 226.50);
data type starting with example 5. variable and then accessing
System.Console.WriteLine(
$@"The poorest country in the world in 2017 was {
As you’d expect with a tuple type, the tuple items by their countryInfo.Item1}, {countryInfo.Item2}: {
the only methods included are those Item-number property. countryInfo.Item3}");
related to comparison and equality. 9. Discard portions of the tuple (string name, _, double gdpPerCapita) countryInfo =
with underscores. ("Malawi", "Lilongwe", 226.50);
However, perhaps unexpectedly, there
74 msdn magazine Essential .NET
Coding in Paradise
Grab your flip flops, and your laptops, and make plans to attend Visual Studio Live!
(VSLive!™), the conference more developers rely on to expand their .NET skills and the
ability to build better applications.
Over six full days of unbiased and cutting-edge education on the Microsoft Platform,
developers, engineers, designers, programmers and more will soak in the knowledge on
everything from Visual Studio and the .NET framework, to AngularJS, ASP.NET and Xamarin.
magazine
VSLIVE.COM/ORLANDOMSDN
START TIME END TIME NEW Full Day Hands-On Labs: Sunday, November 12, 2017
9:00 AM 6:00 PM VSS01 Full Day Hands-On Lab: Busy Developer's HOL on Angular - Ted Neward VSS02 Full Day Hands-On Lab: From 0-60 in a day with Xamarin an
START TIME END TIME Pre-Conference Workshops: Monday, November 13, 2017
VSM03 Workshop: Service Ori
VSM01 Workshop: Distributed Cross-Platform Application Architecture VSM02 Workshop: Artificial Intelligence or DevOps??
8:30 AM 5:30 PM Designing, Developing, & Impleme
- Jason Bock & Rockford Lhotka - Brian Randell
- Miguel Ca
6:30 PM 8:00 PM Dine-A-Round Dinner @ Universal CityWalk - 6:30pm - Meet at Conference Registration Desk to walk over with the group
11:00 AM 12:00 PM Visual Studio Live! Panel: To Be Announced - Brian Randell (Moderator), Damian Brady, Jeremy Clark, Esteban Garcia, Billy Hollis, & Adam Tuliper
1:00 PM 2:15 PM
VSH09 I See You: Watching the User with VSH10 Continuous Integration and Deployment VSH11 Deploying Straight to Production: VSH12
Reactive Forms - Deborah Kurata for Mobile Using Azure Services - Kevin Ford A Guide to the Holy Grail - Damian Brady for
VSH14 XAML Inception—Deep Composition VSH15 Application Insights: Measure VSH16
2:30 PM 3:45 PM VSH13 Angular Routing - Deborah Kurata
for Better UI - Billy Hollis Your Way to Success - Esteban Garcia Depend
4:00 PM 5:00 PM Next? Visual Studio Live! Networking Event - Brian Randell (Moderator), Damian Brady, Jeremy Clark, Esteban Garcia, Billy Hollis, & Deborah Kurata
START TIME END TIME Post-Conference Workshops: Friday, November 17, 2017
L360_VSL17_4pg_ad_0817_f.indd
Untitled-3 4 4 7/13/17 12:15
7/13/17 9:48 AM
PM
Presented in
Partnership with
WEB SERVER MODERN APPS LIVE! Check Out These Additional Sessions
for Developers at Live! 360
h Xamarin and Xamarin.Forms - Roy Cornelissen
1HWZRUNLQJ%UHDN9LVLWWKH(;325DI¿H#SP
VSW16 PowerApps, Flow, and
Common Data Service: Empowering MAW04 Coding for Quality and Maintainability
Businesses with the Microsoft Business - Jason Bock
Application Platform - Charles Sterling
TechMentor features 20 +
Live! 360 Dessert Luau - Wantilan Pavilion
developer sessions, including:
Day 3: Thursday, November 16, 2017
NEW! Full Day Hands-On Lab:
MAH01 Modern Web Development: Building Server Side Ethical Hacking with Kali Linux
VSH04 Top 10 Ways to Go from Good
Using ASP.NET Core, MVC, Web API, and Azure
to Great Scrum Master - Benjamin Day
- Allen Conway - Mike Danseglio & Avril Salter
VSH08 Devs vs. Ops: Making Friends MAH02 Modern Web Development: Building Client Side Workshop: Windows Security—How I Do It!
with the Enemy - Damian Brady Using TypeScript and Angular - Allen Conway - Sami Laiho
Modern Apps Live! Panel: Mobile Development Hardware, Camtasia, and a Storyline: Creating Your Own
Technologies - Rockford Lhotka (Moderator),
James Montemagno, Kevin Ford User Training - Greg Shields
Lunch on the Lanai - /DQDL3DFL¿FD 7
Make Your PowerShell Scripts Bulletproof with Pester
- Melissa Januszko
VSH12 Design Patterns: Not Just MAH03 Manage Distributed Teams with Visual Studio
for Architects - Jeremy Clark Team Services and Git - Brian Randell Controlling Your Azure Spend - Timothy Warner
VSH16',:K\"*HWWLQJD*ULSRQ MAH04 Using All That Data: Power BI to the Rescue PowerShell Scripting Secrets - Jeffery Hicks
Dependency Injection - Jeremy Clark - Scott Diehl
In-Depth Introduction to Docker - Neil Peterson
1H[W"0RGHUQ$SSV/LYH1HWZRUNLQJ(YHQW
- Rockford Lhotka (Moderator)
We’re currently celebrating the 50th anniversary of the classic to the Grateful Dead, that’s not such a bad thing. But sometimes
Beatles album “Sgt. Pepper’s Lonely Hearts Club Band” (SPLHCB). it’s not so good: allowing them to reach the age of majority with-
Its beautiful strains brighten my office atmosphere as I write these out experiencing the spare, wandering piano at the end of Bruce
words. Other writers may address its groundbreaking musical Springsteen’s “Incident on 57th Street” segueing straight into the
effects (see the interview with the recording engineer at bit.ly/2rEetU0), first crashing chords of “Rosalita” would be abdicating my duty
or its place in the evolution of rock music. Or its spoofs, from as a parent. They ask me, “Daddy, what was all the fuss about the
Doonesbury ( bit.ly/2sjceHR) to National Lampoon ( bit.ly/2sHv- Beatles’ White Playlist?” and I’m not sure what to tell them. Some
CAN). But contemplating Sgt. Pepper today makes me notice the things are worth digging for.
ways in which changes in listening technology have driven changes
in musical artistry.
At the time of SPLHCB’s release, essentially all music was sold on The digital revolution—the
LP albums. You had to buy the whole package, and listen to all of its
songs sequentially. The progression to cassette tapes and then to CDs liberation of pure thought-stuff
didn’t change that constraint. Therefore, the artist had to carefully
compose the sequence of songs on the album, as their influence on from the profane physical
each other was inescapable. The Beatles placed George Harrison’s
introspective, sitar-laden “Within You, Without You” ahead of Paul medium on which it resided—
McCartney’s whimsical “When I’m Sixty-Four,” driven by its trio of
clarinets. Reversing that order would have induced entirely differ- undid these artistic decisions.
ent feelings in even a casual listener. They carefully slotted Ringo’s
“With a Little Help From My Friends” into the second track, where I can hear you thinking: Plattski, you always were a Luddite in this
it would do the least damage, and gave it introductory applause industry, failing to worship technology for its own sake as we all do,
effects to pre-dispose the audience’s perceptions toward approval. insisting on a practical benefit before you’d jump on any bandwagon
The digital revolution—the liberation of pure thought-stuff (see, for example, my March 2016 column, “The Internet of Invisible
from the profane physical medium on which it resided—undid Things,” msdn.com/magazine/mt683803). But now you’re going positively
these artistic decisions. Online stores such as iTunes and Amazon Amish on us. Your nostalgia for the original artistic sequences is
sold individual songs, so you didn’t have to buy the bad ones. Any like an old jeweler moaning over the loss of those beautiful metal
listener could easily rip CDs to disk, composing playlists that mixed components in a mechanical watch, when a simple quartz oscilla-
and matched tracks and artists in any order. We lost that part of tor keeps far better time for a tenth of the price.
the artist’s intention. I’m not saying you shouldn’t make your own playlists, I certainly
And that liberation/loss doesn’t solely affect the album’s song make mine. (Try my Trop Rock playlist that Spotify automatically
sequences. It also ripples through the content of individual songs. An exports to my Facebook page.) But the 50th anniversary of Sgt.
artist releasing an album today can’t know which track the listener Pepper reminds me to carefully examine the original artists’
is hearing before or after any song. Therefore, each song needs to be chosen sequence and content, especially for albums which pre-
an island unto itself, rather than part of an artistic whole. How can date easy ripping and self-composition. I expect some cheers for
anyone compose or play the final orchestral crescendo in “A Day this idea now, and even more in two years, when we celebrate the
in the Life” (bit.ly/1LLne4Z), terminating in the world’s most famous 50th anniversary of “Abbey Road.” n
piano chord, without intending to signal the end of the larger work
to which it belongs? (That remains my biggest dilemma on playing David S. Platt teaches programming .NET at Harvard University Extension School
Sgt. Pepper from end to end: What the heck do I play next?) and at companies all over the world. He’s the author of 11 programming books, includ-
ing “Why Software Sucks” (Addison-Wesley Professional, 2006) and “Introducing
Sometimes this liberation from pre-imposed order is good. Microsoft .NET” (Microsoft Press, 2002). Microsoft named him a Software Legend
When I search Spotify for an artist, it will by default play a shuffle in 2002. He wonders whether he should tape down two of his daughter’s fingers so
of that artist’s most popular tunes. If I’m introducing my daughters she learns how to count in octal. You can contact him at rollthunder.com.
80 msdn magazine
www.aspose.com
EU Sales: +44 141 628 8900 US Sales: +1 903 306 1676 AU Sales: +61 2 8006 6987
[email protected]
Aspose.Total
Every Aspose API combined in one powerful suite.
Aspose.Cells Aspose.BarCode
XLS, CSV, PDF, SVG, HTML, PNG JPG, PNG, BMP, GIF, TIFF, WMF
BMP, XPS, JPG, SpreadsheetML... ICON...
Aspose.Words Aspose.Tasks
DOC, RTF, PDF, HTML, PNG XML, MPP, SVG, PDF, TIFF
ePub, XML, XPS, JPG... PNG...
Aspose.Pdf Aspose.Email
PDF, XML, XSL-FO, HTML, BMP MSG, EML, PST, MHT, OST
JPG, PNG, ePub... OFT...
Aspose.Slides Aspose.Imaging
PPT, POT, ODP, XPS PDF, BMP, JPG, GIF, TIFF
HTML, PNG, PDF... PNG...
Contact Us:
US: +1 903 306 1676
EU: +44 141 628 8900
AU: +61 2 8006 6987 File Format APIs
[email protected]
Working with Files?
Try Aspose File APIs
Convert
Print
Create
Combine
Modify
Pricing Info
Standard Enhanced Standard Enhanced
Developer Small Business $999 $1498 Site Small Business $4995 $7490
Developer OEM $2997 $4494 Site OEM $13986 $20972
The pricing info above is for .NET: prices for other platforms may differ. For the latest, contact sales.
www.aspose.com
EU: +44 141 628 8900 US: +1 903 306 1676 Oceania: +61 2 8006 6987
[email protected]
pg 4
Aspose.Cells for
.NET, Java, Cloud & more
File Formats
XLS, CSV, ODS, PDF, SVG, HTML, PNG, BMP, XPS, JPG
SpreadsheetML and many others.
Spreadsheet Manipulation
Aspose.Cells lets you create, import, and export
spreadsheets and also allows you to manipulate contents,
cell formatting, and file protection.
Creating Charts
Aspose.Cells comes with complete support for charting
and supports all standard chart types. Also, you can
convert charts to images.
Graphics Capabilities
Easily convert worksheets to images as well as adding
images to worksheets at runtime.
100% Standalone
Pricing Info
Standard Enhanced Standard Enhanced
Developer Small Business $999 $1498 Site Small Business $4995 $7490
Developer OEM $2997 $4494 Site OEM $13986 $20972
The pricing info above is for .NET: prices for other platforms may differ. For the latest, contact sales.
www.aspose.com
EU: +44 141 628 8900 US: +1 903 306 1676 Oceania: +61 2 8006 6987
[email protected]
pg 6
Case Study: Aspose.Words for .NET
ProHire Staffing - Using Aspose.Words for .NET to convert Word Docs
to HTML
PROHIRE IS THE WORKFORCE difference between the Aspose. Implementation
SOLUTIONS LEADER Words and other products was the Once we had the Aspose DLL our
IN THE UNITED STATES obvious conversion quality from MS developer was able to implement
AND SPECIALIZE IN THE Word to HTML. Aspose.Words for .NET in a few
RECRUITMENT OF SALES Finding a Solution hours. The transitions with Aspose.
AND SALES MANGEMENT Words for .NET was very painless to
We had tested other products that
PROFESSIONALS. We were do.
converted Word to HTML. Every one
founded with the goal of becoming
we tested had some problem with Outcome
the premier provider of executive
the conversion. Some of them lost
search and placement services to We are very pleased with the
elements of the resume
the Fortune 500 and success of our Aspose.Words for
during the conversion.
Inc. 500 Companies. .NET implementation. Aspose.Words
Most of them changed
Problem the format of the resume is a very powerful development tool
“The transitions that is well documented and easy to
ProHire uses or changed the color of
Bullhorn ATS as its
with Aspose. the text unexpectedly. install. The documentation is easy
Words for This is unacceptable to understand and use. If you want
Application Tracking
.NET was very when you are sending a product to convert Word Docs
System to track the
to HTML look no further. ProHire is
electronic handling painless to do.” a resume to a hiring
manger. We were happy to recommend Aspose.
of its recruitment
needs. We wanted very satisfied with the
to integrate the results. We did not need
any technical support because This is an extract from a case study on
Bullhorn API with our new website.
documentation was sufficient to us. our website. For the full version, go to:
Our goal was to convert MS Word
www.aspose.com/corporate/
Documents resumes into a clean
customers/case-studies.aspx
and concise HTML format into our
existing .Net Stack. The converted
HTML resume version needed to
look close to the original.
Looking for a Solution
We chose the ASPOSE.Words
product because it easily integrated
into our existing .Net stack, and
provided a quality MS Word to
HTML conversion. The product
was easy to download, and with a
few lines of code we were up and
running. We found the primary The converted HTML resume version needed to look close to the original.
www.aspose.com
EU: +44 141 628 8900 US: +1 903 306 1676 Oceania: +61 2 8006 6987
[email protected]
pg 7
Open, Create, Convert, Print
& Save Files
from within your own applications.
ASPOSE.TOTAL
allows you to process these file formats:
• Word documents
• Excel spreadsheets
• PowerPoint presentations
• PDF documents
• Project documents
• Visio documents
• Outlook emails
• OneNote documents
Contact Us:
US: +1 903 306 1676
EU: +44 141 628 8900
AU: +61 2 8006 6987
File Format APIs [email protected]
Helped over 11,000 companies and over 300,000 users work with
documents in their applications.
• Free Trial
• 30 Day Temp License
• Free Support
• Community Forums
• Live Chat
• Blogs
• Examples
• Video Demos
Adding File Conversion and Manipulation to
Business Systems
How often do people in your organization complain that they can’t get information in the file format
and layout they want? Converting documents from one format to another without losing layout and
formatting should be simple, but it can be frustrating for both users and developers.
EXTRACTING DATA FROM A Automation lets you use Microsoft barcodes and OCR. The APIs are
DATABASE AND DELIVERING Office programs server-side. It is optimised for stability, speed and
IT TO THE SALES TEAM AS A not how the Office products were ease of use. Our APIs save users
REPORT, complete with charts and designed to be used. It can work weeks, sometimes months, of effort.
corporate branding, is fine. Until the well but you might notice issues
sales team says that they want it as with the stability, security and
a Microsoft Excel file, speed of the system,
and could you add a as well as cost.
dashboard? Using an API: The
Aspose creates
Using information API market has lots of
APIs that work free and commercial
from online forms in
letters that can are
independently solutions, some
printed and posted of Microsoft very focused, some
is easy. But what if Office feature-rich. An API
you also want to add Automation. integrates with your
tracking barcodes and code and gives you
archive a digital copy access to a range of
Finding the Right Tool
as a PDF? new features.
To find the product that’s right for
Ensuring that your business system Look to Aspose you, take a systematic approach:
supports all the different Microsoft
Aspose are API experts. We create • List must-have and nice-to-
Office file formats your users want
APIs, components and extensions have features.
can be difficult. Sometimes the
that work independently of • Research the market.
native file format support of your
Microsoft Automation to extend • Ask for recommendations.
system lets you down. When that is
a platform’s native file format • Select a few candidates .
the case, use tools that extend that • Run trials.
manipulation capabilities.
capability. A good tool can save you • Evaluate
time and effort. Aspose have developed APIs for
• ease of use,
.NET, Java, Cloud and Android that
Document Conversion Options • support and
lets developers convert, create and
documentation,
Building your own solution: Time- manipulate Microsoft Office files –
• performance, and
consuming and costly, this option Microsoft Word, Excel, PowerPoint,
Visio and Project – and other
• current and future
is only sensible if the solution you
popular business formats, from needs.
develop is central to your business.
PDFs and images to emails. We also
Using Microsoft Office
have APIs for working with images,
Automation: Microsoft Office
www.aspose.com
EU: +44 141 628 8900 US: +1 903 306 1676 Oceania: +61 2 8006 6987
[email protected]
pg 10
Aspose.BarCode
A complete toolkit for barcode generation and recognition
• Generate barcodes with customer defined size and color.
• Recognize a large number of barcode types from images.
ASPOSE.BARCODE IS A EXIP and ICON.
ROBUST AND RELIABLE Format support varies across platforms.
BARCODE GENERATION
AND RECOGNITION API that Supported Barcodes
allows developers to add barcode Linear: EAN13, EAN8, UPCA, UPCE,
generation and recognition Interleaved2of5, Standard2of5, MSI,
functionality to their applications Code11, Codabar, EAN14(SCC14),
quickly and easily. SSCC18, ITF14, Matrix 2 of 5, PZN,
Aspose.BarCode offers a large number of
Aspose.BarCode supports most symbologies and formatting options. Code128, Code39 Extended,
established barcode specifications. Code39 Standard, OPC, Code93
It can export generated barcodes to clean up difficult to read images to Extended, Code93 Standard,
multiple image formats, including improve recognition. IATA 2 of 5, GS1Code128, ISBN,
BMP, GIF, JPED, PNG and TIFF. ISMN, ISSN, ITF6, Pharmacode,
Common Uses DatabarOmniDirectional, VIN,
Aspose.
• Generating and recognizing DatabarTruncated, DatabarLimited,
BarCode
barcode images. DatabarExpanded, PatchCode,
gives Robust and
• Printing barcode labels. Supplement 2D: PDF417,
you full reliable barcode • Enhancing workflow by adding MacroPDF417, DataMatrix, Aztec,
control generation and barcode functionality.
over every QR, Italian Post 25, Code16K,
recognition. • Using recognition functions to GS1DataMatrix Postal: Postnet,
aspect drive real-life work processes.
of the Planet, USPS OneCode, Australia
barcode
Key Features Post, Deutsche Post Identcode,
image, from background and • Barcode generation and AustralianPosteParcel, Deutsche
bar color, through image quality, recognition. Post Leticode, RM4SCC,
rotation angle, X-dimension, • Comprehensive support for 1D SingaporePost, SwissPostParcel
captions, and resolution. and 2D symbologies.
• Image processing for improved
Aspose.BarCode can read and recognition. Platforms
recognize most common 1D and
2D barcodes from any image and at
Supported File Formats
any angle. Filters help developers JPG, TIFF, PNG, BMP, GIF, EMF, WMF,
Pricing Info
Standard Enhanced Standard Enhanced
Developer Small Business $599 $1098 Site Small Business $2995 $5490
Developer OEM $1797 $3294 Site OEM $8386 $15372
The pricing info above is for .NET: prices for other platforms may differ. For the latest, contact sales.
www.aspose.com
EU: +44 141 628 8900 US: +1 903 306 1676 Oceania: +61 2 8006 6987
[email protected]
pg 11
Aspose for Cloud
Aspose.Words Aspose.Cells
for Cloud for Cloud
Aspose.Slides Aspose.Pdf
for Cloud for Cloud
• +44 141 628 8900 • +1 903 306 1676 • +61 2 8006 6987
[email protected]
Aspose.Email
Work with emails and calendars without Microsoft Outlook
• Complete email processing solution.
• Message file format support.
ASPOSE.EMAIL IS AN EMAIL
PROGRAMMING API that allows
developers to access and work
with PST, EML, MSG and MHT files.
It also offers an advanced API for
interacting with enterprise mail
systems like Exchange and Gmail.
Aspose.Email can work with HTML
and plain text emails, attachments
and embedded OLE objects. Aspose.Email lets your applications work with emails, attachments, notes and calendars.
It allows
Common Uses Key Features
developers to
work against Aspose. • Sending email with HTML • A complete email processing
SMTP, POP, FTP Email works formatting and attachments. solution.
• Mail merging and sending mass • Support for MSG and PST
and Microsoft with HTML mail. formats.
Exchange and plain • Connecting to POP3 and • Microsoft Exchange Server
servers. It
supports mail
text emails, IMAP mail servers to list and support.
attachments download messages. • Complete recurrence pattern
merge and • Connecting to Microsoft solution.
iCalendar and embedded Exchange Servers to list,
features, OLE objects. Supported File Formats
download and send messages.
customized • Create and update tasks using MSG, MHT, OST, PST, EMLX, TNEF,
header and body, searching archives iCalendar. and EML.
and has many other useful features. • Load from and save messages Format support varies across platforms.
Aspose.Email allows developers to to file or stream (EML, MSG or
MHT formats).
focus on managing email without
getting into the core of email and Platforms
network programming. It gives you
the controls you need.
Pricing Info
Standard Enhanced Standard Enhanced
Developer Small Business $799 $1298 Site Small Business $3995 $6490
Developer OEM $2397 $3894 Site OEM $11186 $18172
The pricing info above is for .NET: prices for other platforms may differ. For the latest, contact sales.
www.aspose.com
EU: +44 141 628 8900 US: +1 903 306 1676 Oceania: +61 2 8006 6987
[email protected]
pg 13
Aspose.Pdf
Create PDF documents without using Adobe Acrobat
• A complete solution for programming with PDF files.
• Work with PDF forms and form fields.
ASPOSE.PDF IS A PDF
DOCUMENT CREATION AND
MANIPULATION API that
developers use to read, write and
manipulate PDF documents without
using Adobe Acrobat. Aspose.
Pdf is a sophisticated product that
integrates with your application to
add PDF capabilities.
Aspose.Pdf offers a wealth of
features that lets developers
compress files, create tables, work Aspose.Pdf can be used to automatically complete PDF forms with external data.
with links,
add and extract or inset pages, and print Key Features
remove PDF documents. • PDF creation from XML or XSL-
security,
Read, write and
FO documents.
manipulate PDF Common Uses
handle • PDF form and field support.
custom documents • Creating and editing PDF files. • Advanced security and
fonts, independently • Inserting, extracting, encryption.
integrate appending, concatenating and • High-fidelity printing and
of Adobe splitting PDFs.
with conversion.
external
Acrobat. • Working with text, images, • Supported File Formats
tables, images, headers, and • PDF, PDF/A, PDF/A_1b, PCL, XLS-
data
footers. FO, LaTeX, HTML, XPS, TXT and
sources, • Applying security, passwords a range of image formats.
manage bookmarks, create table of and signatures. Format support varies across platforms.
contents, create forms and manage • Working with forms and form
form fields. fields. Platforms
It helps developers add, work with
attachments, annotations and PDF
form data, add, replace or remove
text and images, split, concatenate,
Pricing Info
Standard Enhanced Standard Enhanced
Developer Small Business $999 $1498 Site Small Business $4495 $6990
Developer OEM $2997 $4494 Site OEM $13986 $20972
The pricing info above is for .NET: prices for other platforms may differ. For the latest, contact sales.
www.aspose.com
EU: +44 141 628 8900 US: +1 903 306 1676 Oceania: +61 2 8006 6987
[email protected]
pg 14
Aspose.Pdf
.Net, Java & Cloud
File Formats
PDF DOC XML XSL-FO XPS HTML BMP JPG PNG
ePUB & other image file formats.
Table Features
Add tables to your PDFs with formatting such as table
border style, margin and padding info, column width and
spanning options, and more.
Conversion is fast and high-fidelity. The output looks like the OneNote page, no mat-
ter how complex the formatting or layout.
Aspose.Note works independently of Office Automation and does not require Microsoft
Office or OneNote to be installed.
Features
File Formats and Conversion Rendering and Printing Document Management
EU: +44 141 628 8900 US: +1 903 306 1676 Oceania: +61 2 8006 6987
[email protected]
pg 17
Aspose.Slides
Work with presentations without using Microsoft PowerPoint
• Complete solution for working with presentation files.
• Export presentations and slides to portable or image formats.
ASPOSE.SLIDES IS A FLEXIBLE
PRESENTATION MANAGEMENT
API that helps developers read,
write and manipulate Microsoft
PowerPoint documents. Slides
and presentations can be saved to
PDF, HTML and image file formats
without Microsoft PowerPoint.
Aspose.Slides offers a number of
advanced
features Aspose.Slides has advanced features for working with every aspect of a presentation.
that make Aspose.Slides
it easy to
Common Uses external content.
gives you the • Wide support for input and
perform • Creating new slides and cloning
tools you need existing slides from templates. output file formats.
tasks
such as to work with • Handling text and shape Supported File Formats
rendering presentation formatting.
PPT, HTML, POT, PPS, PPTX, POTX,
• Applying and removing
slides, files. PPSX, ODP, PresentationML, XPS,
protection.
exporting PDF and image formats including
• Exporting presentations to
images and PDF. TIFF and JPG.
presentations, exporting slides to
• Embedding Excel charts as OLE Format support varies across
SVG and printing. Developers use objects. platforms.
Aspose.Slides to build customizable • Generate presentations from
slide decks, add or remove standard database.
graphics and automatically publish
presentations to other formats.
Key Features
• A complete presentation
Aspose.Slides gives developers Platforms
development solution.
the tools they need to work with
• Control over text, formatting
presentation files. It integrates and slide elements.
quickly and saves time and money. • OLE integration for embedding
Pricing Info
Standard Enhanced Standard Enhanced
Developer Small Business $799 $1298 Site Small Business $3995 $6490
Developer OEM $2397 $3894 Site OEM $11186 $18172
The pricing info above is for .NET: prices for other platforms may differ. For the latest, contact sales.
www.aspose.com
EU: +44 141 628 8900 US: +1 903 306 1676 Oceania: +61 2 8006 6987
[email protected]
pg 18
Support Services
Get the assistance you need, when you need it, from the people who know our products best.
• Free support for all, even when evaluating
• Get the level of support that suits you and your team
NO ONE KNOWS OUR Enterprise
PRODUCTS AS WELL AS WE DO. Enterprise customers often have
We develop them, support them and very specific needs. Our Enterprise
use them. Our support is handled Support option gives them access
through our support forums and is to the product development team
available to all Aspose users. and influence over the roadmap.
Work with the developers that developed
Support
and continue to maintain our products. Enterprise Support customers have
their own, dedicated issue tracking
We are developers ourselves and system.
understand how frustrating it is
when a technical issue or a quirk in Sponsored
the software stops you from doing Support Options Available to Enterprise customers
what you need to do. This is why that would like to request features,
Free
we offer free this higher prioritized support can
support. Everyone who uses Aspose ensure your needed features are
Anyone products have access to our free on our roadmap. A member of
who uses Everyone who support. Our software developers our team will produce a feature
our product, uses Aspose are on stand-by to help you specification document to capture
whether they products have succeed with your project, from your requirements and how we
have bought the evaluation to roll-out of your intend to fulfill them so the direction
them or are
access to our solution. development will take is clear up-
using an free support. front.
evaluation,
deserves our Priority
full attention and respect. We have
If you want to know when you’ll hear
four levels of support that can fit
back from us on an issue and know
your needs.
that your issue is prioritized, Priority
Support is for you. It provides a more
formal support structure and has its
own forum that is monitored by our
software engineers.
Pricing Info
To see the Priority and Enterprise support rates, refer to the product price list, or contact our sales team.
Sponsored Support is unique so pricing is specific to each project. Please contact our sales team to discuss.
www.aspose.com
EU: +44 141 628 8900 US: +1 903 306 1676 Oceania: +61 2 8006 6987
[email protected]
pg 19
We’re Here
to Help You
Contact Us
US Sales: +1 903 306 1676
[email protected]
EU Sales: +44 141 628 8900
AU Sales: +61 2 8006 6987