Use SAP Virtual Host Names with Windows on Microsoft Azure

Use SAP Virtual Host Names with Windows on Microsoft Azure

This article is contributed. See the original author and article here.

The use of virtual hostnames with SAP systems is a familiar approach to SAP customers, allowing the decoupling of actual SAP Server hostnames from the hostname referred to by the SAP instance. It provides a degree of abstraction allowing for simpler virtualization, naming conventions, hardware lifecycles, organizational policies, datacenter migrations and Disaster Recovery.


 


This blog post will provide step-by-step instructions on how to reliably deploy an Azure VM with the actual VM Server hostname, as well as the SAP Virtual hostname on a single network interface. These instructions only apply to Windows Operating system.


 


NOTE: Please note that the configuration described in this article does not apply to servers using Windows Server Failover Clustering (WSFC) which can provide high availability to SAP Database and SAP Central Services servers(A/SCS.) This configuration can be applied to SAP Application Servers and 2-tier SAP systems (Application, and SCS servers installed on a single VM.)


 


More detail


When migrating to Microsoft Azure, many customers choose to use a single network interface for their SAP VMs, as it simplifies automation of deployments and management. A common design misconception is that multiple network interfaces increase network throughput, however in Microsoft Azure, unlike many on-premises configurations, Azure Virtual Machines can scale network bandwidth to their potential maximum for that VM size with just a single network interface. There is no need for multiple network interfaces to scale bandwidth.


 


As detailed in SAP Note 2109662 – Windows returns wrong IP address as source IP however, the SAP installation will throw an error unless Windows IP addresses and the DNS registration of VM hostname and the SAP Virtual hostname are configured properly.


 


This configuration is detailed in SAP Note 1564275 – Install SAP Systems Using Virtual Host Names on Windows, however this blog will focus on how to accomplish this specifically in Microsoft Azure.


 


Technical Solution


In this blog we will use the example of an SAP App server with 1 Network Interface attached and the following configuration:



  • Subnet:

    • Name = App

    • CIDR = 10.0.0.0/26

    • Netmask = 255.255.255.192

    • Default Gateway (1st IP address of subnet) = 10.0.0.1



  • IP address/FQDN:

    • 10.0.0.8 = sapapp.contoso.local         (<- VM fully qualified domain name)

    • 10.0.0.9 = sapvhost.contoso.local      (<- SAP virtual fully qualified domain name)




 Windows_VM_Virtualhostnames.png


 Figure 0: A layout of what we want to achieve


 


First, let us look at the updates needed from the Portal.


 


When you are adding an additional IP configuration to the Azure NIC from Microsoft Azure portal, you can add an additional IP configuration on the Home > Network interface > “NIC Name” > IP configurations blade in the following way:


hdamecharla_0-1614274271320.png


Figure 1: Open NIC configuration blade and click “Add”


 


hdamecharla_1-1614274271324.png


Figure 2: adding second IP configuration in the add ipconfig blade


 


Now we move to the VM and RDP into it. The first thing you will notice once you boot-up is that, only one IP configuration is visible in the VM. The reason is that Azure DHCP, by default, assigns the primary IP configuration from the Azure NIC to the network interface within the VM. The secondary IP configurations must be manually assigned at the VM OS level.


hdamecharla_2-1614274271332.png


Figure 3: Output of “ipconfig /all” on the VM


 


Now that we are on the VM, let us walk through the steps needed to allow us to use SAP virtual hostnames on Windows.


 



  1. Windows Servers provide a convenient capability to register each of its assigned IP addresses in DNS. This means that some of the default options allow Windows Server machines to automatically register the IP addresses of the network adapters in DNS after a server restart. To prevent this, you must unset the “Register this connection’s addresses in DNS” option for the network adapters. This setting can be found on the DNS tab of the Advanced TCP/IP Settings property window for TCP/IPv4. This is a very important step, if we do not unset the option the Windows DNS client service registers both IP addresses for the Windows host name in DNS resulting in name resolution issues.


hdamecharla_3-1614274271334.png


Figure 4: Uncheck the checkbox highlighted to prevent auto registration of IP addresses.


 



  1. Make sure that the Remote registry service is enabled and running. This would be required to make changes in the registry to update the properties of the network adapters registered with DNS.


HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParametersDNSRegisteredAdapters{<36 character GUID corresponding to the network adapter that TCPIP was bound to>}


 



  1. Now we add the additional IP configuration on the network card

    • On the “General” tab of the TCP/IPv4 properties, change the IP address acquisition to manual. This is because, as explained above, Azure DHCP only propagates the primary IP configuration to the network adapter, and we want both the IP addresses assigned to it.




hdamecharla_4-1614274271336.png


Figure 5: Set the IP addresses manually


Note: If you set this properly, you will experience a short disconnection to your RDP session and connect back. If you did not set any of the properties correctly, you will not be able to connect back until the VM is rebooted.


 




    • In the “IP Settings” tab of the advanced settings property window, you should see the manually entered IP address.



hdamecharla_5-1614274271339.png


Figure 6: the primary address should show up on the “Advanced” properties window


 




    • Add the additional IP address by clicking “Add”. The “IP settings” tab should look like below before clicking OK.



hdamecharla_6-1614274271342.png


Figure 7: After adding the secondary IP configuration on the network adapter


 




    • Next, we set “SkipAsSource” to “True” (default is “False”) for the secondary IP Address i.e., 10.0.0.9, which we added in the above step. We do this to prevent the secondary IP address from registering in DNS automatically. If “SkipAsSource” is set to “True”, then that IP address will not be registered in DNS and will not be used for host initiated outgoing communications, unless an application specifically binds to it. The preferred way to do this is via PowerShell (as shown below).



 

#Get interface alias, ip addresses and the skip as source before starting
Get-NetAdapter | Get-NetIPAddress | `
    Where-Object -FilterScript { $_.AddressFamily -eq "IPv4" } | `
    Select-Object InterfaceAlias, IPAddress, SkipAsSource

$primaryIP = "10.0.0.8" #replace with your primary ip
$netInterface = "Ethernet 3" #replace with your network adapter name

# get all the IP addresses on the interface, filtered by IPv4 and excluding
# the $primaryIP
[array]$IPs = Get-NetIPAddress -InterfaceAlias $netInterface | ``
    Where-Object { $_.AddressFamily -eq "IPv4" -and $_.IPAddress -ne $primaryIP }

# set primary IP SkipAsSource to false
Set-NetIPAddress -IPAddress $primaryIP -InterfaceAlias $netInterface -SkipAsSource $false

# set other IP addresses with SkipAsSource equal to true
Set-NetIPAddress -IPAddress $IPs.IPAddress -InterfaceAlias $netInterface -SkipAsSource $true 

