Hi!
I’m in for a random coffee chat ☕
Location: UK
Availability: 8:00 - 14:00 GMT/UTC most days. 
Happy to chat about: Getting to know others, IRIS development,  Fantasy/Sci-Fi books, or board games. 

Nick Hershberger · Dec 15, 2025 go to post

Just lights for now. Ornaments will go on when my oldest gets home from university this week.

Nick Hershberger · Oct 7, 2025 go to post

I have been working on this same thing recently and kept running into the same problem. If you are still having issues, set the MechanismList property of the %Net.Authenticator instance to XOAUTH2 to limit the SASL authentication types the Start method of the authenticator instance looks for when it gets an AUTH response from the SMTP server.

set smtp = ##class(%Net.SMTP).%New()
    set auth = ##class(%Net.Authenticator).%New()
    set auth.ServiceName = "smtp"set auth.UserName = "frodob@theshire.onmicrosoft.com"set auth.MechanismList = "XOAUTH2"set auth.AccessToken = accessToken
    set smtp.authenticator=auth
Nick Hershberger · Sep 19, 2022 go to post
ClassMethod Opposite(s1 As %String = "", s2 As %String = "") As %Boolean
{
    write s1_", "_s2_" --> "
    if (($l(s1) '= $l(s2)) || (s1 = "") || (s1'?.1A.A) || (s2'?.1A.A)) { return 0 }
    for cnt=1:1:$l(s1) {
        if (($zabs($a($e(s1,cnt)) - $a($e(s2,cnt))) '= 32)) { return 0 }
    }
    return 1
}
Nick Hershberger · Jul 20, 2022 go to post

You can use the Create method of the Security.Users class to do that. Bear in mind that class is in %SYS. Documentation for Create is here: Security.Users.

set$nameSpace = "%SYS"if '##class(Security.Users).Exists("testuser") {
    // Set propertiesset props("Enabled")=1set props("Name")=testuser
    set props("FullName")="Test User"set props("SuperUser")=0set props("NameSpace")="USER"set props("Roles")="%Developer,%Operator,TestRole"set props("Password")=userpassword
    set props("PasswordNeverExpires")=0set props("ChangePassword")=0set props("Routine")=""set props("ExpirationDate")=""set props("Flags")=1set props("EmailAddress")=""set status=##class(Security.Users).Create(user, .props)
    if$$$ISERR(status) {
        do$system.Status.DecomposeStatus(status, .err)
    }
}
Nick Hershberger · May 19, 2022 go to post

We have used Datadog to produce some customer facing dashboards that provide an quick view of general server/application health as well as current license usage, number of Cache process, etc. Additional internal only dashboards allow customer support staff that don't have access to the mgmt portal to identify problematic queries, users with high latency, and other application specific issues which they can then research further if necessary. This is done via a %CSP.Page class that is is configured as the URL in the Datadog configuration. Documentation for that Datadog configuration is here.

Nick Hershberger · Apr 14, 2022 go to post

In COS create an instance of the License class and run the GetSample method to fetch the current license info. You can then reference the properties directly.

set ans = ##class(%Monitor.System.License).%New()
set sc = ans.GetSample()
write ans.AvailableDist
Nick Hershberger · Mar 10, 2022 go to post

There's documentation and examples for searching using JRNDUMP here. Using SELECT^JRNDUMP is very handy to find a specific address(es) which you can then jump straight to in the Management Portal to get a view of what else was going on around that particular entry.

Nick Hershberger · Jan 31, 2022 go to post

Kevin,

Those appear to be application specific globals. I would suggest reaching out to the support team for the application to request additional information on what those globals are used for.