Recent Discussions
The Diagonal Suite: Gentle thunking goes a long way!
I've become a big advocate for gentle thunking - using thunks to delay eager evaluation wherever possible in generalized Lambda development. The timings are quicker and the logic is cleaner. On the other hand, thunking the results of MAP, BYROW, or BYCOL - especially when it leads to rows of thunks - tends to introduce recombination overhead and complexity. I think thunking is often dismissed as “too complex,” and that’s understandable if someone’s first exposure involves unwrapping a row of thunks. When used gently thunking becomes indispensable. Typically, I introduce the thunks after the initial benchmarking to see the difference in the calculation times and the after is always quicker. To illustrate, I’ll share The Diagonal Suite - a collection of functions where thunking is used at every opportunity. Simple, clean, deferred logic. What are your thoughts on gentle thunking? Where have you found it helpful/harmful in your own Lambda development? //The Diagonal Suite - Version 1.0 - 10/27/2025 //Author: Patrick H. //Description: Directional traversal and diagonal logic for 2D arrays. // Functions: // • Traverseλ - Directional traversal engine // • ByDiagλ - Diagonal-based aggregation // • DiagMapλ - Wrapper for diagonal matrix extraction // • DiagIndexλ - Targeted diagonal extraction // • Staircaseλ - Construct diagonal staircases from a vector or 2D array //──────────────────────────────────────────────────────────── //------------------------------------------------------------------------------------------- //Traverseλ - Directional Axis Remapper //------------------------------------------------------------------------------------------- //The selected axis is remapped to the top-left traversal order. //Accepted directions: // "NE" or 1 → Northeast (↗) // "SE" or 2 → Southeast (↘) // "SW" or 3 → Southwest (↙) //Parameters: //array → 2D input array (scalars not accepted) //new_axis → Axis direction ("NE", "SE", "SW" or 1–3) Traverseλ = LAMBDA( array, new_axis, //Input validation IF(OR(ROWS(array)=1,COLUMNS(array)=1), "#2D-ARRAY!", IF(AND(ISNUMBER(new_axis),OR(new_axis<=0,new_axis>3)),"#AXIS!", LET( //Dimensions i, ROWS(array), j, COLUMNS(array), //Axis traversal indices (deferred) x_NE, LAMBDA(SEQUENCE(j,,1,0)*SEQUENCE(,i)), y_NE, LAMBDA(SEQUENCE(j,,j,-1)*SEQUENCE(,i,1,0)), x_SE, LAMBDA(SEQUENCE(i,,i,-1)*SEQUENCE(,j,1,0)), y_SE, LAMBDA(SEQUENCE(i,,j,0)+SEQUENCE(,j,0,-1)), x_SW, LAMBDA(SEQUENCE(j,,i,0)+SEQUENCE(,i,0,-1)), y_SW, LAMBDA(SEQUENCE(j,,1)*SEQUENCE(,i,1,0)), //Axis mode selection mode, IF(ISNUMBER(new_axis),new_axis, SWITCH(new_axis,"NE",1,"SE",2,"SW",3,1)), //Index selection x, CHOOSE(mode,x_NE,x_SE,x_SW), y, CHOOSE(mode,y_NE,y_SE,y_SW), //Unwrap indices and get results result, INDEX(array,x(),y()), result ) ))); //------------------------------------------------------------------------------------------- //ByDiagλ - Diagonal-based aggregation //------------------------------------------------------------------------------------------- //Apply an ETA function or Lambda to diagonals //Parameters: //array → 2D input array (scalars not accepted) //[function] → ETA function or Lambda applied to diagonals //[row_wise_stack?] → Optional: Display results as a vertical stack ByDiagλ = LAMBDA( array, [function], [row_wise_stack?], //Check array input ValidateDiagλ(array,,function,row_wise_stack?, LET( //Optional parameters No_Function, ISOMITTED(function), No_row_wise_stack,ISOMITTED(row_wise_stack?), //Dimensions i, ROWS(array), j, COLUMNS(array), //Diagonal count k, MIN(i,j), //Indices - deferred r, LAMBDA(SEQUENCE(k)*SEQUENCE(,j,1,0)), y, LAMBDA(SEQUENCE(k)+SEQUENCE(,j,0,1)), c, LAMBDA(IF(y()>j,NA(),y())), //Unwrap indices, shape, and aggregate result, IFNA(INDEX(array,r(),c()),""), shaped, IF(No_row_wise_stack,result,TRANSPOSE(result)), final, IF(No_Function,shaped, IF(No_row_wise_stack,BYCOL(shaped,function), BYROW(shaped,function))), final ))); //------------------------------------------------------------------------------------------- //DiagMapλ - Wrapper (Calls ByDiagλ) to extract diagonals as 2D matrix //------------------------------------------------------------------------------------------- //Calls ByDiagλ to extract the diagonals from a 2D array. //Parameters: *Please see ByDiagλ for descriptions.** DiagMapλ = LAMBDA( array, [row_wise_stack?], ByDiagλ(array,,row_wise_stack?) ); //------------------------------------------------------------------------------------------- //DiagIndexλ - Targeted diagonal extraction //------------------------------------------------------------------------------------------- //Extract a diagonal or anti-diagonal vector from a 2D array. //Parameters: //array → 2D input array (scalars not accepted) //col_index → Column number to start from. Negative = anti-diagonal DiagIndexλ = LAMBDA( array, col_index, //Input checks ValidateDiagλ(array,col_index,,, LET( //Dimensions i, ROWS(array), j, COLUMNS(array), //Diagonal direction: +1 = SE, –1 = SW s, SIGN(col_index), //Determine diagonal length based on bounds k, IF(s>0, MIN(i, j + 1 - col_index), MIN(i, ABS(col_index))), start, IF(s<0,ABS(col_index),col_index), //Indices - deferred x, LAMBDA(SEQUENCE(k)), y, LAMBDA(SEQUENCE(k,,start,s)), //Unwrap indices and extract vector deliver, INDEX(array,x(),y()), deliver ))); //------------------------------------------------------------------------------------------- //Staircaseλ — Construct diagonal staircases from a vector or 2D array //------------------------------------------------------------------------------------------- //Parameters: //array → Input array (flattened to vector row-wise) //block_size → Number of rows/columns per staircase block //[block_offset] → Optional padding between staircases //[IsHorizontal?] → Optional toggle for column-wise orientation //[IsAntiDiag?] → Optional toggle to display staircase anti-diagonal. Staircaseλ = LAMBDA( array, block_size, [block_offset], [IsHorizontal?], [IsAntiDiag?], //Check inputs ValidateStaircaseλ(array,block_size,block_offset, LET( //Check optional parameters no_Block_Offset, ISOMITTED(block_offset), zero_Offset, block_offset=0, col_offset, IF(No_Block_Offset,0,block_offset), IsVertical?, ISOMITTED(IsHorizontal?), Not_Anti_Diag, ISOMITTED(IsAntiDiag?), //Convert to vector and get dimensions flat, TOCOL(array), k, COUNTA(flat), seq, LAMBDA(SEQUENCE(k)), V, TOROW(EXPAND(WRAPROWS(seq(),block_size),, block_size+block_offset,0)), width, COLUMNS(V), //Anchors and indices - deferred i, LAMBDA(SEQUENCE(block_size)*SEQUENCE(,width,1,0)), col_arr, LAMBDA(IF(Not_Anti_Diag,SEQUENCE(,width), SEQUENCE(,width,width,-1))), j, LAMBDA(MOD(col_arr(),block_size+block_offset)), j_, LAMBDA(IF((no_Block_Offset)+(zero_Offset), IF(j()=0,block_size,j()),j())), idx, LAMBDA(IF(i()=j_(),V,NA())), //Obtain results, shape, and calculate result, DROP(IFNA(INDEX(flat,idx()),""),,-col_offset), final, IF(IsVertical?,TRANSPOSE(result),result), final ))); //---------------------Error Handling & Validation--------------------------- //Validates inputs for Staircaseλ. Please see Staircaseλ for parameter //descriptions. ValidateStaircaseλ = LAMBDA( array, block_size, [block_offset], [on_valid], LET( //Checks NotArray,TYPE(array)<>64, Invalid_block_size, OR(ISTEXT(block_size),block_size<=0,block_size>COUNTA(array)), Invalid_block_offset, OR(ISTEXT(block_offset),block_offset<0), //Logic gate IF(NotArray, "#NOT-ARRAY!", IF(Invalid_block_size, "#BLOCK-SIZE!", IF(Invalid_block_offset,"#BLOCK-OFFSET", on_valid)))) ); //---------------------Error Handling & Validation--------------------------- //Validate inputs for ByDiagλ, DiagMapλ, and DiagIndexλ. //*Please see those functions for parameter descriptions.* ValidateDiagλ= LAMBDA( array, [col_index], [function], [row_wise_stack?], [on_valid], LET( //---Checks--- //Array input IsArray?, TYPE(array)=64, Not_Array, NOT(IsArray?), //Col_index No_Col_Index, ISOMITTED(col_index), Col_Index_Included, NOT(No_Col_Index), Not_Valid_Col_Index?, NOT(AND(col_index<>0, ABS(col_index)<=COLUMNS(array))), //Function No_Function, ISOMITTED(function), Function_Included, NOT(No_Function), Invalid_Function?, AND(ISERROR(BYROW({1,1},function))), //Shaping input RowWiseStack?, NOT(ISOMITTED(row_wise_stack?)), //Deterine which function is being validated DiagIndex, Col_Index_Included, ByDiag, AND(No_Col_Index, Function_Included), DiagMap, AND(No_Col_Index, No_Function), //Logic gates //DiagIndexλ a, IF(Not_Array, "#NOT-ARRAY!", IF(Not_Valid_Col_Index?,"#COLUMN-INDEX!", on_valid)), //ByDiagλ b, IF(Not_Array, "#NOT-ARRAY!", IF(Invalid_Function?, "#FUNCTION!", on_valid)), //DiagMapλ c, IF(Not_Array, "#NOT-ARRAY!", on_valid), //Logic gate selection decide, IF(DiagIndex,a, IF(DiagMap,c, IF(ByDiag,b, "#UNROUTED!"))), decide )); //End of The Diagonal Suite - Version 1.0 //Author: Patrick H.8Views0likes0CommentsModernizing Sensitivity Label Grouping for App Display
Microsoft announced the modernization of grouping for sensitivity labels to a new “dynamic architecture.” It doesn’t take much to be more dynamic than the previous parent-child arrangement. Even if the announcement is a tad overhyped, it’s still goodness because administrators can now move labels between label groups in a way that wasn’t possible before. The new way of displaying labels should be everywhere in December 2025. https://office365itpros.com/2025/10/29/sensitivity-labels-groups/16Views1like0CommentsUnified Company Calendar for Mixed Microsoft 365 and Non-365 Users – 2025
Seeking a Shared Calendar Solution for Mixed Microsoft 365 and Non-365 Users I’m working on a solution to create a shared company calendar that everyone in our organization can view, while keeping editing permissions limited to a few selected individuals. The challenge: Some of our team members do not use Microsoft 365, and I’d like them to still be able to subscribe to or view the calendar and receive updates. Ideally, this should work without requiring full Microsoft accounts. I initially considered using an ICS-based calendar, but it seems Microsoft 365 Group calendars don’t support sharing via ICS links. I also explored creating a Group calendar as suggested in other threads, but ran into issues making it accessible to external users or those without 365 accounts. For context, I’m a Global Admin, so I have full access to configure settings in the Microsoft 365 Admin Center and Exchange if needed. We’re a small business, and our main goal is to have a centralized calendar for vacation schedules and company-wide events. It should be simple to access and maintain, with a focus on collaboration and accessibility across the board. What I’m looking for: A calendar that’s viewable by all, including non-M365 users Editable only by a few delegated team members Compatible with Microsoft 365, but not dependent on it for basic access Any tools, workarounds, or best practices that have worked for others in similar hybrid environments4Views0likes0CommentsSolver in Excel - Variable Limitation
Hi All, I built a model in Excel to solve 1d Cutlist optimization, model works great and gives optimal results But when there is complex cutting patterns that results in more than 250 cutting combinations model totally fails fails due to the limitation of solver to handle more than 250 variables with integer constraints. using simplex LP, I created model years ago but unable to use it Hoping Microsoft has this in the list to fix this limitation in coming versions ?9Views0likes0CommentsWhy Outlook Locks You Out After Deleting Thousands of Emails — And How to Fix It Fast
We’ve all been there — your Outlook or Hotmail inbox is overflowing with thousands of old messages, and you decide to clean house. You select all, hit delete, and feel relieved… until you try to open your mailbox again and get hit with a dreaded message: “We’ve temporarily limited your account.” Welcome to the world of Outlook throttling — Microsoft’s way of protecting its servers (and your account) from overload or suspicious activity. But don’t worry, it’s usually temporary and easy to fix. https://dellenny.com/why-outlook-locks-you-out-after-deleting-thousands-of-emails-and-how-to-fix-it-fast/21Views0likes0CommentsData Residency and Compliance in the Microsoft Cloud with Microsoft 365
In today’s globally connected world, organisations face growing pressure to ensure data is stored, managed, and protected in accordance with national borders and data-sovereignty laws. For users of Microsoft 365 and the wider Microsoft Cloud, understanding data residency and compliance is essential to maintaining trust and meeting legal obligations. https://dellenny.com/data-residency-and-compliance-in-the-microsoft-cloud-microsoft-365-governance-guide/14Views0likes0CommentsHow Cloud Computing Improves Business Agility and the Role of Microsoft 365
In today’s fast-moving business world, agility isn’t just a nice-to-have—it’s essential. The ability to respond quickly to market changes, launch new offerings, support remote or hybrid work, and scale resources up or down can define success. One of the foundational enablers of that agility is cloud computing. Further, productivity and collaboration platforms such as Microsoft 365 (M365) help turn those capabilities into everyday business reality. Here’s how cloud computing boosts agility, and how Microsoft 365 fits into the picture. https://dellenny.com/how-cloud-computing-improves-business-agility-and-the-role-of-microsoft-365/8Views0likes0CommentsPartner Intune reporting questions
I need some help for my global partner- SHI International. We have a monthly services modernization briefing with the SHI M365 practice team. They have a need around 1-2 Q&A deep-dive sessions where their team of M365 experts want to ask some in=depth technical and pre-sales related questions related to Intune Reporting Challenges and Customer Pain Points, Current Intune Reporting Limitations, Technical Barriers to Reporting, Permissions and Consent Model Confusion, Feedback on Documentation and User Experience. Appreciate any guidance on a PSA SME on this topic or a global black belt, that would be great. Appreciate if you can point me to the latest updated documentation on this topic. I reached out to several folks in the PSA team with no luck yet. Thanks!10Views0likes0CommentsRequest: Please Professionally Enhance My Gantt Chart Template
Hi everyone, I’ve created a basic Excel Gantt chart template for suppliers to use when discussing project timelines with landowners. The chart lists tasks on the left and shows the duration of works by month from October 2025 to April 2026. My Excel skills are quite basic, so I’d really appreciate if someone could directly improve the template for me. Specifically, I’m looking for: A more professional and visually appealing layout Clearer formatting for tasks and timelines Automatic highlighting of active months for each task Conditional formatting to make the chart easier to read Any other practical enhancements that would make it more effective for supplier discussionshttps://docs.google.com/spreadsheets/d/1SdPU8HEsHDjOHljwYsPnRmRHHNrJ5Whq/edit?usp=drivesdk&ouid=104511246399228274463&rtpof=true&sd=true This is only a template and contains no sensitive data. I’ve attached the file—please feel free to make changes directly to the chart. Thank you very much for your help!9Views0likes0CommentsMicrosoft 365 vs Azure vs Dynamics 365 – What’s the Difference?
In today’s cloud-driven business environment, it’s common to hear about Microsoft’s cloud offerings—Microsoft 365, Azure, and Dynamics 365. While they’re all part of the Microsoft ecosystem, each serves different purposes. Understanding the differences can help you choose the right tool (or mix of tools) for your organisation. https://dellenny.com/microsoft-365-vs-azure-vs-dynamics-365-whats-the-difference/22Views0likes0CommentsCloud Benefits Simplified Scalability, High Availability, and Disaster Recovery
Cloud computing has transformed the way businesses manage their IT infrastructure. Whether you’re a startup or an enterprise, the cloud delivers agility, efficiency, and resilience that traditional on-premises setups can’t match. In this post, we’ll break down three of the most important benefits of cloud technology—scalability, high availability, and disaster recovery—in simple terms. https://dellenny.com/cloud-benefits-simplified-scalability-high-availability-and-disaster-recovery/15Views1like0CommentsImport data from a Microsoft Forms PDF into Excel
Hi all. I have a number of PDFs for clients which contain questionnaires, score sheets, etc. Some are completely external, and some are from Microsoft Forms. A while back, I created a Macro/some VBA code to read data from the external PDFs, import it into Excel and display the figures; it works really well. Today, I've tried to update it to load data from the PDFs created by "printing" a Microsoft Forms complete questionnaire and saving as a PDF - unfortunately, when trying to import this into Excel (using "Get Data -> From File -> PDF"), the "Likert" questions are appearing but showing "null" for all the columns, not identifying which contains the "selected" checkbox. Possibly a slim hope, but I was wondering if anyone has experience doing something similar, or can recommend a way to get this to work? I know there are potentially other ways to approach this (I tried connecting it directly to the linked Sharepoint Excel file, but the URL is entirely powered by URL arguments ?foo=bar&baz=boing etc, and Excel demands those all be deleted when giving it a filename to connect to to get data from the web, helpfully); connecting it to a "local" version of the Excel file on OneDrive is a possibility, but ideally I'd a) want the tool to be accessible to people who have access to the PDFs but not the spreadsheet, and b) have to save the print-out PDFs in every client folder to store their data together, and the spreadsheet may occasionally be purged, so the PDF is the "safe" way to access the data.) PDFs can't be run through any online tools due to containing sensitive data. Many thanks.5Views0likes0CommentsTrouble Setting Up Computer
Here's my dilemma: I'm setting up a new computer. Updates download and install just fine. I'm clicking through the pages, country, keyboard, etc. I get to to the one that wants you to set up your Microsoft account. I enter my email, then request a code, then enter the code. I get a page saying that since I didn't use a password that I need to create a PIN. I click on the Create PIN button and get a page that just spins and spins and spins and spins. I get someone on the tech support chat. We do the whole hold-the-power-button-for-5-seconds thing. The setup starts over. This time I request a password after I enter my email. I get sent to the same page saying that since I didn't use a password I needed to create a PIN. I click on the Create PIN button and get the page that perpetually spins. It never goes to the page to create a PIN. I wait for a while, like minutes, like unusually long for a page to load. I the routine several more times. Same result. I create a new account, use a new email address, new password, same thing. Internet connection is stable. Same behavior on a different Internet connection. The Create PIN page is not working. Also, one should not be required to sign in or create an account to set up a computer. There is no way to skip it. Moreover, the program sends you to the "since you didn't enter a password" page whether you entered a password or not. Additionally, I already a PIN, I'm being asked to create things that should already be associated with my account, it found my email and password, why not my PIN? I'm just trying to set up this Lenovo. Thoughts?6Views0likes0CommentsMigrating from Outlook.com to Microsoft 365 Business Basic
I am currently testing Microsoft 365 Business Basic. My users mail boxes are all on Outlook.com. I need those mailboxes migrated to Microsoft 365 Business Basic. This seems impossible as PST files are not supported by that subscription and IMAP is not supportes either. What are the right way to migrate users mail boxes from Outlook.com to Microsoft 365 Business Basic?1View0likes0CommentsLeveraging SharePoint for Performance Tracking Monitoring Team and Project Progress
SharePoint is more than a document management system; it’s a comprehensive platform that facilitates real-time tracking and collaboration. Here’s why it excels in performance tracking: https://dellenny.com/leveraging-sharepoint-for-performance-tracking-monitoring-team-and-project-progress/23Views0likes0CommentsAllowing Users to Add Enterprise Apps to Entra ID is a Bad Idea
Enterprise apps can come from a variety of sources. Most are Microsoft 1st party apps, and the rest are ISV apps. It’s easy to add an app without really intending to, which is a good reason to force users through the Entra ID app consent workflow when they want to add an app. Unhappily, I failed the test and added an app in a moment of weakness. Here’s what happened. https://office365itpros.com/2025/10/24/enterprise-apps-my-mistake/29Views0likes0CommentsUpdating the Entra ID Password Protection Policy with the Microsoft Graph PowerShell SDK
The Entra ID password protection policy contains settings that affect how tenants deal with passwords. Entra ID includes a default policy that doesn’t require additional licenses. Creating a custom password protection policy requires tenant users to have Entra P1 licenses. As explained in this article, once the licensing issue is solved, it’s easy to update the policy settings with PowerShell. https://office365itpros.com/2025/10/23/password-protection-policy-ps/16Views0likes0CommentsImportant Change Coming for Entra ID Passkeys in November 2025
Entra ID is about to introduce passkey profiles, a more granular approach to passkey settings. The change is good, but you might like to check the current passkey settings to make sure that the values inherited by the new default passkey profile behave the way that you want. In particular, check attestation enforcement to make sure that the right kind of passkeys are used. https://office365itpros.com/2025/10/22/passkey-setting-policy/52Views0likes0CommentsPractical Graph: Creating a Multi-Workload User Activity Report
Microsoft 365 comes will many usage report APIs covering different workloads. This article explains how to use PowerShell to extract usage data for multiple workloads to combine together to create a holistic view of user account activity within a Microsoft 365 tenant. https://practical365.com/holistic-usage-report/20Views0likes0Comments
Events
Recent Blogs
- Your favorite Microsoft 365 apps now feature Liquid Glass styling and a new search experience for templates.Oct 29, 2025105Views0likes0Comments
- 3 MIN READThis month, we explore why metadata unlocks smarter responses from Copilot and agents, and how Knowledge Agent in SharePoint can streamline the process of adding metadata to files.Oct 29, 202594Views0likes0Comments