#check all properties are set properly
Get-NetAdapter | Get-NetIPAddress | `
    Where-Object -FilterScript { $_.AddressFamily -eq "IPv4" } | `
    Select-Object InterfaceAlias, IPAddress, SkipAsSource

 


Once we complete running the code, the output from the Get-NetAdapter command above should look like this:


hdamecharla_7-1614274271343.png


Figure 8: setting “SkipAsSource” to True on the secondary IP address of the NIC


 



  1. At this point we can create the Host (A) records in DNS for the Virtual Hostnames. For the reverse lookups to work, we need to ensure the flag; “Update associated pointer (PTR) record”, is set on both the addresses.  


hdamecharla_8-1614274271344.png


Figure 9: Host (A) records in DNS for the server and virtual hostnames


 


hdamecharla_9-1614274271346.png


Figure 10: setting to update the PTR records in DNS


 



  1. On the VM, we need to notify Windows that the Virtual Hostname being used is actually an alternate name for the computer. We do this by adding a new multi-string value ‘BackConnectionHostnames’ under the “HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlLsaMSV1_0” key. You can use the below PowerShell for doing this, change the sapvhost and sapvhost.contoso.local to the virtual hostnames’ short-name and FQDN.


 

New-ItemProperty -Path 'HKLM:SystemCurrentControlSetControlLsaMSV1_0' `
                 -Name "BackConnectionHostNames" `
                 -Value "sapvhost","sapvhost.contoso.local" `
                 -PropertyType MultiString

 


Note: This setting would not need a server restart to work. You can complete all the steps and reboot the machine


 



  1. Now that we have notified Windows that the machine has alternate names, we need to also tell Windows to allow inbound connections which are directed to this Virtual Hostname. We do this by adding a DWord value called ‘DisableStrictNameChecking’ under the key “HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServiceslanmanserverparameters


 

New-ItemProperty -Path 'HKLM:SYSTEMCurrentControlSetServiceslanmanserverparameters' `
                 -Name "DisableStrictNameChecking" `
                 -Value "1" `
                 -PropertyType DWord

 



  1. At this point, we can reboot the VM.

  2. Once the VM is back online, we can log back in and do some validations

    • Let us check if the ipconfig shows both the IP Addresses. We can do this after adding the second IP on the NIC as well.




hdamecharla_10-1614274271354.png


Figure 11: validating that the second IP shows up in ‘ipconfig /all’ command




    • Validate that reverse lookup works for the secondary IP



hdamecharla_11-1614274271355.png


Figure 12: validating that reverse lookup works for secondary IP




    • Check that the DisableStrictNameChecking and BackConnectionHostnames settings are working by running “net view virtualhostname and browsing to the virtual hostname through the command prompt. Ideally, run these from a different machine to check further.



hdamecharla_12-1614274271357.png


Figure 13: checking the shares are available by running net view command




    • Another good test is to open the Computer Management MMC and open the virtual hostname from Action -> Connect to Another Computer -> virtual host name. If you can browse the ‘Local Users and Groups’ and ‘Services and Applications’, it is a good sign and SAPinst should be successful.



hdamecharla_13-1614274271362.png


Figure 14: Test connecting to SAP virtual hostname from MMC


 



  1. Once all the tests from above tests have succeeded, we can start with the SAP installation using the virtual hostname now by running SAPinst from an administrative command prompt and execute the following command: SAPinst.exe SAPINST_USE_HOSTNAME=<virtualname>.


 


Summary


To recap the configuration above, here are the 6 basic steps required on the Windows virtual machine to prep it for SAP installation using virtual hostnames with a single network interface:



  1. Uncheck the “Register this connection’s addresses in DNS” setting on the primary NIC

  2. Add a second IP address configuration through the Azure Portal, and then within the VM add the second IP address to the Network Interface’s IPv4 properties

  3. Follow SAP Note 2109662 – using PowerShell set the “SkipAsSource” property on the second IP address (desired outcome: first IP address à SkipAsSource=false; secondary/virtual IP address à SkipAsSource=true)


hdamecharla_14-1614274271364.png


Figure 15: After setting SkipAsSource, the interface details



  • 10.0.0.8 = actual VM hostname, will automatically register in DNS

  • 10.0.0.9 = virtual SAP hostname, will not automatically register in DNS, we will manually create this DNS record



  1. Maintain the registry entries:

    • HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServiceslanmanserverparametersDisableStrictNameChecking = 1 (Type: DWORD)

    • HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlLsaMSV1_0BackConnectionHostnames = FQDN short hostname (Type: Multi-string value)




(ex: sapvhost.contoso.local sapvhost <Not a space, but a carriage return between these>)


 



  1. Re-set the “Register this connection’s addresses in DNS” setting on the primary NIC

  2. Outcome:

    • VM Primary IP Address (10.0.0.8) will register in DNS with actual VM hostname

    • You must manually create an A-record for the VM secondary IP Address 10.0.0.9 and the virtual SAP Hostname




 


To ensure you have completed these steps correctly you can validate the configuration by:



  • DNS forward lookup (e.g., “nslookup sapvhost.contoso.local”)

  • DNS reverse lookup (e.g., “nslookup 10.0.0.9”)

  • Browse to the sapvhost.contoso.local UNC address through either the command prompt or File Explorer.


 


After executing this set of steps on your VM, you are now prepared to start the SAP installation by starting SAPinst on the VM using virtual hostnames. Start SAPinst from an administrative command prompt and execute the following case-sensitive command: SAPinst.exe SAPINST_USE_HOSTNAME=<virtualhostname>.


 


References


Nurturing our Computer Science Talent

Nurturing our Computer Science Talent

This article is contributed. See the original author and article here.

By Eric Horvitz, Chief Scientific Officer


EDU19_StudentsWorkingonDevices_009_lowres.jpg


It’s that time of year when computer science educators from across the world come together to exchange ideas at the ACM SIGCSE Technical Symposium. With the accelerating sophistication and influence of computing technologies comes a critical need: Computer science education. The work of computer science educators is essential in educating and inspiring our up-and-coming computer scientists.


 


It’s inspiring to see the innovative ways that the teaching of computer science is evolving.  And it’s heartening to see the soaring popularity of computer science. Computer science is now considered a noble profession, much like medicine and law have been viewed over the decades. Record numbers of college students are choosing computer science as their major. 


 


Beyond serving as a path to a career in computer science, CS education provides key pathways into professions like biomedicine, aerospace, chemistry, physics, and the social sciences—places where computing is not peripheral, but where it has become a central part of the disciplines.


 


