Eduard Lebedyuk · Mar 9, 2020 go to post

Invoke is the way to go.

ClassMethod CreateWebApp(pVars, pLogLevel, tInstaller) As %Status
{
    Set Namespace=tInstaller.Evaluate("${Namespace}")
    Do tInstaller.PushNS("%SYS")
    Do ##class(Security.System).GetInstallationSecuritySetting(.security)
    If (security="None") {
        Set cspProperties("AutheEnabled") = $$$AutheUnauthenticated
    } Else {
        Set cspProperties("AutheEnabled") = $$$AutheCache // Password
    }
    Set cspProperties("NameSpace") = Namespace
    Set cspProperties("IsNameSpaceDefault") = $$$YES
    Set cspProperties("DispatchClass") = "MDX2JSON.REST"
        Set cspProperties("UseCookies") = $$$YES
    Set tSC = ##class(Security.Applications).Create("/"_Namespace, .cspProperties)
    Do tInstaller.PopNS()
    If $$$ISERR(tSC) Throw ##class(%Installer.Exception).CreateFromStatus(tSC)
    Quit $$$OK
}

And invoke with

<RunInstall Class="MDX2JSON.Installer" Method="CreateWebApp"/>
Eduard Lebedyuk · Mar 6, 2020 go to post

Thank you, Marc!

With Kitty there's even a Put Window on Foreground option:

I've tested with

h 10 w $c(7) 

and it works!

Is there anything similar for cterm/iristerm?

Eduard Lebedyuk · Mar 6, 2020 go to post

IRISList is a wrapper over InterSystems IRIS $lb structure, and it supports these value types: Int16, Int32, Int64, bool, Single, Double, string, byte[], IRISList.

To be more specific the following datatypes are available.

  • ISO/IEC 8859{1 string. The remainder of the $LIST element is a string of ISO/IEC 8859-1 characters.
  • UNICODE string. The remainder of the $LIST element is a string of UNICODE characters in UTF-16 little endian format.
  • Positive integer. The remainder of the $LIST element is an unsigned integer in little endian order with high order zero octet truncated.
  • Negative integer. The remainder of the $LIST element is a negative integer in twos complement little endian order with high order #FF octet truncated.
  • Positive radix 10 number. The next octet is a signed char that serves as an exponent. That is followed by an unsigned integer in little endian order with high order zero octet truncated. The value of the number is integer × 10exponent.
  • Negative radix 10 number. The next octet is a signed char that serves as an exponent. That is followed by a negative integer in twos complement little endian order with high order #FF octet truncated. The value of the number is integer × 10exponent.
  • IEEE floating point number. Length must allow for either 4 or 8 (preferred) octet of data.

In C# Decimal can be constructed from {Int32, Int32, Int32, Boolean, Byte} and you can use GetBits method to retrieve these parts from Decimal   (docs).

Eduard Lebedyuk · Mar 6, 2020 go to post

Depends on the project I guess.

Trivial fixes can be sent via pulls directly.

Bigger fixes usually require time to fix so some discussion can help.

That said, opening empty pull and talking there also works.

Eduard Lebedyuk · Mar 5, 2020 go to post

In most cases just process special variable should be enough:

Set SourceConfigName = process.%PrimaryRequestHeader.SourceConfigName  
Eduard Lebedyuk · Mar 4, 2020 go to post

Great article, Mark!

I have a few notes and questions:

1. Here's a brief comparison of different storage categories:

  • Intel® Optane™ DC Persistent Memory has read throughput of 6.8 GB/s and write throughput 1.85 GB/s (source).
  • Intel® Optane™ SSD has read throughput of 2.5 GB/s and write throughput of 2.2 GB/s at (source).
  • Modern DDR4 RAM has read throughput of ~25 GB/s.

While I certainly see the appeal of DC Persistent Memory if we need more memory than RAM can provide, is it useful on smaller scale? Say I have a few hundred gigabytes of indices I need to keep in global buffer and be able to read-access fast. Would plain DDR4 RAM be better? Costs seem comparable and read throughput of 25 Gb/s seems considerably better.

2. What RAM was used in a Server #1 configuration?

3. Why are there different CPUs between servers?

4. Workload link does not work.

Eduard Lebedyuk · Feb 28, 2020 go to post

I'd recommend:

  1. Write LoadStream method with the same signature which logs all passed arguments.
  2. Call it from .Net
  3. Check what's actually gets passed inside.
Eduard Lebedyuk · Feb 28, 2020 go to post

Use byte[] to pass streams. So:

byte[] bytes = Encoding.Default.GetBytes(txt);
...
var parameter = new object[]
        {
            bytes,
            qspec,  
            errorlog,
            loadedItems
        };
Eduard Lebedyuk · Feb 27, 2020 go to post

That's a fairly recent version of Python. Not sure if old Python Binding works with it. I can recommend you to:

Eduard Lebedyuk · Feb 27, 2020 go to post

As to Supported Server Platforms, it might be even Ubuntu 18.04 LTS for x86-64 rather than 16.04.  

Question was about Ensemble initially which supports 16.04. InterSystems IRIS Supports 18.04.

And what about RHEL 8? Which IRIS version will be supported under this OS?  

Asking @Andreas Dieckow to comment.

Eduard Lebedyuk · Feb 27, 2020 go to post

Any exceptions on stack?

import sys, traceback
traceback.format_exception(sys.last_type, sys.last_value, sys.last_traceback)

Can you run SELECT 1 query?

Eduard Lebedyuk · Feb 26, 2020 go to post

To answer that, before query is compiled all arguments are parametrized:

like 'text%'

becomes

like ?

so we can't really replace LIKE with %STARTSWITH on code generation step (there's a brackets argument specification I suppose).

Eduard Lebedyuk · Feb 25, 2020 go to post

Properties inherited from % classes and properties starting with %% are skipped in DTL.

Multidimensional properties are skipped in DTL.

Found official (but experimental - use at your own risk) way.

Your class should extend Ens.GenericObject and implement %EnumerateProperties method.

Documentation.

Eduard Lebedyuk · Feb 25, 2020 go to post

Share a code sample please?

One other thing: both methods should be either methods or classmethods.

Eduard Lebedyuk · Feb 24, 2020 go to post

Sure, you can access it as:

process.AlertGroups

process is a special variable, holding the current instance of the BPL process.

Eduard Lebedyuk · Feb 23, 2020 go to post

Load method writes to the current device which is a big no in the Native API ecosystem. Add flags to suppress all output:

var qspec = "/displaylog=0 /displayerror=0";