SSW Foursquare

Orphaned Rules - 32 Rules


The rules listed below have no parent category
  1. Do You create a combo-box that has a custom template?

    When designing your form, you should try to help your user whenever it's possible. So it's a good idea to create a combo-box that has a custom template.

    multiplecolumns 1710232021932
    Figure: Good example – Combo-box with custom template

    Feel free to use our sample:

    1. Download and install Kendo UI Controls from Kendo UI
    2. HTML (Razor) - Create a combo-box that has a custom template. Use a code bellow as an example:
    @(Html.Kendo().ComboBoxFor(x => x.EmpTime.ProjectID)
    .AutoBind(true)
    .Suggest(true)
    .Delay(300)
    .DataSource(source => source.Read(read => read.Action("ProjectNameAjaxBind", "Ajax")
    .Data("function() { return {clientId : getClientId()}; }")
    .Type(HttpVerbs.Post)))
    .Height(450)
    .DataTextField("DisplayText")
    .DataValueField("Value")
    .Filter(FilterType.Contains)
    .Template(@"
    <table class='comboBox-Projects'>
    <tr>
    <td class='projectName'>${data.DisplayText}</td>
    <td class='projectTotalCount'>${data.UsedCount}</td>
    <td class='projectLastUsed'>${data.LastUsedText}</td>
    </tr>
    </table>
    ")
    .HighlightFirst(false)
    .IgnoreCase(true)
    .Events(e => e.Change("projectChanged").Open("onProjectOpened"))
    )
    1. CSS - Customize the look & feel to suit your needs. Example:
    #projectsTableBorder {
     border-bottom: 1px solid rgb(217, 217, 217);
     margin: 0 -2px;
     }
     .comboBox-Projects#projectsHeader {
     color: black;
     font-weight: bold;
     margin: 4px 16px 4px 4px;
     }
     .comboBox-Projects td.projectName {
     width: 400px;
     text-align: left;
     }
     .comboBox-Projects td.projectTotalCount {
     width: 70px;
     text-align: right;
     padding-right: 16px;
     }
     .comboBox-Projects td.projectLastUsed { text-align: left; }
     #projectNameHeader:hover, #projectTotalCountHeader:hover, #projectLastUsedHeader:hover {
     cursor: pointer;
     text-decoration: underline;
     }
    1. JavaScript - Use JavaScript to change the combo-box's behavior. Example:
    // resize the drop-down list
    function resizeComboBoxList(comboBoxListId, width) {
     var list = $(comboBoxListId);
     list.width(width);
     var height = list.height();
     list.children("ul").height(height - 25);
    }
    function onProjectOpened() {
     resizeComboBoxList("#EmpTime_ProjectID-list", 600);
    }
    // execute sorting when a header column is clicked
    function onClick_ColumnHeader(senderId, comboBoxId, fieldName) {
     var column = $(senderId);
     column.unbind('click');
     column.click(function() {
     sortComboBoxBy(comboBoxId, fieldName);
     });
    }
    // sort any combo-box based on a field name
    function sortComboBoxBy(comboBoxId, fieldName) {
     var comboBox = $(comboBoxId).data("kendoComboBox");
     var sortDescriptors = comboBox.dataSource._sort;
     var direction = "asc";
     if (typeof(sortDescriptors) != "undefined") {
     var sortDescriptor = sortDescriptors[0];
     if (typeof(sortDescriptor) != "undefined") {
     if (sortDescriptor["field"] == fieldName) {
     if (sortDescriptor["dir"] == "asc") {
     direction = "desc";
     }
     }
     }
     }
     comboBox.dataSource.sort({
     field: fieldName,
     dir: direction,
     });
    }
    // prepare 
    $(document).ready(function() {
     var projectsId = "#EmpTime_ProjectID";
     var projectsListId = projectsId + '-list';
     // prepend header to combo-box list. By default you only get <ul>
     $("
     
    Project Name</td>" +
     "<td id='projectTotalCountHeader' class='projectTotalCount'>Used</td>" +
     "<td id='projectLastUsedHeader' class='projectLastUsed'>Last Used</td>" +
     "</tr></table>" +
     "</div>")
     .prependTo(projectsListId);
     // register click events for each column
     onClick_ColumnHeader('#projectNameHeader', projectsId, "DisplayText");
     onClick_ColumnHeader('#projectTotalCountHeader', projectsId, "UsedCount");
     onClick_ColumnHeader('#projectLastUsedHeader', projectsId, "LastUsedValue");
    });
    });
  2. Do you know how to make lost opportunities more visible?

    Losing opportunities is very common for a business. Keeping track of the win/lost ratio is a good start if you want to track how you're doing, but making sure you keep a close look on what you've lost more important why, is critical.

    The basics

    There are a number of reasons you may lose an opportunity: The project may be cancelled, you may be too expensive or out-sold, or maybe you simply don't have the capacity to cater for bookings.

    If you want to report on lost opportunities, the first step is to make sure Sales have the opportunity to do so. Make sure you provide a field with enough options when closing an opportunity:

    lostoppobad
    Figure: Only giving a couple options is not enough

    lostoppobad
    Figure: Give at least 4 options

    Once the information is stored in CRM, you can then easily report on it, e.g. using PowerBI or any other reporting tool. This provides great insights to make educated business decisions (i.e. "should we hire more?")

    Going the extra mile

    Reporting is great, but this may come back through your feedback loop a bit too late. If you want to be alerted when you just lost a big opportunity because you don't have enough staff, you can go the extra mile and setup alerting based on conditions.

    The best way to do so is to setup a LogicApp to trigger when an opportunity has been lost, setup your filters (e.g. Budget Amount >= $100,000 and Reason = "Not enough staff") and you're done!

  3. Do you disable connections for TFS 2010 migration?

    Once you are ready to start you need to make sure that no one can access the existing TFS 2008 server while you do the migration.

    1. You are ready to start
    2. Send out an email notifying all users that TFS2008 will be turned off. Follow Do you have a server reboot/restart policy?
    3. Make sure no-one can check in files by either: A. Running TFSQuiesce (recommended)

      B. Turning off TFS Service 1. Remote desktop into TFS 2008 2. Start IIS 3. Right click Team Foundation Server | Stop

    StopTFSServices
    Figure: You need to stop anyone checking in files

    1. Confirm you can no longer get latest on the team project
  4. Do you disable connections for TFS 2015 migration?

    It is important that while you're upgrading, nobody can check in. Any check-ins after you backup your database will be lost.

    To make sure that nobody can change anything during the upgrade, follow these steps.

    a. Send out an email notifying everyone TFS will be unavailable for the upgrade period

    b. Make sure nobody can check in files:

    c. Open the TFS Administration Console on the server.

    d. Navigate to Application Tier / Team Project Collections.

    e. For each Team Project Collection, select it, and click "Stop Collection". Enter a useful message (this will be displayed to users trying to connect from Visual Studio) and click "Stop":

    stop each term
    Figure: Stop each Team Project Collection

    all team project
    Figure: All Team Project Collections are stopped

    f. In Visual Studio, confirm you can no longer connect to TFS

    visual studio
    Figure: Visual Studio shows the message that you entered when you stopped the Team Project Collection

  5. Do you avoid 3rd party menus & toolbars?

    The menu & toolbar controls in Visual Studio .NET 2003 do not allow you to have icons in your menus or have alpha-blended toolbar icons. They also do not provide an Office 2003 like look. However, we have tried several third party menu and toolbar controls and all of them had serious bugs. E.g.:

    • DotNetMagic

      • Docking panels didn't implement enough events and it is unclear what the events are doing
      • Menu control is OK
    • DotNetBar
    • Janus Systems

    We love 3rd party controls, a lot of developers spend a lot of time implementing these tools to make their applications sweeter, but we found that there is not enough benefit in implementing these controls.

    I am very keen on 3rd party controls, but only where they add real value. Knowing about Visual Studio 2005 which provides Office 2003 style menus and toolbars with the new ToolStrip control mean I will wait in this case....Another worry is upgrading from these 3rd party controls will be difficult)

    Figure: Visual Studio 2005's new controls

    However, it would be better if VS 2005 stored the details of menus and toolbars in an XML file.

  6. Do you get rid of legacy items in SharePoint Online?

    Most people have now moved to SharePoint Online, either from scratch or by migrating content from previous versions of SharePoint. In SharePoint Online, a lot of legacy features have been deprecated and replaced by more modern counterparts. Unfortunately, chances are you have ported a whole lot of useless things as part of your migration.

    [TODO: Screenshot of Useless stuff]

    Before removing seemingly useless or old stuff, you should always make sure that site owners are OK with the deletion and that the data is actually not useful. In most cases however, the libraries detailed below have been added to your site by default and contain only demo and/or defautl data.

    Process

    The process to remove legacy items is always the same regardless of the library/list you're trying to remove:

    1. Find the product or feature that replaces it in SharePoint Online
    2. Deactivate the site feature associated with the list or library:

    Either manually via:

    Site Settings | Site Features | Feature XYZ | Deactivate

    Or programmatically using:

    # Connect and get context
    Connect-PnPOnline -Url https://contoso.sharepoint.com
    
    # Get Feature Object
    $Feature = Get-PnPFeature -Scope Web -Identity $FeatureId #Feature IDs below
     
    # Get the Feature status
    If($Feature.DefinitionId -ne $null)
    {    
        # De-activate the Feature
        Disable-PnPFeature -Scope Web -Identity $FeatureId -Force
    }
    Else
    {
        Write-host -f Yellow "Feature is not active!"
    }
    1. If feature is already disabled or if SharePoint throws an error on deactivation (can happen for very old features), perform a forced delete of the library using powershell.
    # Connect and get context
    Connect-PnPOnline -Url https://contoso.sharepoint.com
    $ctx = Get-PnPContext
    
    # Get list object
    $list = $ctx.Web.Lists.GetByTitle("Library_To_delete")
    
    # Force delete (send to recycle bin)
    $list.AllowDeletion = $True
    $list.Update()
    $ctx.ExecuteQuery()
    $list.Recycle() | Out-Null 
    $ctx.ExecuteQuery()

    MicroFeed

    Microfeed has been replaced in SharePoint by Yammer webparts and is no longer supported.

    Associated Site feature to disable: "Site Feed" GUID: 15a572c6-e545-4d32-897a-bab6f5846e18

    Announcements

    Annoucements are now replaced by the news webparts [TODO: Link to news webpart doc]

    Associated Site feature to disable: "Announcement Tiles" GUID: 00bfea71-d1ce-42de-9c63-a44004ce0104

    Workflow Tasks

    SharePoint Worklow are deprecated and replaced by Power Automate [TODO:link to rule to PowerAutomate]

    Associated Site feature to disable: "Workflow Task" GUID: 57311b7a-9afd-4ff0-866e-9393ad6647b1

    Drop-Off Library

    Drop-Off Library is not deprecated in SharePoint Online explicitely, however it is considered best practice to user Power Automate to achieve the same results with much greater flexibility and maintainability.

    Associated Site feature to disable: "Content Organizer" GUID: 7ad5272a-2694-4349-953e-ea5ef290e97c

  7. Do you know the difference between a 'smart' and a 'clever' developer?

    When we first start out as a developer, we want to show the world what we can do by creating complex solutions. As we gain experience, we learn to show our worth by creating simple solutions.

    Developers are like a fine wine, they get better with age.

    Lets take this piece of code as an example:

    <span className="text-xl">
        {
            targetedDays === 0 ? "Today" : 
            targetedDays === -1 ? "Yesterday" : 
            targetedDays === 1 ? "Tomorrow" : 
            moment().add(targetedDays, 'days').format("dddd D MMMM YYYY")
        }
    </span>

    One liner! Nailed it 🥳 Pity the next developer who has to decipher what is going on! The cognitive load here is really high! and the the maintainability, is really low. What is the first thing you are going to need to do if this piece of code start behaving poorly?

    Now lets take the following reformatted code example:

    const getTargetedDayAsText = (targetedDays) => {
      if (targetedDays === -1) {
        return "Yesterday";
      } elseif (targetedDays === 0) {
        return "Today";
      } elseif (targetedDays === 1) {
        return "Tomorrow";
      } else {
        let days = moment().add(targetedDays, 'days');
        let formatted = days.format("dddd D MMMM YYYY");
        return formatted;
      }
    }
    
    <span className="text-xl">
        {getTargetedDayAsText(targetedDays)}
    </span>

    Now this is nowhere near as terse, but anyone looking at it is able to quickly determine what is going on. And anyone who has to investigate any issue with the code is going to be able to step through and debug this without any issues.

    This above is not an overly complicated example but now imagine something like this example

    var pixelsQuery =
        from y in Enumerable.Range(0, screenHeight)
        let recenterY = -(y - (screenHeight / 2.0)) / (2.0 * screenHeight)
        select from x in Enumerable.Range(0, screenWidth)
               let recenterX = (x - (screenWidth / 2.0)) / (2.0 * screenWidth)
               let point =
                   Vector.Norm(Vector.Plus(scene.Camera.Forward,
                                           Vector.Plus(Vector.Times(recenterX, scene.Camera.Right),
                                                       Vector.Times(recenterY, scene.Camera.Up))))
               let ray = new Ray() { Start = scene.Camera.Pos, Dir = point }
               let computeTraceRay = (Func<Func<TraceRayArgs, Color>, Func<TraceRayArgs, Color>>)
                (f => traceRayArgs =>
                 (from isect in
                      from thing in traceRayArgs.Scene.Things
                      select thing.Intersect(traceRayArgs.Ray)
                  where isect != null
                  orderby isect.Dist
                  let d = isect.Ray.Dir
                  let pos = Vector.Plus(Vector.Times(isect.Dist, isect.Ray.Dir), isect.Ray.Start)
                  let normal = isect.Thing.Normal(pos)
                  let reflectDir = Vector.Minus(d, Vector.Times(2 * Vector.Dot(normal, d), normal))
                  let naturalColors =
                      from light in traceRayArgs.Scene.Lights
                      let ldis = Vector.Minus(light.Pos, pos)
                      let livec = Vector.Norm(ldis)
                      let testRay = new Ray() { Start = pos, Dir = livec }
                      let testIsects = from inter in
                                           from thing in traceRayArgs.Scene.Things
                                           select thing.Intersect(testRay)
                                       where inter != null
                                       orderby inter.Dist
                                       select inter
                      let testIsect = testIsects.FirstOrDefault()
                      let neatIsect = testIsect == null ? 0 : testIsect.Dist
                      let isInShadow = !((neatIsect > Vector.Mag(ldis)) || (neatIsect == 0))
                      where !isInShadow
                      let illum = Vector.Dot(livec, normal)
                      let lcolor = illum > 0 ? Color.Times(illum, light.Color) : Color.Make(0, 0, 0)
                      let specular = Vector.Dot(livec, Vector.Norm(reflectDir))
                      let scolor = specular > 0
                                     ? Color.Times(Math.Pow(specular, isect.Thing.Surface.Roughness),
                                                   light.Color)
                                     : Color.Make(0, 0, 0)
                      select Color.Plus(Color.Times(isect.Thing.Surface.Diffuse(pos), lcolor),
                                        Color.Times(isect.Thing.Surface.Specular(pos), scolor))
                  let reflectPos = Vector.Plus(pos, Vector.Times(.001, reflectDir))
                  let reflectColor = traceRayArgs.Depth >= MaxDepth
                                      ? Color.Make(.5, .5, .5)
                                      : Color.Times(isect.Thing.Surface.Reflect(reflectPos),
                                                    f(new TraceRayArgs(new Ray()
                                                    {
                                                        Start = reflectPos,
                                                        Dir = reflectDir
                                                    },
                                                                       traceRayArgs.Scene,
                                                                       traceRayArgs.Depth + 1)))
                  select naturalColors.Aggregate(reflectColor,
                                                 (color, natColor) => Color.Plus(color, natColor))
                 ).DefaultIfEmpty(Color.Background).First())
               let traceRay = Y(computeTraceRay)
               select new { X = x, Y = y, Color = traceRay(new TraceRayArgs(ray, scene, 0)) };
    
    foreach (var row in pixelsQuery)
        foreach (var pixel in row)
            setPixel(pixel.X, pixel.Y, pixel.Color.ToDrawingColor());

    This was fortunately just someone's exercise in proving that they could and happily states

    Just because you can, doesn't mean you should!

    So what are some of the things that developers learn over time that takes them from being a Clever developer to being a Smart developer?

    Avoiding problems

    Clever developers fix a problem where Smart Developers stop a problem from happening.

    Lets say you receive a PBI saying that XYZ method is always returning a value 0.001 more than it should.

    Smart Developer

    Identifies that some incoming data is always out and results in the small rounding issue.

    return (value-0.001) 

    Clever Developer

    Identifies that a method downstream is rounding to 2 decimal places and removes this.

    Understanding the whole before they start

    Code costs money, not just to create but also to maintain.

    Figure: Clever developer coding away and resolving PBI's

  8. Do you know which check-in policies to enable?

    Check-in policies are a great tool to enforce quality code before it hits your source control repository. SSW recommends that the following check-in policies be enabled by default on your project:

    1. Changeset Comments Policy - To enforce that all check-in contain comments
    2. SSW Code Auditor - To enforce coding standards and best practices before check-in
    3. Testing Policy - To enforce that unit tests should all pass before code can be checked-in
    4. Code Analysis Policy – To enforce that code analysis rules are not broken
    5. Builds Policy – To enforce that the developer has built the project end to end before they check-in

    More Information

    To enable these policies:

    1. Right click the Team Project in Team Explorer > Team Project Settings > Source Control
    2. Select the check-in policies above
    3. Click OK

    SC TFSCI
    Chose check in policy
    Figure: Chose check-in policies in TFS

  9. Do you look for call back over event handlers?

    [bad code]

    [good code]

  10. Do you look for memory leaks?

    a. These could be in the UI and middle level tiers

    b. There are common patterns for memory leak, e.g. proxy to WCF [code]

    e.g RIA service [code]

    e.g. Load +=     (9 out of 10 people will forget to remove their statement)

    Google: Common Memory Leak
    [bad code]

    [good code]

  11. Do you make business travel easier?

    In our fast-paced work environment, it is crucial to get to client sites or attend meetings efficiently. However, managing the associated expenses can often be a time-consuming and challenging task.

    When staff need to travel, they normally need to follow the company’s standards and keep physical or virtual records including approvals or tax invoices. It may take 10 minutes to finish the paperwork and could be worse if the tax invoices are lost. Is there an easier way?

    Traditional method (collecting physical tax invoices)

    Some companies may ask employees to get a physical tax invoice and get it reimbursed through the finance team.

    ✅ Pros:

    • No additional system is required

    ❌ Cons:

    • Hard to manage – Approval may get lost, and tax invoices can be missing, or duplicated
    • Out of pocket – It may take days to have the reimbursement processed and paid
    • Heavy admin – Managing paperwork is time-consuming and relies on human resources

    Expense management system

    Software can be used to get expenses approved, paid and reimbursed.

    E.g. Xero Me, the Best Mobile App for Expenses.

    ✅ Pros:

    • Less admin – Expense claims can be processed easily in the cloud
    • Efficient reimbursement – Can be reimbursed anytime, anywhere

    ❌ Cons:

    • Risk of not being paid - If the tax invoices are missed or forgotten
    • No analysis tool – Hard to have insights into the expenses

    Business travel 1
    Figure: Bad example - Trying to find taxi receipts and how to get them reimbursed

    Taxi corporate account

    Business users can set up a corporate account that manages travel expenses with a few clicks, or offer employees a digital pass with a prepaid budget. E.g, 13 Cabs for business.

    ✅ Pros:

    • Safe and secure – Taxis usually provide a level of safety and professionalism
    • Cloud-based dashboard – Easy to manage multiple bookings at once and pay with a corporate account or passengers themselves
    • Customized Pass – Digital or physical pass that has customisable travel rules

    ❌ Cons:

    • Cannot be used overseas – The operating area of taxi companies are often limited
    • Not flexible enough – May require admin to book the taxi for the passengers or the passengers are pre-approved to travel within the area

    Uber for Business is a powerful tool that allows employees to use Uber services including ride or food delivery if they meet certain rules predefined by the business. This is done by adding a business profile to a new or existing Uber account, so the users have the option to pay with their business profile. It offers employees a simplified business travel experience because all the charges and invoices go to the business directly.

    ✅ Pros:

    • Centralized dashboards - Real-time visibility, and control over all business rides. No more guesswork or manual tracking
    • Global service – Travelling to New York or Tokyo? All are covered in one program
    • Customization - Businesses can set pending limits, specify eligible ride types, define other parameters, and manage the access of employees at any time
    • No misuse - Uber for Business forces the user to switch back to their personal profile if they go to a location that has not been pre-approved (see permitted locations in the figure below)
    • Ride and meal vouchers - Businesses are able to create customised vouchers that can be shared and applied at checkout

    Business travel 2
    Figure: Predefined rules that allow staff travelling to and from airports and within ACT

    ❌ Cons:

    • Forced to go with Uber – People may have personal objections to Uber
    • Safety and user experience – Generally, shared ride service provides less professionalism and safety compared to taxi services

    Business travel 3
    Good example - Using Uber for Business by a simple toggle of a button

  12. Do you label buttons to be an action, like "Save, "Open", etc?

    If your form has an "OK" button it should be renamed to be as an action verb. For example: Save, Open, etc.

    vstoolsoptions
    Figure: Bad example - "OK" button which is not an action

    skypetoolsoptions
    Figure: Good example - "Save" button which is an action

    We have a program called SSW Code Auditor to check for this rule.

  13. Do you save user settings and reuse them by default?

    There should always be default values in your application if you allow users to change the settings. This will help your users to have a better first time experience and insure the application work as expected.

    However when the users change settings for their own preference, it is better to save these settings and give user has a better return experience, your application looks smarter in this way.

    defaultvalue
    Figure: Save user setting

  14. Do you have colons beside labels on input controls (Textbox, Combobox, Datetime, etc.)?

    Use colon with your labels.

    Figure: Label with colon

  15. Do you include "Back" and "Undo" buttons on every form?

    Following on from including a URL, almost every form should have a Back and an Undo button which takes you back to the previous screen, or reverses the last action. This is just like Outlook (see figure below), it has a Back button to take you to the previous folder and an Undo button.

    outlookviewbar
    Figure: Good example - Back & Undo buttons in Outlook Advanced toolbar

    Notes:

    • "Back" button should only be implemented if different views can be shown in the same window
    • Don't put "Undo" buttons on non data entry forms such as a Print Preview form

    The list of forms/URLs and the order in which they have been accessed should be stored in a DataSet held in memory (like IE) - not saved to disk.

    For example:

    Menu Action Undo Back
    Cut Remember: Remember Text and Cursor Position
    Cut To Clipboard
    Return to Remember n/a
    Save Record Remember old values
    Execute procCustomerSave
    Close Form
    Return to Old values Reopen form

    Sample code implementation in the SSW .NET Toolkit.

  16. Do you keep yourself connected when travelling overseas?

    Ensuring seamless connectivity during international travel is a crucial consideration, especially on business trips. While obtaining a roaming package from your service provider is a common solution, you might face exorbitant bills upon returning home.

    The question arises: How can one stay connected without the risk of huge bills?

    There are few options:

    If you travel overseas a lot, it may be worth considering owning a dual-SIM phone. This is highly recommended due to its cost-effectiveness, easy management, and enhanced security.

    Take the popular iPhone as an example, which offers an eSIM and a physical SIM slot. You can convert your primary mobile number to an eSIM and keep the physical SIM slot for your travel SIMs.

    • ✅Travel SIMs are usually data-only, cheap, and easy to acquire.
    • ✅Travel SIMs can be pre-purchased weeks before you go – it is only activated once you connect it to the network.
    • ✅Your mobile number is still active when overseas (with your eSIM) and the data usage stays with the travel SIMs.

    2. Portable 4G Router:

    Invest in a device, insert the local travel SIM, and share the Wi-Fi with multiple users and devices.

    • ✅This option proves cost-effective, preserves your phone's battery life and is perfect for single-SIM phones.
    • ❌You will need to carry an extra device.
    • ❌You may miss out on free Wi-Fi – the router is connected by Wi-Fi so you cannot connect to others, for example, hotels.

    3. Roaming package:

    Rely on your current roaming service, for example, Telstra charges $10 per day for 1 GB of data and $10 per extra GB. Some other carriers may offer more competitive packages.

    • ✅This method is straightforward, with no additional purchases, and a pay-as-you-go structure.
    • ❌This can be expensive and occasionally poor internet connectivity.

    Summary

    Each option has its pros and cons, allowing you to tailor your connectivity strategy based on your preferences and specific travel needs.

    Travel SIMs usually offers better user experience if you spend more data.

    • ✅Travel SIMs are usually much cheaper than roaming packages.
    • ✅They are prepaid and disposable.
    • ✅ It can be a perfect combination with your roaming service to have enough cheap data to use and make calls from your roaming service. Of course, you will have your regular mobile connected as well, so you won’t miss the important calls and text messages.
    • ❌Often limited to data only and will expire after a certain period.

    keep yourself connected 1
    ❌ Bad Example - Exorbitant Telstra bills upon returning home due to roaming data usage of 120 GB.

    keep yourself connected 2
    ✅ Good Example - Paying $129 AUD for 200 GB of data on a travel SIM to Europe.

    Tip: travelling to China can be different due to the Great Firewall, which prevents you from accessing Google, Facebook, Teams etc. It may require a VPN to access these services from a local network. But the travel SIMs purchased outside of China or roaming mobile data packages have no restrictions because your IP is where the SIMs are registered.

  17. Do you know when to use an on-premises build server with Azure DevOps?

    If you are using Azure DevOps, there's an awesome Hosted Build Server option you can use to perform your builds with little to no setup. But if you're working on a project that has continuous integration and a long build time, it's not long before those build minutes start to add up.

    To reduce your build costs, you could reduce the number of builds or try to reduce the build time. Continuous integration is very important so you don't want to turn that off, and we encourage checking in early and often. Reducing the build time is a nice idea, but you can't always reduce it enough to make a difference.

    For large, expensive projects, the best option is to configure an on-premises build server rather than using hosted builds.

    To configure an on-premises build server for Azure DevOps, check out Anthony Borton's great walkthrough.

    Once you have a build server configured, you'll be able to see the build controller as an option when you configure a new build definition.

    vso build
    Figure: Good Example - We have the option of an on-premises build controller as well as the Hosted Build controller

  18. Do you know the relevant Power Platform certifications and associated exams?

    Whether you're an expert or just getting started, working towards gaining a new certification is a worthwhile investment.

    Microsoft provides numerous certifications and training options to help you:

    • Learn new skills
    • Fill technical knowledge gaps
    • Boost your productivity
    • Prove your competence

    certification map
    Figure: Microsoft Certification RoadMap


    Fundamentals

    If you're just getting started, take a look at:

    Microsoft Certified: Power Platform Fundamentals

    Earn this certification to prove you have a foundational knowledge of the Power Platform.

    You will need to pass Exam PL-900: Microsoft Power Platform Fundamentals.


    Associate

    Once you've mastered the fundamentals, developers should move on to:

    Microsoft Certified: Data Analyst Associate

    Earn this certification to prove you have skills and knowledge in data processing and storage.

    You will need to pass Exam DA-100: Analyzing Data with Microsoft Power BI.

    Microsoft Certified: Power Platform Functional Consultant Associate

    Earn this certification to prove you can build solutions on the Power Platform using low code or no code solutions.

    You will need to pass Exam PL-200: Microsoft Power Platform Functional Consultant.

    Microsoft Certified: Power Platform Developer Associate

    Earn this certification to prove you can design, develop, secure and extend Microsoft Power Platform solutions.

    You will need to pass Exam PL-400: Microsoft Power Platform Developer.

    Microsoft Certified: Power Platform App Maker Associate

    Earn this certification to prove that as a business stakeholder you can engage well with Power Platform developers to design and specify business automations.

    You will need to pass Exam PL-100: Microsoft Power Platform App Maker.

    Microsoft Certified: Dynamics 365 Business Central Functional Consultant Associate

    Earn this certification to prove you have a solid knowledge of Dynamics 365 Business Central.

    You will need to pass Exam MB-800: Microsoft Dynamics 365 Business Central Functional Consultant.


    Specialty

    Microsoft Certified: Customer Data Platform Specialty

    Earn this certification to prove you understand using the Power Platform to manage customer retention, improve customer experiences.

    You will need to pass Exam MB-260: Microsoft Customer Data Platform Specialist.


    Expert

    Microsoft Certified: Power Platform Solution Architect Expert

    Earn this certification to prove you have a foundational knowledge of the Power Platform.

    You will need to pass Exam PL-600: Microsoft Power Platform Solution Architect

    and complete one of

    Microsoft Certified: Power Platform Functional Consultant Associate

    OR

    Microsoft Certified: Power Platform Developer Associate.


    screen shot 2022 01 06 at 10 17 14 pm
    Figure: Get the poster to see Microsoft's certifications

    Check the Become Microsoft Certified poster for details of exams required for each of the certifications.

    Preparing for exams can involve a lot of work, and in some cases stress and anxiety. But remember, you're not in school anymore! You've chosen to take this exam, and no one is forcing you. So just sit back and enjoy the journey - you should feel excited by the new skills you will soon learn. If you want some great advice and tips, be sure to check out Successfully Passing Microsoft Exams by @JasonTaylorDev.

    Good luck!

  19. LinkedIn - Do you know how to reply to company messages on LinkedIn?

    Responding to messages from the general public and clients on social media is an integral part of maintaining a company's online presence and reputation. Platforms like LinkedIn, Meta (Facebook, Instagram, WhatsApp), X (formely Twitter) and others provide different avenues for these interactions.

    Focusing primarily on LinkedIn, this rule outlines how to effectively manage and respond to messages ensuring that the conversation aligns with the utility and purpose of the feature.

    LinkedIn Company Pages

    When messaging for your Page is enabled on LinkedIn, members can directly communicate with your company. This feature is a powerful tool for engaging with a professional audience, allowing for direct interaction and networking. And the best part? You can select conversation topics 😃

    The reply feature plays a pivotal role in managing LinkedIn communication and interactions if your businesses frequently receive inquiries from clients, potential employees, and partners.

    How to Enable Messages for LinkedIn

    To enable messages for your Page:

    1. Go to your Page super or content admin view.
    2. Click Inbox in the left menu.
    3. Click the three dots (more icon) to the right of Inbox.
    4. Select Inbox settings from the dropdown menu.
    5. Turn on the Message button toggle on the right and select relevant conversation topics.

      linkedin more
      Figure: Inbox settings screen.

    6. Click Save in the upper-right corner.

    Key Aspects of the Reply Feature

    Here are some keys reasons why you should consider implementing the LinkedIn reply feature.

    Pre-set Responses: Setting up pre-written responses to common inquiries relating to conversation topics such as requesting a demo, careers, service request and gneralt support.

    Common Questions: For frequently asked questions based on the above conversation topics, automated replies provide instant information, improving the user experience and reducing the inital workload on your team.

    Conversation Topics: On platforms like LinkedIn, automated replies can be aligned with selected conversation topics, ensuring relevance in responses.

    Time-Saving: It significantly reduces the time spent on repetitive queries, allowing your team to focus on more complex inquiries that require personalized attention.

    Customer Experience: Immediate responses to inquiries, even if automated, enhance the customer experience, as users receive prompt acknowledgments and information.

    Best Practices for LinkedIn Messaging

    • Assign the Right Admin Roles: Ensure that individuals with the 'super' or 'content admin' role are equipped to reply to messages. This is particularly important for specific conversation topics, like "Careers," where subject matter experts should manage interactions.
    • Prompt Responses: Aim to reply to messages as quickly as possible to maintain engagement and show that your company values the interaction.
    • Setting Up Conversation Topics: When enabling messaging, select conversation topics that reflect the subjects you want members to inquire about. This helps in guiding the conversation and ensuring relevance.
    • Edit Conversation Topics for Accuracy: Modify the topic of a message to accurately reflect its content. This aids in organizing and filtering conversations in your inbox.
    • Option to Disable Messaging: If necessary, you can disable the messaging feature from your inbox settings. This removes the "Message" button from your Page and stops new messages from members.

    Ensure that your LinkedIn Page messaging reflects your company's voice and expertise, and that it's managed by knowledgeable team members.

    Meta: Limited Engagement

    Meta's tools are particularly effective for businesses targeting a demographic that is highly engaged on social media, especially for consumer-focused interactions.

    However, for B2B communications or audiences less active on social platforms, the utility of Meta's messaging features is limited.

    X: An Alternative Approach

    X offers messaging features that might provide alternative advantages for certain business communications. It's crucial to evaluate how user demographics align with your company's goals and target audience.

    If your business caters to a more professional or niche market, X is a great tool for targeted B2B communications or reaching specific customer segments.

  20. Do you know when to use scoped CSS?

    On large frontend projects with lots of components it's common to have issues with your CSS classes overwriting each other or conflicting. There are a few different ways to solve this.

    It can be very frustrating when CSS classes overwrite and behave differently to how we want them to.

    overwritten style
    Figure: Overwritten CSS can make our site styles break

    Debugging this can be a nightmare on larger projects with huge amounts of styling as you need to comb through the entire file to find what's overwriting the style.

    h1 {
      color: red;
    }
    
    /* 3000 more lines of code... */

    Utility Classes

    One solution to this problem is using a CSS framework such as Tailwind.

    Benefits

    • Faster setup
    • Simple to use
    • Faster development speed once devs are familiar with it

    Disadvantages

    • Poor readability as you add more classes
    • Learning curve for class names

    Scoped CSS

    Most frontend frameworks such as Blazor, Angular and React support scoped CSS, allowing you set CSS classes on a component level.

    When you create a scoped CSS file, those classes are only accessible to the component that the CSS file is associated with.

    This is useful as you don't need to worry about class names or CSS values conflicting with eachother like you would if all the classes are set at the root level. It also makes it much easier to change styling on individual components without breaking the styling on other classes.

    Benefits

    • Can reuse class names in each component without conflicts

    Disadvantages

    • Styles have to be manually written

    Blazor

    In Blazor scoped CSS files are associated with components with dot syntax.
    For example, if we have a component called MyComponent.razor, we can create a file called MyComponent.razor.css and the classes set in that file will only apply to MyComponent.

    Inheritance

    Blazor supports having scoped CSS classes inherited by child components.

    <MyComponent>
      <MyChildComponent />
    </MyComponent>

    In MyComponent.razor.cs, if we use the ::deep psuedo selector on a class, it will be applied to MyChildComponent.

    ::deep .myClass {
      /* Styling goes here */
    }

    Blazor CSS Isolation - Microsoft Docs

    Angular

    When you create a component in Angular, a scoped CSS file is automatically created for it along with the HTML and TypeScript files.

    myComponent
    |- myComponent.component.html
    |- myComponent.component.css
    |- myComponent.component.spec.ts
    |- myComponent.component.ts
    Inheritance

    Angular also offers the ::ng-deep pseudo selector, but there are some considerations when using this.

    Component Styles - Angular Docs

    React

    We can achieve local, component-level styles in React by using importing from a file ending in module.css:

    /* component.module.css */
    
    .heading {
      font-weight: 700;
    }
    import styles from "component.module.css";
    
    const Component = () => {
      return (
        <h1 style={styles.heading}>Bold Heading Here</h1>
      )
    }

    This will then render the element with a component specific class, differentiated from other .heading elements:

    <h1 class="Component_heading__nEBhk">Bold Heading Here</h1>
  21. Do you add branding to screenshots?

    It is great when people use screenshots. You can communicate better by using screenshots with balloons and other visual elements (arrows, shapes, and highlights) instead of only text. Read the benefits of using screenshots.

    We recommend you define a standard style for your visual elements by changing the default colors and shapes according to your branding.

    See some examples of different visual elements under same branding:

    screenshot1
    Figure: Indicate someone to enter the mobile field. Do you use a red arrow?

    screenshot2
    Figure: Or do you like the red box?

    screenshot3
    Figure: Or do you like the yellow highlight?

    More Information on SSW Branding

    You can automatically have the SSW Snagit presets on sign-in via a script.

    Instructions to create and use Snagit themes can be found at Quick Style Themes Tutorial.

  22. Do your payslips show Certification Rewards?

    Encouraging professional development and recognizing achievements are crucial for fostering a positive workplace culture. SSW's Certification Reward system is a testament to this, offering additional leave to employees who complete Microsoft certifications. This initiative not only motivates employees to pursue further learning but also highlights the company's commitment to staying at the forefront of technology.

    Understanding Certification Rewards

    Certification Reward is a special category of leave granted to employees as a form of recognition for their effort and time invested in completing Microsoft certifications. Here's how it works:

    1. Award Criteria: Employees become eligible for a Certification Reward upon successfully completing a Microsoft certification
    2. Visibility and Tracking: A distinct leave category should be used within your accounting system specifically for Certification Reward

    Not a Fairwork Mandate

    It's important to note that the Certification Reward is not mandated by Fairwork. Instead, it's a proactive approach to incentivize its team members to engage in professional development, specifically around Microsoft technologies. This strategic focus not only enhances individual skill sets but also elevates the collective expertise within the company, ensuring you remain competitive and innovative in delivering solutions.

    The Certification Reward system exemplifies how valuing and investing in employees' growth can create a dynamic and forward-thinking workplace culture. It's a clear win-win: employees expand their expertise, and strengthens your company's capability to deliver cutting-edge solutions.

  23. Do your payslips show Long Service Leave?

    Long Service Leave (LSL) is an essential benefit for employees, recognizing their dedication and long-term commitment to a company. Many accounting solutions do not automatically calculate LSL provisions. This lack of automation can lead to transparency issues, as employees may find it difficult to track their LSL balances. Furthermore, the legislation governing LSL varies significantly across regions, adding an extra layer of complexity. For instance, the provisions in Victoria differ from those in New South Wales, necessitating a tailored approach for businesses operating in multiple states.

    Adhering to Varied Legislation

    The Challenge: The rules surrounding LSL are not uniform across all states and territories in Australia, making compliance a tricky affair for businesses operating in multiple locations.

    Solution: To navigate this complexity, businesses must:

    • Stay informed: Keep abreast of the LSL legislation in each state or territory where the company operates
    • Tailor payslip information: Customize the payslip information to reflect the specific LSL provisions applicable to each employee, based on their work location

    Visibility of Long Service Leave

    The Challenge: Employees deserve and need clear visibility of their LSL accruals to plan their future and feel secure in their employment benefits. The absence of this information can lead to confusion and dissatisfaction.

    Solution: Even if your accounting solution doesn't automatically calculate LSL, businesses must find a workaround to ensure this information is transparent and accessible to all employees. This might involve:

    • Manual calculations: Regularly update LSL accruals and ensure they are clearly stated on employee payslips
    • Use of supplementary tools: Consider leveraging third-party solutions to manage LSL calculations and display them on payslips

    bad example lsl
    Figure: Bad example - Employees have to ask HR for their LSL balance, leading to a backlog of inquiries

    good example lsl
    Figure: Good example - LSL balances are updated regularly and displayed on every payslip

    Ensuring employees have visibility of their LSL balances is not just about compliance; it's about valuing your workforce and their contribution to your company. Despite the technical limitations of some accounting tools, with a proactive and informed approach, businesses can provide their employees with the transparency they deserve and ensure compliance across different legislative landscapes.

  24. Do you streamline your development process with NPM and Task Runners?

    The current trend in web development is to use a large range of front-end libraries to give a great user experience.

    However, .NET devs know it is no easy task to manage all of these on top of a large script folder. Previously we tried to improve and streamline the process by using NuGet, but found this package manager was ill-suited.

    Another issue was that due to the requirement of checking the library’s files into source control, this has the potential to grind fellow devs to a halt while Visual Studio tries to make sense of the myriad of small JavaScript files. Furthermore, there were many smaller tasks that needed to be completed, such as minification and bundling. In the older versions of Visual Studio, a large portion of these tasks had be performed manually by the developer.

    Needless to say, however a developer could try to tackle this task, it was always a challenging and time consuming endeavour.

    Enter Visual Studio 2015 with NPM (Node Package Manager) in-built. This package manager has been built from the ground up to make downloading your JavaScript libraries simple. These tools existed outside of the .NET space, but in 2015 they’ve been brought into the fold and made easy to use in Visual Studio 2015.

    With NPM, we specify the name of the package and the version number we want to use, and the tool does all of the hard work finding and downloading the library. Because NPM is run on each developer’s machine, libraries are no longer added to source control. Rather, they are quickly downloaded from the trusted NPM CDN.

    npm action
    Figure: Example of NPM in action

    Working in tandem with NPM are task runners, which are JavaScript tools that can be used to add automation to your project by having them perform simple yet tedious tasks that are required to get your libraries ready for use, such as compilation, linting, and minification. Just use NPM to install the task runner of your choice, and away you go.

    There are a heap of different task runners out there, the two best known are Gulp and Grunt.

    gulp
    Figure: In short they both perform the same job but Gulp is faster and requires less configuration

    For example, we could previously use web essentials to do a lot of the necessary bundling and automation, but this was killed off at the start of 2015.

    2015 web essentials
    Figure: The updated feature list for Web Essentials 2015

    This key feature was removed, but with the addition of tasks runners to Visual studio 2015 we can reimplement the functionality, by using ether Gulp or Grunt. For a number of reasons, Gulp is the better choice over Grunt: seen below is an example of a task for Gulp that will compile .less to .css.

    var gulp = require('gulp');
    var less = require('gulp-less');
    var path = require('path');
    var plumber = require('gulp-plumber');
    gulp.task('less', function () {
        return gulp.src('./Content/**/*.less')
        .pipe(plumber())
          .pipe(less({
              paths: [path.join(__dirname, 'less', 'includes')]
          }))
          .pipe(gulp.dest('./content/'));
    });

    Source: Gulp 101 - Getting LESS Up and Running in Visual Studio 2015

  25. Do you know where to add style files for deployment?

    When a designer (or a developer) adds style (CSS) files to SharePoint - care must be taken regarding where the files are placed:

    • Some places are are not suitable because they are not good for deployment
    • Other places may have permission issues - designers can't access them
    • Some files are part of the site definition and should not be customized

    So the rules are:

    1. Never modify out of the box SharePoint files in /Style Library/ - those files are part of the site definition, if you customize them they are hard to deploy
    2. Start with a clean, minimal masterpage
    3. Create and reference your own CSS files and put them under /Style Library/CSS/<client>/
    4. You may want to further divide your CSS paths according to the areas of the site that your CSS is designed for:

      E.g. /Style Library/CSS/SSW/Clients/layout.css

    5. Designers can modify the XSL file as well!

      put them under /Style Library/XSL Style Sheets/<client>/

  26. Do you record a summary of Sprint Reviews for the stakeholders?

    Creating a comprehensive summary and recording of Sprint Reviews is a great way to communicate changes in a Product to the community and stakeholders. Especially for people who are unable to attend these meetings.

    Why Create a Summary and Recording?

    1. Enhanced Clarity and Transparency: Provides a clear, accessible update for all stakeholders, including those not present.
    2. Documentation for Future Reference: Serves as a historical record of decisions and discussions, valuable for future sprints and project continuity.
    3. Inclusive Stakeholder Engagement: Ensures that all stakeholders, regardless of their availability to attend, have access to the same information, promoting inclusiveness and alignment.
    4. Community Engagement: Allows the community at large to see what is happening on a product and provide feedback.

    Best Practices for Effective Summaries and Recordings

    Preparing the Summary

    • Highlight Key Points: Focus on decisions made, goals achieved, and major discussions.
    • Use Clear, Concise Language: Ensure that the summary is easily understandable, avoiding technical jargon where possible.
    • Include Actionable Items: Clearly note any action items or decisions that require follow-up.
    • Keep it Generic: Viewers might not have the same context of the Product, so try to present PBIs as though the viewers do not have prior knowledge.

    Runsheet

    Here's a suggested runsheet for what to cover in the video:

    1. Show the Product website
    2. Run through Sprint Review Email
    3. Run through Sprint Planning Email
    4. Finish on the Product YouTube Channel

    Making the Recording

    • Ensure Good Audio Quality: Use a decent microphone and test audio levels before starting.
    • Capture Visuals: Record the screen or presentation to provide context to the discussions.
    • Keep it Engaging: Even though it’s a recording, try to keep the delivery lively and engaging to maintain viewer interest.

    Utilizing Modern Tools for Recording and Editing

    Using Microsoft Teams Record Feature

    • Start Recording: Utilize the built-in recording feature in Microsoft Teams to capture both audio and video of the Sprint Review.
    • Notify Participants: Always inform participants that the session is being recorded, ensuring compliance with privacy policies.

    Editing with ClipChamp

    • Import the Recording: Once the meeting is over, download the recording and import it into ClipChamp.
    • Edit for Clarity: Trim unnecessary parts, highlight key moments, and add titles or transitions to enhance viewer understanding.
    • Use a consistent professional thumbnail: Get the design team to make you a nice thumbnail to use for your Sprint Reviews so that it looks professional.
    • Export and Share: Once edited, export the final video and consider uploading it to a platform like YouTube for easy access and sharing within your organization.

    Examples of Good vs. Bad Practices

    "Simply jotting down a few notes or making a low-quality audio recording on a phone."

    Figure: Bad example - Inadequate details and poor audio quality can lead to misunderstandings and disengagement

    "Preparing a structured document that highlights all key outcomes, decisions, and next steps, accompanied by a high-quality video recording of the session."

    Figure: Good example - Provides a comprehensive and clear record that is useful for all stakeholders

    By adopting these practices, teams can ensure that the outcomes of Sprint Reviews are effectively communicated and documented, supporting project success and stakeholder satisfaction.

  27. Do you have a standard menu item "Check for Updates"?

    A standard menu item "Check for Updates" should be available in the Help menu. Its function is running SSW Diagnostics to check updates and keep the system up to date easily. Do you allow users to check for a new version easily?

    Figure: "Check for Updates" menu item

    Here's the code to run Diagnostics:

    System.Diagnostics.Process.Start("http://us.ssw.com.au/ssw/diagnostics/download/SSWDiagnostics.application#SSWDiagnostics.application");
  28. GitHub - Do you use GitHub teams for collaborator permissions?

    You can use teams within a repository to manage a whole group's permissions instead of setting permissions for each new member of the organisation.

    See Organizing members into teams.

    GoodExampleUsingTeams
    Figure: Good example - Using a good teams structure to organize access

    Correctly configuring your organisation's teams structure will make it easy to give members the permissions level that they need. You can add teams to repositories to manage their roles.

    TeamsOnRepo
    Figure: Good example - Using teams to assign roles in a repository

    Another benefit of using teams is that you can mention a whole team in a discussion instead of individual members. See Mentioning people and teams

    Use teams as maintainers over individuals

    When you add a team to a repository, you can give the team a role that determines their access level to the repository. You can also add teams to issues and pull requests to manage their access to those resources. Often individuals are added to repositories as administrators, but this is not a good idea as it gives them destructive access to the repository. Instead, add a team to the repository and give the team the maintainer role.

    individuals added as admins
    Figure: Bad example - Individuals should not have Admin access to a repository

    teams added as maintainers
    Figure: Good example - Teams should have Maintainer access to a repository

  29. Do you use source control for your Power Apps?

    Source control is essential for any software development project, and Microsoft Power Apps solutions are no exception. Here are some reasons why you would want to use source control like GitHub or Azure DevOps for your Power Apps projects:

    • Versioning - Keep track of changes made to your Power Apps solutions over time.
    • Collaboration - Enable multiple developers to work on the same Power Apps project simultaneously.
    • Audit Trail - Maintain a history of who made what changes and when.
    • Rollback - Easily revert to a previous version if something goes wrong.
    • Branching and Merging - Work on new features or bug fixes in isolation before integrating them into the main project.
    • Automated Deployment - Integrate with CI/CD pipelines for automated testing and deployment.

    How to Implement Source Control

    Exporting Power Apps Solution

    1. Open Power Platform CLI: Open a terminal and navigate to your project directory.
    2. Export Solution: Use the Power Platform CLI to export your Power Apps solution. This will create a .zip file or a directory structure that represents your solution.

      pac solution export --path ./YourSolutionName --name YourSolutionName

    Using GitHub

    1. Initialize a Git Repository: Navigate to your project directory and run git init.

      git init
    2. Add Remote Repository: Add GitHub as the remote repository.

      git remote add origin <Your-GitHub-Repository-URL>
    3. Commit and Push: Add your Power Apps exported solution files to the Git repository, commit them, and push to GitHub.

      git add .
      git commit -m "Initial commit"
      git push -u origin master

    Using Azure DevOps

    1. Create a New Repository: In Azure DevOps, create a new Git repository under your project.
    2. Clone the Repository: Clone the repository to your local machine.

      git clone <Your-Azure-DevOps-Repository-URL>
    3. Commit and Push: Add your Power Apps exported solution files to the Git repository, commit them, and push to Azure DevOps.

      git add .
      git commit -m "Initial commit"
      git push -u origin master

    Importing Power Apps Solution

    1. Open Power Platform CLI: Open a terminal and navigate to the directory where your exported solution is stored.
    2. Import Solution: Use the Power Platform CLI to import the solution into another environment.

      pac solution import --path ./YourSolutionName --name YourSolutionName

    By following these steps, you can implement source control for your Power Apps solutions using either GitHub or Azure DevOps. This will help you manage your project more effectively, collaborate with others, and maintain a history of your changes.

  30. Do you use "var"?

    TODO: Byrden - needs a new home (category) and a complete rewrite
    Old content from Better LINQ on .ASPX pasted below

            

    Despite what it looks like, the var keyword is not a throwback to the dark ages where we did not have strongly typed variables. It is just a short hand to save developers from typing out the type of a variable.

    IQueryable<Customers> results =
        from c in dbContext.Customers
        where c.CompanyName.StartsWith(companyNameTextbox.Text)
        select c;
    customersBindingSource.DataSource = results;

    Figure: Bad example - You should just use "var" instead of "IQueryable"

    var results =
        from c in dbContext.Customers
        where c.CompanyName.StartsWith(companyNameTextbox.Text)
        select c;
    customersBindingSource.DataSource = results;

    Figure: Good example - Using "var" to save few keystrokes

  31. Do you know what a container is?

    The main benefits about containers is that it can reduce your running and maintanence costs; and hear no more it worked on my machine...

    A container is like a little virtual machine that does not have a operating system installed. They already contains all the libraries that your web application needs.

    Video: What you need to know about Containers (in under 3 minutes!)

    Related keywords: Docker, AKS, Kubernetes, Container Orchestration.

  32. Do you use Word Documents instead of Wiki Pages in SharePoint?

    In the past, Wiki pages were a great way to store content in SharePoint. These days, with advancements in browser and smartphone capabilities, Word Documents are a better place to store content.

    Many articles, like this one from 2017, talk about the benefits of using Wiki Pages over Word Documents - however, these benefits are no longer relevant.

    word 2013 online presentation
    Figure: We've come a long way since Word 2013 Online Presentation

    Let's have a quick look at some of the points that the article above used:

    Accuracy - It's easy to see the Modified date of documents in SharePoint, so you can tell if the Document is the most current one (of course, it should be the only one).

    Load Time - In the past, this was an issue. These days, browsers have no problem loading Word Documents.

    Mobile - Mobile browsers also do a pretty good job of opening Word Documents, and there are the Office and OneDrive apps to make it even easier.

    Note: If you want to create an actual Wiki within SharePoint, Modern Pages may be the way to go - but for general content, Word Documents are best.

    Advantages of Word Documents

    1. One main advantage of Word Documents is the editing capabilities – most people are familiar with the rich document editing features of Word. Documents can be created in the desktop app as it has the most editing capabilities, and can be easily edited in the web version - which is still very good! The SharePoint wiki page editor has fewer features, and can be harder to use.

    sharepoint editor
    Limited SharePoint formatting

    microsoft ribbon
    Microsoft Word's well-known, feature rich formatting options

    1. Versioning is one of SharePoint's strongest features - and it works really well with Word Documents.
    2. Many people are using Microsoft Teams, and storing files in there - sometimes not using SharePoint at all. While Teams still uses SharePoint in the backend, it is much easier to browse through Documents than link and view Wiki Pages.

    teams browsing files
    Figure: Browsing files in Teams

    1. OneDrive allows you to sync files from SharePoint libraries to your computer. This is very useful if you need offline access, or if users prefer to work from files within File Explorer in Windows, or Finder on macOS. This works really well with Word Documents, but is not possible with wiki pages.
We open source. Powered by GitHub