With great power and influence, comes great responsibility. Today, computing advancements are framing hard questions about the influence of computing technologies on people and society, including issues around safety, privacy, civil liberties, civil rights, access to technology, and the fairness of systems. Important questions have come to the fore about the outsized influence of computing technologies on our patterns of our attention, on the information that we consume, and how we spend our time. These questions and issues are growing to become an important part of computer science education. It’s wonderful to see CS educators developing and including formal content on values, ethics, and responsibilities.  


 


All of us can remember that moment in our life when an inner voice whispered: This is what I like doing! This is who I am. This is who I will be. Educators play such a central role for students on this path of discovery. They are not only the source of knowledge—they are the source of students’ self-knowledge, the spiritual guides behind the rising spirits. Educators play such an important role with clarity and creativity with teaching, including insightful artistry with the sequencing of concepts via curricula.


 


From all of us at Microsoft, I’d like to extend a huge thank you! to computer science educators across the world.  Thank you for the magic you bring to the classrooms, the engaging ideas, and the way you motivate, encourage, and excite computer science students.  


 


(From opening remarks at SIGCSE Technical Symposium)

Microsoft named a Leader in 2021 Gartner Magic Quadrant for Cloud AI Developer Services

Microsoft named a Leader in 2021 Gartner Magic Quadrant for Cloud AI Developer Services

This article is contributed. See the original author and article here.

 


Gartner CAIDS MQ graphic 2021.png


Gartner recently released their Magic Quadrant for 2021 Cloud AI Developer Services. Microsoft is in the Leaders quadrant and was positioned highest on the ability to execute axis. You can download a complimentary copy of the Magic Quadrant for Cloud AI Developer Services for the full report. In this post, we’ll look at why, we think, Microsoft was placed in the Leaders quadrant. 


 


According to the report, “Gartner defines cloud AI developer services (CAIDS) as cloud-hosted or containerized services/models that allow development teams and business users to leverage artificial intelligence models via APIs, SDKs, or applications without requiring deep data science expertise.”


 


They specifically evaluated services with capabilities in language, vision, and automated machine learning. For Azure, this includes Azure Cognitive Services, Azure Machine Learning, and Microsoft’s conversational AI portfolio. For Power Platform, this includes AI Builder and Power Virtual Agents.


 


“Gartner believes that enterprise development teams will increasingly incorporate models built using AI and ML into applications. These services currently fall into three main functional areas: language, vision and automated machine learning (autoML). The language services include natural language understanding (NLU), conversational agent frameworks, text analytics, sentiment analysis and other capabilities. The vision services include image recognition, video content analysis and optical character recognition (OCR). The autoML services include automated tools that will let developers do data preparation, feature engineering, create models, deploy, monitor and manage models without having to learn data science.”


 


Azure AI enables you to develop AI applications on your terms, apply AI responsibly, and deploy mission-critical AI solutions.


 


Develop on your terms


 


Azure AI allows you to build AI applications in your preferred software development language and deploy in the cloud, on-premises, or at the edge. Azure provides options for data scientists and developers of all skill levels – no machine learning expertise required. See the Microsoft section of the Magic Quadrant for Cloud AI Developer Services.


 


Apply AI responsibly


 


Azure offers tools and resources to help you understand, protect, and control your AI solutions, including responsible ML toolkits, responsible bot development guidelines, tools to help you explain model behavior and test for fairness, and more. We never use your data to train our models, and we keep principles like inclusiveness, fairness, transparency, and accountability in mind at every stage of our AI research, development, and deployment. See the Microsoft section of the Magic Quadrant for Cloud AI Developer Services.


 


Deploy mission-critical solutions


 


Azure lets you access the same AI services that power products like Microsoft Teams and Xbox, and that are proven at global scale. Azure leads the industry when it comes to security, and we have the most comprehensive compliance coverage of any cloud service provider. We continue to innovate and our Microsoft Research team has made significant breakthroughs, most recently reaching human parity with image captioning. See the Microsoft section of the Magic Quadrant for Cloud AI Developer Services.


 


Whether you’re a professional developer or data scientist, or just getting started, we hope that you can use Azure AI services to build impactful AI-powered applications that solve complex problems and enhance customer experience.


 


This graphic was published by Gartner, Inc. as part of a larger research document and should be evaluated in the context of the entire document. The Gartner document is available upon request from Microsoft. Gartner does not endorse any vendor, product or service depicted in its research publications, and does not advise technology users to select only those vendors with the highest ratings or other designation. Gartner research publications consist of the opinions of Gartner’s research organization and should not be construed as statements of fact. Gartner disclaims all warranties, expressed or implied, with respect to this research, including any warranties of merchantability or fitness for a particular purpose.

The Tenets of Knowledge Management Adoption

This article is contributed. See the original author and article here.

Knowledge Management Systems and Adoption Key Tenets: 


Sonia M. Ang – CSA 


 


In today’s competitive business environment organizations need a clear roadmap that aligns with their training needs and focuses on both short-and long-term objectives.  Knowledge Management is a tool that can be implemented to identify and appeal to the training needs of the modern employee.  A successful Enterprise Learning system goes beyond the organizational level and allows employees access to information and knowledge, thus creating better alignment at the enterprise level.   A well-designed Knowledge Management System can break down barriers by providing partners, clients, and customers with not only essential information and robust training, but also opportunities to promote and inform your organization’s products and services. 


Employee retention and customer satisfaction are essential to any organizations long-term success.   When considering your organization’s ROI, the benefits of Enterprise Learning are threefold:  retention (customers and employees), satisfaction, and improved profitability.  Enterprise Learning can be leveraged to provide better development and training opportunities thus promoting a feeling of empowerment amongst your team.  Enterprise Learning promotes efficiencies in training, in turn your organization will recognize the cost-saving benefits due to lower employee turnover and customer churn. 


Enterprise Knowledge Management Adoption  


1. Management Sponsorship and a COE   


 An executive sponsor provides that critical link between executive leadership and project management and helps support projects successfully to their completion at their expected performance.  Sponsorship of the Enterprise Knowledge Management Project will enhance your product base and create opportunities for your company in the rapidly advancing Knowledge Management sector.  Executive sponsorship will align with our company’s strategy to be experts in Knowledge Management.  Microsoft will be at the forefront of Knowledge Management as organizations rush to adopt more efficient and effective training strategies that better align to the modern worker’s needs. 


 


 2. Beyond Training but Execution  


Training programs at the company level are often too extensive in complexity and the amount of learning material can be downright overwhelming.  Training professionals need to venture beyond traditional learning and utilize learning strategies that support the needs of today’s modern professionals.  Microlearning, for example, provides a host of benefits to your organization in terms of increased learner participation, memorability of courses, and quick deployment with easy updates to your digital learning assets. 


Knowledge Management allows for learning concepts to be extracted from larger training programs and utilized as checklists and instructional videos that are easily accessible at a moment’s notice.  When learning material is successfully mined it allows the learning process to be refined, thus challenging concepts can be identified and made easier to process and understand. 


 


3. Collaborative and Social Learning 


How does your organization support collaboration, problem-solving and the co-creation of knowledge?  A successful Enterprise Learning Strategy will push an organization forward by improving collaboration via robust communities and meaningful discussion forums.   Building professional learning communities on platforms like Slack and Microsoft TEAMS can help break the walls down in organizations where ideas and knowledge may be siloed.  In addition to collaborative discussion platforms that give all community members a voice, the development of Expert Finders can be an important catalyst for creating a robust culture of collaboration.  Hidden ideas and knowledge will organically emerge from people in your organization that may hold previously unearthed niche expertise. 


 


4. Where is the Data?  


Generating data for analysis is the foundation of a robust Enterprise Learning strategy.  The key to success is to build data collection directly into technical systems supported by a centralized knowledge repository.  Data collection in the education sphere has traditionally focused on summative assessments like exams that are intended to measure a learner’s mastery of objectives.  Using the specifications in Enterprise Learning provides another set of metrics by allowing an organization to track formative assessments, such as data and social learning activity.  For example, these metrics allows an organization to collect new data, adding another layer of data to your knowledge repository to support the creation of more meaningful formative and summative assessments. 


 


 


5. Reusable Content and Reproducibility  


How do organizations move past the traditional content development models where bulky training manuals were the norm?  Learning data and insights help organizations to build learning solutions that are reusable and provide 24/7 access to learning.  Additionally, a Headless CMS allows your organization’s content creators to move away from the rigid templates that most traditional learning management systems utilize. This means content creators have more control over the quality of their content, and this streamlines the process of creating unique digital learning experiences for both your employees and customers.  Perhaps your organization releases a short instructional video on company’s rules and regulations.  This learning asset has value as both a stand-alone content object in a knowledge base as well as a learning module in a more extensive communications course.  Content creators in your organization, ranging from instructional designers to marketing professionals, often create multiple versions of the same material.  Creating content that is reusable and not redundant is more efficient as you are not reinventing the wheel.  Additionally, you are not burdened with trying to maintain and keep up-to-date multiple versions of the same learning assets.  


 


6. “Findability” of Learning Assets: Digitization and Technology 


The successful implementation of KM tools can enhance the user experience through successful mining and classification of metadata.  The power of KM is powerful in that it provides a taxonomy, ontology, and a finely tuned search system. A well-designed metadata strategy will take advantage of your learning assets which may include courses, webinars, professional learning communities (PLCs) and subject matter experts in your organization.  This myriad of data exits across multiple systems in your organization. Using metadata that is contextualized and consistent will ensure that your data is findable.  Taking it one-step further ontologies can be tapped to support a complete network of shareable and reusable knowledge across a domain for each unique user. 


 


 


Summary 


The adoption of an Enterprise Management system can reframe your organization’s knowledge and learning infrastructure.  Modern learners need to consume information quickly thus allowing them to efficiently apply and master essential skills and strategies.  A well-engineered Enterprise Learning Plan that focuses on empowering your community will result in higher learner engagement, enhanced workplace skills and a robust culture-of-knowledge across your organization.  Curiosity will drive success rather than traditional command and control training strategies.  Empower your community by giving them the autonomy to self-direct their own learning.  As a result, your organization will enjoy increased engagement, enhanced workforce skills and, in turn, a robust learning culture will grow and flourish 

Monitor your hybrid network with Network insights

Monitor your hybrid network with Network insights

This article is contributed. See the original author and article here.

Customers monitoring their networks must scramble across dashboards and resources to find monitoring data leading to frustrations and troubleshooting delays.


 


Presenting Network insights – a centralized console for network monitoring and troubleshooting. Customers get an agentless health monitoring experience and access to resource topologies along with key resource metrics – all with zero configuration. 


 


Network insights drilldownNetwork insights drilldown


 


 


Unified network monitoring and troubleshooting console



  • Single console to access all network monitoring and troubleshooting experiences

  • Unified health & alerts view across all networking resources. The one place to start your monitoring & troubleshooting journey

  • Integrated with NSG Flow Logs, Traffic Analytics and Connection Monitor – showing traffic and connectivity monitoring information in one place


Resource-specific troubleshooting



  • 1-click access to resource-specific metrics, functional views, diagnostics and documentation

  • Visually identify resource components using the topology to easily detect, diagnose and fix issues

  • Analyze issues and find root causes from resource metrics without writing queries or authoring workbooks


Integrated & ready from Day 1



  • No agent installation or configuration required

  • Available in all clouds – public and air-gapped

  • Harmonized with the overall Azure Monitor experience to provide easier debugging across compute, storage and networking


Network insights also surfaces information from configuration-based monitoring tools as shown below.


 


Connectivity Monitoring Connectivity tabConnectivity tab


In the Connectivity tab, customers get an aggregated view of all the connectivity tests they have setup in Connection Monitor along with any test-related alerts. Customers can filter out tests based on source type, destination type, connectivity status and round trip time. The test drilldown allows customers to view test details including exact source and destination names, protocol used, RTT history and more. Customer can clickthrough to the tests they are interested in investigating further.


 


Traffic Monitoring


Traffic tabTraffic tab


The Traffic tab allows customers to understand their traffic monitoring coverage in a single glance and review any alerts from Traffic Analytics. Customers can view NSGs grouped by regions and filter them based on the enablement status of NSG Flow Logs and Traffic Analytics. Using the drilldown customers can click through to individual NSGs and modify their traffic monitoring coverage as needed.


 


You’re invited to comment and share your thoughts on Network Insights and what you’d like to see coming next. 


 


Useful links



 


 

 

 

 

 

 

 

Getting started with SharePoint's custom view formatting

Getting started with SharePoint's custom view formatting

This article is contributed. See the original author and article here.

Introduction


In a previous blog post, the basic building blocks of custom column formatting were introduced to us. From that, we learned how to customize our columns to create some interesting visuals.


 


column-formatting-after.png


Things look better, but each column is still a separate component. What if we want to tie them all together into a more cohesive presentation?


 


The good news is that we can! Just like we customized our columns, we can also customize SharePoint list views! That will allow us to go from a traditional table/column/cell view, to something that looks ‘put together’, like so…


view-formatting-after.png


 


Preparing for your journey


Before you get going, there are a few things that will help prepare you for the trek ahead.


 


If you haven’t, I would highly recommend reading the first blog post in this series: Getting started with SharePoint’s custom column formatting.


 


You can also refer to the official documentation for view formatting to help fill in any gaps not covered here.


 


I should also warn you that your HTML and CSS skills are going to come into play a lot more here, as you’ll be trying to work with multiple elements to position them correctly.


 


If you’re not an expert, that’s perfectly okay – I’m not one either – you’ll just need an extra dose of patience. Trial and error will get you there, eventually. I’m not going to dwell on the particular CSS used in these examples except in cases where it’s a pattern that could be applied to other use cases.


 


And that’s pretty much it. There’s some new stuff we’ll learn about that only applies to View formatting, but everything we learned from the previous blog post will apply here as well.


 


Choose your own adventure


In case you weren’t aware, views in a Modern SharePoint list come in a few flavors.


 


list-view-flavors.png


 


Most of us are probably already very familiar with the List layout; It’s what we’ve been used to for decades. Compact List is the same as List…just smaller. The Tiles view, frequently referred to as the Gallery view, is somewhat newer. As you may expect, it will display your list items as cards/tiles in a classic grid view. There’s also a Calendar view/layout that was recently added, but is not currently customizable.


 


When it comes to custom formatting, we can customize both the List and Gallery layouts. They do need to be customized separately, as their schemas are slightly different, but they’re close enough that you can usually take your JSON from one and apply it to the other with minimal changes.


 


For our journey here, we’re going to start with a List view and then use it to create a Tile view.


 


I wisely started with a map


Before we get into defining our custom view formatting, it may be helpful to spend some time up front thinking about how we’ll structure our view. The more you want to transform your view, the more important it will be to plan things out in advance. This is where some understanding of HTML will come in handy.


 


To help guide myself, I created the following image to try and visualize how my various DIVs and other elements would be laid out.


 


blowout-witharrows.png


 


This isn’t necessary, obviously, but I personally find it helpful to have a blueprint in front of me (even if it’s only a mental one).


 


Formatting List views


If you recall from the column formatting article, each custom format followed the same basic structure: A $schema definition along with a parent HTML element and optional attributes, styles and children.


 


{
“$schema”: “https://developer.microsoft.com/json-schemas/sp/v2/column-formatting.schema.json”,
“elmType”: “div”,
“attributes”: {
“iconName”: “Game”
},
“style”: {
“font-size”: “48px”,
“color”: “red”
},
“children: []
}

 


List views aren’t that much different.


 


{
“$schema”: “https://developer.microsoft.com/json-schemas/sp/v2/row-formatting.schema.json”,
“hideSelection”: true,
“hideColumnHeader”: true,
“rowFormatter”: {}
}

We still have our $schema property, but it’s important to notice that it’s pointing to a different schema definition. We also have some new optional properties: hideSelection & hideColumnHeader. As you may suspect, hideSelection will do away with the ability to select a particular list item while hideColumnHeader will do away with the the column headers normally present on a list.


 


What’s a little different here is that we’re missing our parent element. Instead, we have this rowFormatter property. The reason for this is that we can choose between using this and an additionalRowClass property. If you choose the latter, you’re limited to applying CSS classes to the entire row, similar to what you can do with the out-of-box “Conditional formatting”. If all you want to do is make your row a different color, you’re probably better off using the design mode tools, but if you’re interested in learning more about the additionalRowClass property, it is covered well enough in the official documentation.


 


We, however, will not be satifisfied with applying some simplistic styling. NO! We are bound for greater rowFormatter glory!


 



NOTE: There are other properties available that are not covered in this blog, most notably the groupProps property. This allows you to customize the grouping header that appears when items are grouped together by some column. There are also footerFormatter and hideFooter properties that affect the “List Footer” that appears if you’re displaying item totals.



 


One container to rule them all


The rowFormatter property is simply an object that wraps all of the HTML elements we’re going to create our view. If, for some reason, we wanted every row in our list to just simply display the basic column formatting shown in the previous section, we’d end up with the following JSON definition.


 


{
“$schema”: “https://developer.microsoft.com/json-schemas/sp/v2/row-formatting.schema.json”,
“hideSelection”: true,
“hideColumnHeader”: true,
“rowFormatter”: {
“elmType”: “div”,
“attributes”: {
“iconName”: “Game”
},
“style”: {
“font-size”: “48px”,
“color”: “red”
},
“children: []
}
}

That’s probably not the greatest idea, but it does illustrate the point. Once we make it inside of the rowFormatter object, it’s almost business as usual. There’s one more difference we need to understand…how we reference columns.


 


How to reference fields


When we were dealing with formatting individual columns, we always used the built-in variable @currentField, but what about when we’re dealing with more than one view? @currentField is still there, but it holds a slightly different meaning in this context. It will always be a reference to the standard Title field.


 


LOTR-Meme.png


 


Instead of using @currentField to reference a column, we’ll need to use a slightly different format: [$InternalColumnName].


 


In our list, we have a handful of columns including a Member lookup column. If we want to reference that field, we’d use [$Member]. Even if we change the display name from “Member” to “Hero”, our variable would still be [$Member]. And, since Member is a lookup column, if we want to show the display name of the user, we need to use the title property. We’d do that in the following way [$Member.title].


 


The World Is Not In Your Books And Maps. It Is Out There.


Alright. Enough with the lessons, it’s time to get started.


 


We can use the “map” we created earlier and turn it into a rough skeleton. Each layer in that blowout represent a parent/child relationship. So, by looking at our map…


 


blowout-witharrows.png


 


We come up with this.


 


{
“$schema”: “https://developer.microsoft.com/json-schemas/sp/v2/row-formatting.schema.json”,
“hideColumnHeader”: true,
“hideSelection”: true,
“rowFormatter”: {
“elmType”: “div”,
“attributes”: { “title”: “Parent Container” },
“children”: [{
“elmType”: “img”,
“attributes”: { “title”: “Background Image” },
“children”: [{
“elmType”: “div”,
“attributes”: { “title”: “Column Container” },
“children”: [
{
“elmType”: “div”,
“attributes”: { “title”: “Member/Role DIV” },
“children”: [
{
“elmType”: “img”,
“attributes”: { “title”: “Large Member profile picture” }
},
{
“columnFormatterReference”: “[$Title]”
}
]
},
{
“elmType”: “div”,
“attributes”: { “title”: “Text DIV” },
“children”: [{
“elmType”: “div”,
“attributes”: { “title”: “Member Name row/div” }
},
{
“elmType”: “div”,
“attributes”: { “title”: “Age row/div” }
},
{
“elmType”: “div”,
“attributes”: { “title”: “From row/div” }
}

]
},
{
“elmType”: “div”,
“attributes”: {
“title”: “Race/Weapons DIV/Column”
},
“children”: [{
“elmType”: “div”,
“attributes”: { “title”: “Race icon DIV/Row” },
“children”: []
},
{
“elmType”: “div”,
“attributes”: { “title”: “Weapon icons DIV/Row” },
“children”: []
}
]
}
]
}]
}]
}
}


 


That’s the basic layout of our custom view, simply a series of parent and child divs. We’ll start filling this skeleton out with content shortly, but there are a couple of things to point out already.


 


First, there are several examples of this “attributes”: { “title”: “<TEXT>” } pattern. We can use this as a means of commenting about the purpose of the element, since comments aren’t allowed in valid JSON and would break our view. Again, this isn’t required and adds absolutely no value to the view itself. It does, however, help keep us (and any future adventurer) oriented as to where we are in our JSON.


 



NOTE: Using the title attribute will cause whatever you specify to be displayed as a tooltip when a user hovers over the element. You can remove your titles after you done, if that bothers you. Otherwise, just be aware that users may see your witty comments.



Also, in the “Member/Role DIV” children, the second child looks a little peculiar.


{
“columnFormatterReference”: “[$Title]”
}

This columnFormatterReference property is a nifty shortcut that tells the view formatter to display the referenced field (Title, in this case) as it normally would, including any custom column formatting that may have been configured. This is a great opportunity for some reusability, especially if you want the column to show exactly the same way on every view.


 


If you take our skeleton and put it into SharePoint, there’s not going to be much to look at. So let’s fix that.


 


Putting some meat on the bone


Now that we’ve got our skeleton all rigged up, it’s time to fill it out some.


 


It’s certainly a little short and skinny, so let’s start by defining some CSS on our parent div. We know we want a border around the whole thing, as well as a particular font style and size, so we can apply those things at the top level.


 


“style”: {
“position”: “relative”,
“border”: “5px solid black”,
“border-radius”: “10px”,
“width”: “600px”,
“height”: “175px”,
“font-family”: “Luminari, Papyrus, Brush Script MT”,
“font-size”: “24px”
}

We’re also specifying a position value of “relative”, which tells the browser to display that DIV relative to it’s parent container. In this case, that parent container will be the row in the list. It won’t have any noticeable effect here, but will help us later.


 


Let’s also go ahead and setup our second layer too, our background image. Normally, we’d just use the css property background-image and point it to a URL. Unfortunately, we can’t do that here because the ( character is prohibited in most use cases. So, instead, we have to use an img element and size it appropriately.


 


{
“elmType”: “img”,
“style”: {
“width”: “100%”,
“height”: “100%”,
“z-index”: “-3”,
“opacity”: “.5”
},
“attributes”: {
“title”: “Background Image”,
“src”: “=@currentWeb + ‘/SiteAssets/MiddleEarthLocales/’ + [$From.lookupValue] + ‘.jpg'”
},
“children”: […]
}

We’ve added the src attribute, which should look mostly familiar. Notice, though, that we’re referencing the [$From] variable.


 


We’re also setting the width and height to be 100% of the parent so the image fills the space and we’re setting the opacity to half so that the image is a little on the transparent side (this will help the text and images we lay on top of it stand out more).


 


Finally, we’re setting this z-index property to a negative value. Typically, HTML will render any content inside of the div on top of the div. Think of it like a stack of plates. That last thing you put on the stack is the most visible. We can use the z-index property to affect that, and by setting to a negative value here, we’re ensuring that out content will be rendered behind our parent div. Without this, the background image would cover up our border.


 


Stylin’ and Profilin’


Now that we’ve got our first two layers done, let’s take a look at our third layer. If we refer back to our skeleton, we can see that our img element has a single child titled “Column Container”, and that child has three children of its own. What we want to happen is to have a three-column layout and to do that, we’re going to style this “column container” like so.


 


“style”: {
“position”: “absolute”,
“width”: “100%”,
“height”: “100%”,
“display”: “flex”
}

 


We have to specify the width and height here as being “100%” because, without it, the DIV will only grow as large as the content and we want to ensure that it stays as large as it can. We’re also specifying a different position value here – absolute – which basically tells the browser to render our DIV at a specific position. In this case, we’re letting it default the starting point, which is the “top left corner” of the first ancestor element with a “position” attribute on it (in this case, our parent div, which we said was relative positioned).


 


We’re also specifying a display property with a value of flex. This creates what’s known as “Flexbox” which will help us deal with the concept of turning our child DIVs into “Columns” and “Rows”.


 


Now that we’ve got our container, let’s work on the next three children, which will represent our three columns.


 


First column


We’ll just div right into the definition for our first column, which is a simple parent div to hold our image and role icon.


 


{
“elmType”: “div”,
“attributes”: { “title”: “Member/Role DIV” },
“children”: [
{
“elmType”: “img”,
“attributes”: {
“src”: “=replace([$Member.picture], ‘MThumb’, ‘LThumb’)”
},
“style”: {
“height”: “175px”,
“width”: “175px”,
“border-style”: “solid”,
“border-color”: “black”,
“border-width”: “0px 5px 0px 0px”
}
},
{
“columnFormatterReference”: “[$Title]”
}
]
}

Two points of interest here.


 


First, for the src attribute for our img property, we’re using the replace() function to swap out the text ‘MTHUMB’ for ‘LTHUMB’. When a user uploads a profile picture, SharePoint will create three versions of it (large, medium, and small). For formatting, referencing the picture property will always return the medium thumbnail. Rather than stretching a smaller thumbnail, we can use pattern to retrieve the larger one instead.


 


Also, because we formatted the Role (which is a rename of the Title column), we don’t have specify the definition here. Instead, we’re using the columnFormatterReference property and referencing our field.


 



NOTE: The column formatting for Role was slightly updated from the previous blog.



Just for reference, here’s the definition we created for the custom column formatting used on the Role field.


 


{
“$schema”: “https://developer.microsoft.com/json-schemas/sp/v2/column-formatting.schema.json”,
“elmType”: “div”,
“style”: {
“width”: “24px”,
“height”: “24px”,
“font-size”: “24px”,
“background-color”: “green”,
“color”: “white”,
“position”: “absolute”,
“left”: “0”,
“bottom”: “0”,
“border-radius”: “4px”
},
“children”: [{
“elmType”: “div”,
“style”: {
“margin”: “auto”
},
“attributes”: {
“iconName”: “=if(@currentField == ‘Ring-bearer’, ‘StatusCircleRing’, if(@currentField == ‘Guardian’, ‘Shield’, if(@currentField == ‘Melee’, ‘DecisionSolid’, ‘Bullseye’)))”
}
}]
}

At this point, we have something like the below image.


 


column-1.png


 


Second column


Our second column consists of three rows, each containing a different bit of text relating information about the current member. Here’s the definition for this section.


 


{
“elmType”: “div”,
“attributes”: {
“title”: “Text DIV”
},
“style”: {
“padding-left”: “5px”,
“color”: “white”,
“width”: “inherit”,
“text-shadow”: “2px 2px 0 #000000”,
“font-weight”: “bolder”,
“display”: “flex”,
“flex-direction”: “column”,
“justify-content”: “space-between”
},
“children”: [
{
“elmType”: “div”,
“style”: {
“font-size”: “1.5em”
},
“txtContent”: “[$Member.title]”
},
{
“elmType”: “div”,
“style”: {
“font-size”: “1.25em”
},
“txtContent”: “=’Age: ‘ + [$Age.displayValue]”
},
{
“elmType”: “div”,
“style”: {
“font-size”: “1.25em”
},
“txtContent”: “=’From: ‘ + [$From.lookupValue]”
}
]
}

 


The only thing of real note here is that our parent container in this case is again defining a “Flexbox” with its display property. We’re also using two new properties, flex-direction and justify-content, to control how our children are displayed relative to one another.


We’re using the width property with a value of inherit to force our column to take up the maximum amount of width possible. It won’t have a noticeable affect here, but will come into play in the next section.


 


The flex-direction property tells the browser to make each child grow to take up the entire column, width wise. That will force each child div onto its own line.


 


The justify-content property, on the other hand, tells the browser to evenly distribute our rows across the available height.


We’re getting closer to our desired end result.


 


column-2.png


 


The final column


Our last column consists of two rows of equal size to hold our Race and Weapon Icons. Let’s take a look.


 


{
“elmType”: “div”,
“attributes”: { “title”: “Race/Weapons DIV/Column” },
“style”: {
“width”: “48px”,
“padding”: “5px 5px 5px 0px”,
“display”: “flex”,
“flex-direction”: “column”
},
“children”: [
{
“elmType”: “div”,
“attributes”: { “title”: “Race icon DIV/Row” },
“style”: {
“flex-grow”: “1”
},
“children”: [{
“columnFormatterReference”: “[$Race]”
}]
},
{
“elmType”: “div”,
“attributes”: { “title”: “Weapon icons DIV/Row” },
“children”: [{
“columnFormatterReference”: “[$Weapons]”
}]
}
]
}

There’s nothing new to discuss here, but it does finish off our sample.


 


column-3.png


 


The Complete Schema


{
“$schema”: “https://developer.microsoft.com/json-schemas/sp/v2/row-formatting.schema.json”,
“hideColumnHeader”: true,
“hideSelection”: true,
“rowFormatter”: {
“elmType”: “div”,
“style”: {
“position”: “relative”,
“border”: “5px solid black”,
“border-radius”: “10px”,
“width”: “600px”,
“height”: “175px”,
“font-family”: “Luminari, Papyrus, Brush Script MT”,
“font-size”: “24px”
},
“attributes”: {
“title”: “Parent Container”
},
“children”: [{
“elmType”: “img”,
“style”: {
“width”: “100%”,
“height”: “100%”,
“z-index”: “-3”,
“opacity”: “.5”
},
“attributes”: {
“title”: “Background Image”,
“src”: “=@currentWeb + ‘/SiteAssets/MiddleEarthLocales/’ + [$From.lookupValue] + ‘.jpg'”
},
“children”: [{
“elmType”: “div”,
“attributes”: { “title”: “Column Container” },
“style”: {
“position”: “absolute”,
“width”: “100%”,
“height”: “100%”,
“display”: “flex”
},
“children”: [{
“elmType”: “div”,
“attributes”: {
“title”: “Member/Role DIV”
},
“children”: [{
“elmType”: “img”,
“attributes”: {
“src”: “=replace([$Member.picture], ‘MThumb’, ‘LThumb’)”
},
“style”: {
“height”: “175px”,
“width”: “175px”,
“border-style”: “solid”,
“border-color”: “black”,
“border-width”: “0px 5px 0px 0px”
}
},
{
“columnFormatterReference”: “[$Title]”
}
]
},
{
“elmType”: “div”,
“attributes”: {
“title”: “Text DIV”
},
“style”: {
“padding-left”: “5px”,
“color”: “white”,
“width”: “inherit”,
“text-shadow”: “2px 2px 0 #000000”,
“font-weight”: “bolder”,
“display”: “flex”,
“flex-direction”: “column”,
“justify-content”: “space-between”
},
“children”: [{
“elmType”: “div”,
“style”: {
“font-size”: “1.5em”
},
“txtContent”: “[$Member.title]”
},
{
“elmType”: “div”,
“style”: {
“font-size”: “1.25em”
},
“txtContent”: “=’Age: ‘ + [$Age.displayValue]”
},
{
“elmType”: “div”,
“style”: {
“font-size”: “1.25em”
},
“txtContent”: “=’From: ‘ + [$From.lookupValue]”
}
]
},
{
“elmType”: “div”,
“attributes”: { “title”: “Race/Weapons DIV/Column” },
“style”: {
“width”: “48px”,
“padding”: “5px 5px 5px 0px”,
“display”: “flex”,
“flex-direction”: “column”
},
“children”: [{
“elmType”: “div”,
“attributes”: { “title”: “Race icon DIV/Row” },
“style”: {
“flex-grow”: “1”
},
“children”: [{
“columnFormatterReference”: “[$Race]”
}]
},
{
“elmType”: “div”,
“attributes”: { “title”: “Weapon icons DIV/Row” },
“children”: [{
“columnFormatterReference”: “[$Weapons]”
}]
}
]
}
]
}]
}]
}
}

 


Our adventure draws near its end


Now that we’ve got our view formatted, we’re done, right? We could be, but the list view is off somehow…


 


list-view-complete.png


 


Look at all that empty white space! Such a waste, but showing each item in a row is what the list view does. Sometimes, that may be exactly what you need in some cases but here…we don’t need it.


 


Instead, we can use the “Gallery” (or “Tile)” view, which will display our items in a grid view.


 


We can copy the the schema we’ve already defined, and change the selected layout from “List” to “Gallery”


 


format-options.png


 


After that, we can paste it in, but we’ll need to modify things every so slightly, as the Gallery layout has some additional properties we need to specify. Let’s look at the basic schema for a gallery view.


 


{
“$schema”: “https://developer.microsoft.com/json-schemas/sp/v2/tile-formatting.schema.json”,
“height”: 175,
“width”: 650,
“fillHorizontally”: true,
“hideSelection”: true,
“formatter”: { }
}

Unlike columns and list view formats, the tile schema wants us to specify an exact width and height (in pixels) for each tile. It’s not strictly required, but we’ll want to supply our own values here to ensure that each card has the right dimensions.


 


We’re also using a new property, fillHorizontally, which will ensure that our cards do not overlap one another.


 


Finally, instead of the rowFormatter object we use in List views, we have a simple formatter property for our Tile views.


 


After that, we can simply copy the contents of the rowFormatter property in the list view example and paste them into the new formatter property.


 


Doing that should get us to where we want to be.


 


final-product.png


Prologue


Over the course of two blogs, we’ve covered the basic building blocks of custom column formatting as well as how to customize our list and gallery views. We turned a boring old list of text into far less boring visuals, and then turned those visuals into a “who’s who” of Middle Earth. 


 


And while our journey together might be coming to an end, it doesn’t mean your adventures are over. Take what you’ve learned, go out into the world, and make your lists beautiful!

Help shape the Universal Print roadmap

This article is contributed. See the original author and article here.

The Universal Print team tracks feature requests and ideas for improving Universal Print on the Tech Community at http://aka.ms/UPIdeas. This space allows Tech Community members to contribute new ideas and upvote or provide comments on existing ideas.


The idea board is very important to the Universal Print team. There are so many features we want to add in Universal Print, but we can’t work on everything at the same time. Submitting and upvoting ideas helps us decide what to work on first.


The meaning of the different idea states


The Universal Print team periodically reviews feature requests and assigns or updates the state of each idea. Here is the list of the states and their meaning:



  • New = Not yet reviewed.

  • Looking into it = Being considered.

  • Clarification needed = The Universal Print team needs more information about this idea. 

  • Feedback needed = The Universal Print team wants your feedback on this idea.

  • Planned = On our backlog. Work has not started.

  • In progress = in active development.

  • In progress: partner = Feature will first be available in partner solutions.

  • Duplicate = Another idea post contains this feature.

  • Not planned = We currently have no plans to introduce this feature.

  • Completed = Feature is currently available.


How to effectively use the ideas board


First, please search the idea board to see if the idea or feature request you have has been posted by someone else. If the idea exists, please upvote it. Otherwise, please submit it as a new idea.


When submitting new ideas, submit one post per idea. Posts with multiple ideas tend not to get upvoted and receive less attention.


Always add comments to ideas you submit or upvote. Let us know as much detail as possible about the scenario you would like to enable and the user flow you would like to see.


Providing feedback


Your comments on any of the idea posts are always appreciated. Especially, in the case when the Universal Print team submits an idea and marks it with the state “Feedback needed”. These posts will contain an idea we are investigating or a scenario we want to verify is important to our customers.


Please upvote these ideas if you believe they are important to your organization and leave a comment with any additional suggestions you have. Alternatively, you can comment to let us know why the suggested idea is not important to your organization.


Try it out


Go to http://aka.ms/UPIdeas now to view the list of ideas, upvote the ones you want to see in Universal Print and leave comments with your specific requirements.


By contributing to the idea board, you help shape the future of Universal Print into what you want it to be.


 

Universal Print Lunch & Learn series

This article is contributed. See the original author and article here.

As Universal Print is generally available, we wanted to provide resources to help you get started with using your new subscription benefit. I created a Lunch & Learn video series that walks you through the setup process and provides an overview if you are just getting started.


As a Senior Program Manager in the Microsoft Customer Experience Engineering organization, I work daily with customers that want to set up Universal Print. This series covers a range of topics that these customers want to talk about and that will guide IT administrators in setting up Universal Print for optimal use.


Video topics include:



Each video contains scenarios and screenshots so you can follow along in your setup. Please visit the Universal Print video hub and enjoy—or watch the first video in the series below!


 



And, don’t forget to visit the Universal Print documentation for Universal Print fundamentals. There, you will find overviews, quick starts, licensing information and more.


Let us know what other topics would be helpful to cover so we can add more to our Lunch & Learn series in the future!


 

Friday Five: Azure Event Hubs, Ignite 2021, More!

Friday Five: Azure Event Hubs, Ignite 2021, More!

This article is contributed. See the original author and article here.

1097697_508329329238754_228724685_o.jpg


Build client web apps with “Prolog”


Jun-ichi Sakamoto is a Japanese MVP for Developer Technologies. The 10-time MVP title holder specializes in C#, ASP.NET, Blazor, Azure Web Apps, TypeScript. Jun-ichi’s publication of NuGet packages – like Entity Framework Core, helper, testing tools, Blazor components, and more – have been downloaded more than 18 million times. For more on Jun-ichi, check out his Twitter @jsakamoto


unnamed (1).jpg


How to request to Azure Event Hubs with Apache JMeter™


Kuniteru Asami is an Azure MVP and core staff member of the Japan Azure User Group. Kuniteru has been providing technical consulting for Microsoft Azure for more than 10 years since its initial release. Moreover, the Japanese Azure expert is the CEO of a company with six Azure MVPs on its staff. Follow him on Twitter @kunyami


image.png


Microsoft Ignite 2021: Important Announcements and Updates


Mohamed El-Qassas is a Microsoft MVP, SharePoint StackExchange (StackOverflow) Moderator, C# Corner MVP, Microsoft TechNet Wiki Judge, Blogger, and Senior Technical Consultant with +10 years of experience in SharePoint, Project Server, and BI. In SharePoint StackExchange, he has been elected as the 1st Moderator in the GCC, Middle East, and Africa, and ranked as the 2nd top contributor of all the time. Check out his blog here.


hal.jpg


A Brief MVP Summit History


Hal Hostetler is an Office Apps and Services MVP who has been in the MVP program since 1996. Now retired, Hal is a Certified Professional Broadcast Engineer and remains the regional engineer for Daystar Broadcasting and a senior consultant for Roland, Schorr, & Tower. He lives in Tucson, Arizona. For more on Hal, check out his Twitter @TVWizard


image.png


C#.NET: HOW TO COPY SYSTEM FOLDER(S)


Asma Khalid is an Entrepreneur, ISV, Product Manager, Full Stack .Net Expert, Community Speaker, Contributor, and Aspiring YouTuber. Asma counts more than 7 years of hands-on experience in Leading, Developing & Managing IT-related projects and products as an IT industry professional. Asma is the first woman from Pakistan to receive the MVP award three times, and the first to receive C-sharp corner online developer community MVP award four times. See her blog here.

Microsoft 365 PnP Community Spotlight: David Warner

This article is contributed. See the original author and article here.

Which community project do you maintain? 


 Sharing is Caring 


 


How does it help people?  


 It helps by providing guidance and confidence for community members to know how and where they can get more involved and collaborate. 
 
It is co-maintained by Hugo, Emily and April.
 


 


What have you been working on lately? 


Increasing the session topic spectrum and finding other ways for folks in the community to get involved, no matter what their skill and talent is.  


 


What do you do at work? 


Development and also provide guidance on M365 Architecture 


 


Why are you a part of the M365 community? 


I love the collaborative feeling and inclusiveness within the community. 


 


What was you first community contribution? 


List Formatting definition. Chris was amazing, helpful and supportive. 


 


One tip for someone who’d like to start contributing 


Don’t be afraid to ask others to collaborate. You will be amazed at the new friends you make!